0
Files
src/content/web_test/renderer/test_plugin.h
Avi Drissman 4e1b7bc33d Update copyright headers in content/
The methodology used to generate this CL is documented in
https://crbug.com/1098010#c34.

No-Try: true
No-Presubmit: true
Bug: 1098010
Change-Id: I8c0f009d16350271f07d8e5e561085822cc9dd27
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3895935
Owners-Override: Avi Drissman <avi@chromium.org>
Reviewed-by: Mark Mentovai <mark@chromium.org>
Commit-Queue: Mark Mentovai <mark@chromium.org>
Auto-Submit: Avi Drissman <avi@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1047456}
2022-09-15 14:03:50 +00:00

204 lines
7.0 KiB
C++

// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_WEB_TEST_RENDERER_TEST_PLUGIN_H_
#define CONTENT_WEB_TEST_RENDERER_TEST_PLUGIN_H_
#include <memory>
#include <string>
#include "base/memory/ref_counted.h"
#include "cc/layers/texture_layer.h"
#include "cc/layers/texture_layer_client.h"
#include "cc/resources/shared_bitmap_id_registrar.h"
#include "gpu/command_buffer/common/mailbox.h"
#include "gpu/command_buffer/common/sync_token.h"
#include "third_party/blink/public/mojom/input/focus_type.mojom-forward.h"
#include "third_party/blink/public/web/web_document.h"
#include "third_party/blink/public/web/web_element.h"
#include "third_party/blink/public/web/web_local_frame.h"
#include "third_party/blink/public/web/web_plugin.h"
#include "third_party/blink/public/web/web_plugin_container.h"
#include "third_party/khronos/GLES2/gl2.h"
namespace blink {
class WebGraphicsContext3DProvider;
struct WebPluginParams;
} // namespace blink
namespace cc {
class CrossThreadSharedBitmap;
}
namespace gpu {
namespace gles2 {
class GLES2Interface;
}
} // namespace gpu
namespace viz {
struct TransferableResource;
}
namespace content {
class TestRunner;
// A fake implementation of blink::WebPlugin for testing purposes.
//
// It uses GL to paint a scene consisiting of a primitive over a background. The
// primitive and background can be customized using the following plugin
// parameters.
// primitive: none (default), triangle.
// background-color: black (default), red, green, blue.
// primitive-color: black (default), red, green, blue.
// opacity: [0.0 - 1.0]. Default is 1.0.
//
// Whether the plugin accepts touch events or not can be customized using the
// 'accepts-touch' plugin parameter (defaults to false).
class TestPlugin : public blink::WebPlugin, public cc::TextureLayerClient {
public:
static TestPlugin* Create(const blink::WebPluginParams& params,
TestRunner* test_runner,
blink::WebLocalFrame* frame);
TestPlugin(const TestPlugin&) = delete;
TestPlugin& operator=(const TestPlugin&) = delete;
~TestPlugin() override;
static const blink::WebString& MimeType();
static const blink::WebString& CanCreateWithoutRendererMimeType();
static const blink::WebString& PluginPersistsMimeType();
static bool IsSupportedMimeType(const blink::WebString& mime_type);
// WebPlugin methods:
bool Initialize(blink::WebPluginContainer* container) override;
void Destroy() override;
blink::WebPluginContainer* Container() const override;
bool CanProcessDrag() const override;
bool SupportsKeyboardFocus() const override;
void UpdateAllLifecyclePhases(blink::DocumentUpdateReason) override {}
void Paint(cc::PaintCanvas* canvas, const gfx::Rect& rect) override {}
void UpdateGeometry(const gfx::Rect& window_rect,
const gfx::Rect& clip_rect,
const gfx::Rect& unobscured_rect,
bool is_visible) override;
void UpdateFocus(bool focus, blink::mojom::FocusType focus_type) override {}
void UpdateVisibility(bool visibility) override {}
blink::WebInputEventResult HandleInputEvent(
const blink::WebCoalescedInputEvent& event,
ui::Cursor* cursor) override;
bool HandleDragStatusUpdate(blink::WebDragStatus drag_status,
const blink::WebDragData& data,
blink::DragOperationsMask mask,
const gfx::PointF& position,
const gfx::PointF& screen_position) override;
void DidReceiveResponse(const blink::WebURLResponse& response) override {}
void DidReceiveData(const char* data, size_t data_length) override {}
void DidFinishLoading() override {}
void DidFailLoading(const blink::WebURLError& error) override {}
bool IsPlaceholder() override;
// cc::TextureLayerClient methods:
bool PrepareTransferableResource(
cc::SharedBitmapIdRegistrar* bitmap_registrar,
viz::TransferableResource* resource,
viz::ReleaseCallback* release_callback) override;
private:
TestPlugin(const blink::WebPluginParams& params,
TestRunner* test_runner,
blink::WebLocalFrame* frame);
enum Primitive { PrimitiveNone, PrimitiveTriangle };
struct Scene {
Primitive primitive;
uint8_t background_color[3];
uint8_t primitive_color[3];
float opacity;
GLuint vbo;
GLuint program;
int color_location;
int position_location;
Scene()
: primitive(PrimitiveNone),
opacity(1.0f) // Fully opaque.
,
vbo(0),
program(0),
color_location(-1),
position_location(-1) {
background_color[0] = background_color[1] = background_color[2] = 0;
primitive_color[0] = primitive_color[1] = primitive_color[2] = 0;
}
};
using ContextProviderRef = base::RefCountedData<
std::unique_ptr<blink::WebGraphicsContext3DProvider>>;
// Functions for parsing plugin parameters.
Primitive ParsePrimitive(const blink::WebString& string);
void ParseColor(const blink::WebString& string, uint8_t color[3]);
float ParseOpacity(const blink::WebString& string);
bool ParseBoolean(const blink::WebString& string);
// Functions for loading and drawing scene in GL.
bool InitScene();
void DrawSceneGL();
void DestroyScene();
bool InitProgram();
bool InitPrimitive();
void DrawPrimitive();
GLuint LoadShader(GLenum type, const std::string& source);
GLuint LoadProgram(const std::string& vertex_source,
const std::string& fragment_source);
// Functions for drawing scene in Software.
void DrawSceneSoftware(void* memory);
static void ReleaseSharedMemory(
scoped_refptr<cc::CrossThreadSharedBitmap> shared_bitmap,
cc::SharedBitmapIdRegistration registration,
const gpu::SyncToken& sync_token,
bool lost);
static void ReleaseSharedImage(
scoped_refptr<ContextProviderRef> context_provider,
const gpu::Mailbox& mailbox,
const gpu::SyncToken& sync_token,
bool lost);
TestRunner* test_runner_;
blink::WebPluginContainer* container_;
blink::WebLocalFrame* web_local_frame_;
gfx::Rect rect_;
scoped_refptr<ContextProviderRef> context_provider_;
gpu::gles2::GLES2Interface* gl_;
gpu::Mailbox mailbox_;
gpu::SyncToken sync_token_;
scoped_refptr<cc::CrossThreadSharedBitmap> shared_bitmap_;
bool content_changed_;
GLuint framebuffer_;
Scene scene_;
scoped_refptr<cc::TextureLayer> layer_;
blink::WebPluginContainer::TouchEventRequestType touch_event_request_;
// Requests touch events from the WebPluginContainerImpl multiple times to
// tickle webkit.org/b/108381
bool re_request_touch_events_;
bool print_event_details_;
bool print_user_gesture_status_;
bool can_process_drag_;
bool supports_keyboard_focus_;
bool is_persistent_;
bool can_create_without_renderer_;
};
} // namespace content
#endif // CONTENT_WEB_TEST_RENDERER_TEST_PLUGIN_H_