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