Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / content / shell / renderer / test_runner / test_plugin.h
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef CONTENT_SHELL_RENDERER_TEST_RUNNER_TEST_PLUGIN_H_
6 #define CONTENT_SHELL_RENDERER_TEST_RUNNER_TEST_PLUGIN_H_
7
8 #include <string>
9
10 #include "base/basictypes.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "cc/layers/texture_layer.h"
13 #include "cc/layers/texture_layer_client.h"
14 #include "content/public/test/layouttest_support.h"
15 #include "third_party/WebKit/public/platform/WebExternalTextureLayer.h"
16 #include "third_party/WebKit/public/platform/WebExternalTextureLayerClient.h"
17 #include "third_party/WebKit/public/platform/WebExternalTextureMailbox.h"
18 #include "third_party/WebKit/public/platform/WebLayer.h"
19 #include "third_party/WebKit/public/web/WebPlugin.h"
20 #include "third_party/WebKit/public/web/WebPluginContainer.h"
21
22 namespace blink {
23 class WebFrame;
24 class WebLayer;
25 }
26
27 namespace content {
28
29 class WebTestDelegate;
30
31 // A fake implemention of blink::WebPlugin for testing purposes.
32 //
33 // It uses WebGraphicsContext3D to paint a scene consisiting of a primitive
34 // over a background. The primitive and background can be customized using
35 // the following plugin parameters:
36 // primitive: none (default), triangle.
37 // background-color: black (default), red, green, blue.
38 // primitive-color: black (default), red, green, blue.
39 // opacity: [0.0 - 1.0]. Default is 1.0.
40 //
41 // Whether the plugin accepts touch events or not can be customized using the
42 // 'accepts-touch' plugin parameter (defaults to false).
43 class TestPlugin : public blink::WebPlugin, public cc::TextureLayerClient {
44  public:
45   static TestPlugin* create(blink::WebFrame* frame,
46                             const blink::WebPluginParams& params,
47                             WebTestDelegate* delegate);
48   ~TestPlugin() override;
49
50   static const blink::WebString& MimeType();
51   static const blink::WebString& CanCreateWithoutRendererMimeType();
52   static const blink::WebString& PluginPersistsMimeType();
53   static bool IsSupportedMimeType(const blink::WebString& mime_type);
54
55   // WebPlugin methods:
56   virtual bool initialize(blink::WebPluginContainer* container);
57   virtual void destroy();
58   virtual NPObject* scriptableObject();
59   virtual bool canProcessDrag() const;
60   virtual void paint(blink::WebCanvas* canvas, const blink::WebRect& rect) {}
61   virtual void updateGeometry(
62       const blink::WebRect& frame_rect,
63       const blink::WebRect& clip_rect,
64       const blink::WebVector<blink::WebRect>& cut_outs_rects,
65       bool is_visible);
66   virtual void updateFocus(bool focus) {}
67   virtual void updateVisibility(bool visibility) {}
68   virtual bool acceptsInputEvents();
69   virtual bool handleInputEvent(const blink::WebInputEvent& event,
70                                 blink::WebCursorInfo& info);
71   virtual bool handleDragStatusUpdate(blink::WebDragStatus drag_status,
72                                       const blink::WebDragData& data,
73                                       blink::WebDragOperationsMask mask,
74                                       const blink::WebPoint& position,
75                                       const blink::WebPoint& screen_position);
76   virtual void didReceiveResponse(const blink::WebURLResponse& response) {}
77   virtual void didReceiveData(const char* data, int data_length) {}
78   virtual void didFinishLoading() {}
79   virtual void didFailLoading(const blink::WebURLError& error) {}
80   virtual void didFinishLoadingFrameRequest(const blink::WebURL& url,
81                                             void* notify_data) {}
82   virtual void didFailLoadingFrameRequest(const blink::WebURL& url,
83                                           void* notify_data,
84                                           const blink::WebURLError& error) {}
85   virtual bool isPlaceholder();
86
87   // cc::TextureLayerClient methods:
88   bool PrepareTextureMailbox(
89       cc::TextureMailbox* mailbox,
90       scoped_ptr<cc::SingleReleaseCallback>* release_callback,
91       bool use_shared_memory) override;
92
93  private:
94   TestPlugin(blink::WebFrame* frame,
95              const blink::WebPluginParams& params,
96              WebTestDelegate* delegate);
97
98   enum Primitive { PrimitiveNone, PrimitiveTriangle };
99
100   struct Scene {
101     Primitive primitive;
102     unsigned background_color[3];
103     unsigned primitive_color[3];
104     float opacity;
105
106     unsigned vbo;
107     unsigned program;
108     int color_location;
109     int position_location;
110
111     Scene()
112         : primitive(PrimitiveNone),
113           opacity(1.0f)  // Fully opaque.
114           ,
115           vbo(0),
116           program(0),
117           color_location(-1),
118           position_location(-1) {
119       background_color[0] = background_color[1] = background_color[2] = 0;
120       primitive_color[0] = primitive_color[1] = primitive_color[2] = 0;
121     }
122   };
123
124   // Functions for parsing plugin parameters.
125   Primitive ParsePrimitive(const blink::WebString& string);
126   void ParseColor(const blink::WebString& string, unsigned color[3]);
127   float ParseOpacity(const blink::WebString& string);
128   bool ParseBoolean(const blink::WebString& string);
129
130   // Functions for loading and drawing scene in GL.
131   bool InitScene();
132   void DrawSceneGL();
133   void DestroyScene();
134   bool InitProgram();
135   bool InitPrimitive();
136   void DrawPrimitive();
137   unsigned LoadShader(unsigned type, const std::string& source);
138   unsigned LoadProgram(const std::string& vertex_source,
139                        const std::string& fragment_source);
140
141   // Functions for drawing scene in Software.
142   void DrawSceneSoftware(void* memory, size_t bytes);
143
144   blink::WebFrame* frame_;
145   WebTestDelegate* delegate_;
146   blink::WebPluginContainer* container_;
147
148   blink::WebRect rect_;
149   blink::WebGraphicsContext3D* context_;
150   unsigned color_texture_;
151   cc::TextureMailbox texture_mailbox_;
152   scoped_ptr<base::SharedMemory> shared_bitmap_;
153   bool mailbox_changed_;
154   unsigned framebuffer_;
155   Scene scene_;
156   scoped_refptr<cc::TextureLayer> layer_;
157   scoped_ptr<blink::WebLayer> web_layer_;
158
159   blink::WebPluginContainer::TouchEventRequestType touch_event_request_;
160   // Requests touch events from the WebPluginContainerImpl multiple times to
161   // tickle webkit.org/b/108381
162   bool re_request_touch_events_;
163   bool print_event_details_;
164   bool print_user_gesture_status_;
165   bool can_process_drag_;
166
167   bool is_persistent_;
168   bool can_create_without_renderer_;
169
170   DISALLOW_COPY_AND_ASSIGN(TestPlugin);
171 };
172
173 }  // namespace content
174
175 #endif  // CONTENT_SHELL_RENDERER_TEST_RUNNER_TEST_PLUGIN_H_