11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2013 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef CONTENT_SHELL_RENDERER_TEST_RUNNER_TEST_PLUGIN_H_ 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define CONTENT_SHELL_RENDERER_TEST_RUNNER_TEST_PLUGIN_H_ 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <string> 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/basictypes.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/scoped_ptr.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "cc/layers/texture_layer.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "cc/layers/texture_layer_client.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/test/layouttest_support.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "third_party/WebKit/public/platform/WebExternalTextureLayer.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "third_party/WebKit/public/platform/WebExternalTextureLayerClient.h" 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "third_party/WebKit/public/platform/WebExternalTextureMailbox.h" 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "third_party/WebKit/public/platform/WebLayer.h" 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "third_party/WebKit/public/web/WebPlugin.h" 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "third_party/WebKit/public/web/WebPluginContainer.h" 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace blink { 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass WebFrame; 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass WebLayer; 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace content { 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass WebTestDelegate; 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// A fake implemention of blink::WebPlugin for testing purposes. 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// It uses WebGraphicsContext3D to paint a scene consisiting of a primitive 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// over a background. The primitive and background can be customized using 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// the following plugin parameters: 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// primitive: none (default), triangle. 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// background-color: black (default), red, green, blue. 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// primitive-color: black (default), red, green, blue. 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// opacity: [0.0 - 1.0]. Default is 1.0. 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Whether the plugin accepts touch events or not can be customized using the 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// 'accepts-touch' plugin parameter (defaults to false). 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass TestPlugin : public blink::WebPlugin, public cc::TextureLayerClient { 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static TestPlugin* create(blink::WebFrame* frame, 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const blink::WebPluginParams& params, 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WebTestDelegate* delegate); 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~TestPlugin(); 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static const blink::WebString& MimeType(); 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static const blink::WebString& CanCreateWithoutRendererMimeType(); 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static const blink::WebString& PluginPersistsMimeType(); 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static bool IsSupportedMimeType(const blink::WebString& mime_type); 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // WebPlugin methods: 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual bool initialize(blink::WebPluginContainer* container); 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void destroy(); 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual NPObject* scriptableObject(); 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual bool canProcessDrag() const; 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void paint(blink::WebCanvas* canvas, const blink::WebRect& rect) {} 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void updateGeometry( 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const blink::WebRect& frame_rect, 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const blink::WebRect& clip_rect, 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const blink::WebVector<blink::WebRect>& cut_outs_rects, 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool is_visible); 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void updateFocus(bool focus) {} 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void updateVisibility(bool visibility) {} 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual bool acceptsInputEvents(); 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual bool handleInputEvent(const blink::WebInputEvent& event, 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci blink::WebCursorInfo& info); 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual bool handleDragStatusUpdate(blink::WebDragStatus drag_status, 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const blink::WebDragData& data, 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci blink::WebDragOperationsMask mask, 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const blink::WebPoint& position, 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const blink::WebPoint& screen_position); 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void didReceiveResponse(const blink::WebURLResponse& response) {} 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void didReceiveData(const char* data, int data_length) {} 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void didFinishLoading() {} 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void didFailLoading(const blink::WebURLError& error) {} 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void didFinishLoadingFrameRequest(const blink::WebURL& url, 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void* notify_data) {} 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void didFailLoadingFrameRequest(const blink::WebURL& url, 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void* notify_data, 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const blink::WebURLError& error) {} 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual bool isPlaceholder(); 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // cc::TextureLayerClient methods: 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual bool PrepareTextureMailbox( 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cc::TextureMailbox* mailbox, 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<cc::SingleReleaseCallback>* release_callback, 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool use_shared_memory) OVERRIDE; 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TestPlugin(blink::WebFrame* frame, 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const blink::WebPluginParams& params, 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WebTestDelegate* delegate); 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum Primitive { PrimitiveNone, PrimitiveTriangle }; 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci struct Scene { 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Primitive primitive; 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned background_color[3]; 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned primitive_color[3]; 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci float opacity; 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned vbo; 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned program; 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int color_location; 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int position_location; 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Scene() 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : primitive(PrimitiveNone), 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci opacity(1.0f) // Fully opaque. 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci , 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci vbo(0), 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci program(0), 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci color_location(-1), 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci position_location(-1) { 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci background_color[0] = background_color[1] = background_color[2] = 0; 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci primitive_color[0] = primitive_color[1] = primitive_color[2] = 0; 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Functions for parsing plugin parameters. 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Primitive ParsePrimitive(const blink::WebString& string); 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void ParseColor(const blink::WebString& string, unsigned color[3]); 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci float ParseOpacity(const blink::WebString& string); 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool ParseBoolean(const blink::WebString& string); 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Functions for loading and drawing scene in GL. 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool InitScene(); 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void DrawSceneGL(); 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void DestroyScene(); 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool InitProgram(); 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool InitPrimitive(); 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void DrawPrimitive(); 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned LoadShader(unsigned type, const std::string& source); 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned LoadProgram(const std::string& vertex_source, 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& fragment_source); 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Functions for drawing scene in Software. 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void DrawSceneSoftware(void* memory, size_t bytes); 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci blink::WebFrame* frame_; 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WebTestDelegate* delegate_; 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci blink::WebPluginContainer* container_; 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci blink::WebRect rect_; 1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci blink::WebGraphicsContext3D* context_; 1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned color_texture_; 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cc::TextureMailbox texture_mailbox_; 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<base::SharedMemory> shared_bitmap_; 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool mailbox_changed_; 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned framebuffer_; 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Scene scene_; 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<cc::TextureLayer> layer_; 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<blink::WebLayer> web_layer_; 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci blink::WebPluginContainer::TouchEventRequestType touch_event_request_; 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Requests touch events from the WebPluginContainerImpl multiple times to 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // tickle webkit.org/b/108381 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool re_request_touch_events_; 1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool print_event_details_; 1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool print_user_gesture_status_; 1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool can_process_drag_; 1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool is_persistent_; 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool can_create_without_renderer_; 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(TestPlugin); 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace content 1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif // CONTENT_SHELL_RENDERER_TEST_RUNNER_TEST_PLUGIN_H_ 176