Home | History | Annotate | Download | only in test_runner
      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_TESTPLUGIN_H_
      6 #define CONTENT_SHELL_RENDERER_TEST_RUNNER_TESTPLUGIN_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*, const blink::WebPluginParams&, WebTestDelegate*);
     46     virtual ~TestPlugin();
     47 
     48     static const blink::WebString& mimeType();
     49     static const blink::WebString& canCreateWithoutRendererMimeType();
     50     static const blink::WebString& pluginPersistsMimeType();
     51     static bool isSupportedMimeType(const blink::WebString& mimeType);
     52 
     53     // WebPlugin methods:
     54     virtual bool initialize(blink::WebPluginContainer*);
     55     virtual void destroy();
     56     virtual NPObject* scriptableObject();
     57     virtual bool canProcessDrag() const;
     58     virtual void paint(blink::WebCanvas*, const blink::WebRect&) { }
     59     virtual void updateGeometry(const blink::WebRect& frameRect, const blink::WebRect& clipRect, const blink::WebVector<blink::WebRect>& cutOutsRects, bool isVisible);
     60     virtual void updateFocus(bool) { }
     61     virtual void updateVisibility(bool) { }
     62     virtual bool acceptsInputEvents();
     63     virtual bool handleInputEvent(const blink::WebInputEvent&, blink::WebCursorInfo&);
     64     virtual bool handleDragStatusUpdate(blink::WebDragStatus, const blink::WebDragData&, blink::WebDragOperationsMask, const blink::WebPoint& position, const blink::WebPoint& screenPosition);
     65     virtual void didReceiveResponse(const blink::WebURLResponse&) { }
     66     virtual void didReceiveData(const char* data, int dataLength) { }
     67     virtual void didFinishLoading() { }
     68     virtual void didFailLoading(const blink::WebURLError&) { }
     69     virtual void didFinishLoadingFrameRequest(const blink::WebURL&, void* notifyData) { }
     70     virtual void didFailLoadingFrameRequest(const blink::WebURL&, void* notifyData, const blink::WebURLError&) { }
     71     virtual bool isPlaceholder();
     72 
     73     // cc::TextureLayerClient methods:
     74     virtual bool PrepareTextureMailbox(
     75         cc::TextureMailbox* mailbox,
     76         scoped_ptr<cc::SingleReleaseCallback>* releaseCallback,
     77         bool useSharedMemory) OVERRIDE;
     78 
     79 private:
     80     TestPlugin(blink::WebFrame*, const blink::WebPluginParams&, WebTestDelegate*);
     81 
     82     enum Primitive {
     83         PrimitiveNone,
     84         PrimitiveTriangle
     85     };
     86 
     87     struct Scene {
     88         Primitive primitive;
     89         unsigned backgroundColor[3];
     90         unsigned primitiveColor[3];
     91         float opacity;
     92 
     93         unsigned vbo;
     94         unsigned program;
     95         int colorLocation;
     96         int positionLocation;
     97 
     98         Scene()
     99             : primitive(PrimitiveNone)
    100             , opacity(1.0f) // Fully opaque.
    101             , vbo(0)
    102             , program(0)
    103             , colorLocation(-1)
    104             , positionLocation(-1)
    105         {
    106             backgroundColor[0] = backgroundColor[1] = backgroundColor[2] = 0;
    107             primitiveColor[0] = primitiveColor[1] = primitiveColor[2] = 0;
    108         }
    109     };
    110 
    111     // Functions for parsing plugin parameters.
    112     Primitive parsePrimitive(const blink::WebString&);
    113     void parseColor(const blink::WebString&, unsigned color[3]);
    114     float parseOpacity(const blink::WebString&);
    115     bool parseBoolean(const blink::WebString&);
    116 
    117     // Functions for loading and drawing scene in GL.
    118     bool initScene();
    119     void drawSceneGL();
    120     void destroyScene();
    121     bool initProgram();
    122     bool initPrimitive();
    123     void drawPrimitive();
    124     unsigned loadShader(unsigned type, const std::string& source);
    125     unsigned loadProgram(const std::string& vertexSource, const std::string& fragmentSource);
    126 
    127     // Functions for drawing scene in Software.
    128     void drawSceneSoftware(void* memory, size_t bytes);
    129 
    130     blink::WebFrame* m_frame;
    131     WebTestDelegate* m_delegate;
    132     blink::WebPluginContainer* m_container;
    133 
    134     blink::WebRect m_rect;
    135     blink::WebGraphicsContext3D* m_context;
    136     unsigned m_colorTexture;
    137     cc::TextureMailbox m_textureMailbox;
    138     scoped_ptr<base::SharedMemory> m_sharedBitmap;
    139     bool m_mailboxChanged;
    140     unsigned m_framebuffer;
    141     Scene m_scene;
    142     scoped_refptr<cc::TextureLayer> m_layer;
    143     scoped_ptr<blink::WebLayer> m_webLayer;
    144 
    145     blink::WebPluginContainer::TouchEventRequestType m_touchEventRequest;
    146     // Requests touch events from the WebPluginContainerImpl multiple times to tickle webkit.org/b/108381
    147     bool m_reRequestTouchEvents;
    148     bool m_printEventDetails;
    149     bool m_printUserGestureStatus;
    150     bool m_canProcessDrag;
    151 
    152     bool m_isPersistent;
    153     bool m_canCreateWithoutRenderer;
    154 
    155     DISALLOW_COPY_AND_ASSIGN(TestPlugin);
    156 };
    157 
    158 }  // namespace content
    159 
    160 #endif  // CONTENT_SHELL_RENDERER_TEST_RUNNER_TESTPLUGIN_H_
    161