| Index: content/shell/renderer/test_runner/TestPlugin.cpp
|
| diff --git a/content/shell/renderer/test_runner/TestPlugin.cpp b/content/shell/renderer/test_runner/TestPlugin.cpp
|
| deleted file mode 100644
|
| index b7bcfd3b1d5fd2d8031ed565e61261a5072ff171..0000000000000000000000000000000000000000
|
| --- a/content/shell/renderer/test_runner/TestPlugin.cpp
|
| +++ /dev/null
|
| @@ -1,683 +0,0 @@
|
| -// Copyright 2013 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "content/shell/renderer/test_runner/TestPlugin.h"
|
| -
|
| -#include "base/basictypes.h"
|
| -#include "base/bind.h"
|
| -#include "base/logging.h"
|
| -#include "base/memory/shared_memory.h"
|
| -#include "base/strings/stringprintf.h"
|
| -#include "content/public/renderer/render_thread.h"
|
| -#include "content/shell/renderer/test_runner/WebTestDelegate.h"
|
| -#include "third_party/skia/include/core/SkBitmap.h"
|
| -#include "third_party/skia/include/core/SkCanvas.h"
|
| -#include "third_party/skia/include/core/SkColor.h"
|
| -#include "third_party/WebKit/public/platform/Platform.h"
|
| -#include "third_party/WebKit/public/platform/WebCompositorSupport.h"
|
| -#include "third_party/WebKit/public/platform/WebGraphicsContext3D.h"
|
| -#include "third_party/WebKit/public/web/WebFrame.h"
|
| -#include "third_party/WebKit/public/web/WebInputEvent.h"
|
| -#include "third_party/WebKit/public/web/WebKit.h"
|
| -#include "third_party/WebKit/public/web/WebPluginParams.h"
|
| -#include "third_party/WebKit/public/web/WebTouchPoint.h"
|
| -#include "third_party/WebKit/public/web/WebUserGestureIndicator.h"
|
| -
|
| -using namespace blink;
|
| -
|
| -namespace content {
|
| -
|
| -namespace {
|
| -
|
| -// GLenum values copied from gl2.h.
|
| -#define GL_FALSE 0
|
| -#define GL_TRUE 1
|
| -#define GL_ONE 1
|
| -#define GL_TRIANGLES 0x0004
|
| -#define GL_ONE_MINUS_SRC_ALPHA 0x0303
|
| -#define GL_DEPTH_TEST 0x0B71
|
| -#define GL_BLEND 0x0BE2
|
| -#define GL_SCISSOR_TEST 0x0B90
|
| -#define GL_TEXTURE_2D 0x0DE1
|
| -#define GL_FLOAT 0x1406
|
| -#define GL_RGBA 0x1908
|
| -#define GL_UNSIGNED_BYTE 0x1401
|
| -#define GL_TEXTURE_MAG_FILTER 0x2800
|
| -#define GL_TEXTURE_MIN_FILTER 0x2801
|
| -#define GL_TEXTURE_WRAP_S 0x2802
|
| -#define GL_TEXTURE_WRAP_T 0x2803
|
| -#define GL_NEAREST 0x2600
|
| -#define GL_COLOR_BUFFER_BIT 0x4000
|
| -#define GL_CLAMP_TO_EDGE 0x812F
|
| -#define GL_ARRAY_BUFFER 0x8892
|
| -#define GL_STATIC_DRAW 0x88E4
|
| -#define GL_FRAGMENT_SHADER 0x8B30
|
| -#define GL_VERTEX_SHADER 0x8B31
|
| -#define GL_COMPILE_STATUS 0x8B81
|
| -#define GL_LINK_STATUS 0x8B82
|
| -#define GL_COLOR_ATTACHMENT0 0x8CE0
|
| -#define GL_FRAMEBUFFER_COMPLETE 0x8CD5
|
| -#define GL_FRAMEBUFFER 0x8D40
|
| -
|
| -void premultiplyAlpha(const unsigned colorIn[3], float alpha, float colorOut[4])
|
| -{
|
| - for (int i = 0; i < 3; ++i)
|
| - colorOut[i] = (colorIn[i] / 255.0f) * alpha;
|
| -
|
| - colorOut[3] = alpha;
|
| -}
|
| -
|
| -const char* pointState(WebTouchPoint::State state)
|
| -{
|
| - switch (state) {
|
| - case WebTouchPoint::StateReleased:
|
| - return "Released";
|
| - case WebTouchPoint::StatePressed:
|
| - return "Pressed";
|
| - case WebTouchPoint::StateMoved:
|
| - return "Moved";
|
| - case WebTouchPoint::StateCancelled:
|
| - return "Cancelled";
|
| - default:
|
| - return "Unknown";
|
| - }
|
| -}
|
| -
|
| -void printTouchList(WebTestDelegate* delegate, const WebTouchPoint* points, int length)
|
| -{
|
| - for (int i = 0; i < length; ++i) {
|
| - delegate->printMessage(base::StringPrintf("* %.2f, %.2f: %s\n",
|
| - points[i].position.x,
|
| - points[i].position.y,
|
| - pointState(points[i].state)));
|
| - }
|
| -}
|
| -
|
| -void printEventDetails(WebTestDelegate* delegate, const WebInputEvent& event)
|
| -{
|
| - if (WebInputEvent::isTouchEventType(event.type)) {
|
| - const WebTouchEvent& touch = static_cast<const WebTouchEvent&>(event);
|
| - printTouchList(delegate, touch.touches, touch.touchesLength);
|
| - printTouchList(delegate, touch.changedTouches, touch.changedTouchesLength);
|
| - printTouchList(delegate, touch.targetTouches, touch.targetTouchesLength);
|
| - } else if (WebInputEvent::isMouseEventType(event.type) || event.type == WebInputEvent::MouseWheel) {
|
| - const WebMouseEvent& mouse = static_cast<const WebMouseEvent&>(event);
|
| - delegate->printMessage(
|
| - base::StringPrintf("* %d, %d\n", mouse.x, mouse.y));
|
| - } else if (WebInputEvent::isGestureEventType(event.type)) {
|
| - const WebGestureEvent& gesture = static_cast<const WebGestureEvent&>(event);
|
| - delegate->printMessage(
|
| - base::StringPrintf("* %d, %d\n", gesture.x, gesture.y));
|
| - }
|
| -}
|
| -
|
| -WebPluginContainer::TouchEventRequestType parseTouchEventRequestType(const WebString& string)
|
| -{
|
| - if (string == WebString::fromUTF8("raw"))
|
| - return WebPluginContainer::TouchEventRequestTypeRaw;
|
| - if (string == WebString::fromUTF8("synthetic"))
|
| - return WebPluginContainer::TouchEventRequestTypeSynthesizedMouse;
|
| - return WebPluginContainer::TouchEventRequestTypeNone;
|
| -}
|
| -
|
| -void deferredDelete(void* context)
|
| -{
|
| - TestPlugin* plugin = static_cast<TestPlugin*>(context);
|
| - delete plugin;
|
| -}
|
| -
|
| -}
|
| -
|
| -TestPlugin::TestPlugin(WebFrame* frame, const WebPluginParams& params, WebTestDelegate* delegate)
|
| - : m_frame(frame)
|
| - , m_delegate(delegate)
|
| - , m_container(0)
|
| - , m_context(0)
|
| - , m_colorTexture(0)
|
| - , m_mailboxChanged(false)
|
| - , m_framebuffer(0)
|
| - , m_touchEventRequest(WebPluginContainer::TouchEventRequestTypeNone)
|
| - , m_reRequestTouchEvents(false)
|
| - , m_printEventDetails(false)
|
| - , m_printUserGestureStatus(false)
|
| - , m_canProcessDrag(false)
|
| - , m_isPersistent(params.mimeType == pluginPersistsMimeType())
|
| - , m_canCreateWithoutRenderer(params.mimeType == canCreateWithoutRendererMimeType())
|
| -{
|
| - const CR_DEFINE_STATIC_LOCAL(WebString, kAttributePrimitive, ("primitive"));
|
| - const CR_DEFINE_STATIC_LOCAL(WebString, kAttributeBackgroundColor, ("background-color"));
|
| - const CR_DEFINE_STATIC_LOCAL(WebString, kAttributePrimitiveColor, ("primitive-color"));
|
| - const CR_DEFINE_STATIC_LOCAL(WebString, kAttributeOpacity, ("opacity"));
|
| - const CR_DEFINE_STATIC_LOCAL(WebString, kAttributeAcceptsTouch, ("accepts-touch"));
|
| - const CR_DEFINE_STATIC_LOCAL(WebString, kAttributeReRequestTouchEvents, ("re-request-touch"));
|
| - const CR_DEFINE_STATIC_LOCAL(WebString, kAttributePrintEventDetails, ("print-event-details"));
|
| - const CR_DEFINE_STATIC_LOCAL(WebString, kAttributeCanProcessDrag, ("can-process-drag"));
|
| - const CR_DEFINE_STATIC_LOCAL(WebString, kAttributePrintUserGestureStatus, ("print-user-gesture-status"));
|
| -
|
| - DCHECK_EQ(params.attributeNames.size(), params.attributeValues.size());
|
| - size_t size = params.attributeNames.size();
|
| - for (size_t i = 0; i < size; ++i) {
|
| - const WebString& attributeName = params.attributeNames[i];
|
| - const WebString& attributeValue = params.attributeValues[i];
|
| -
|
| - if (attributeName == kAttributePrimitive)
|
| - m_scene.primitive = parsePrimitive(attributeValue);
|
| - else if (attributeName == kAttributeBackgroundColor)
|
| - parseColor(attributeValue, m_scene.backgroundColor);
|
| - else if (attributeName == kAttributePrimitiveColor)
|
| - parseColor(attributeValue, m_scene.primitiveColor);
|
| - else if (attributeName == kAttributeOpacity)
|
| - m_scene.opacity = parseOpacity(attributeValue);
|
| - else if (attributeName == kAttributeAcceptsTouch)
|
| - m_touchEventRequest = parseTouchEventRequestType(attributeValue);
|
| - else if (attributeName == kAttributeReRequestTouchEvents)
|
| - m_reRequestTouchEvents = parseBoolean(attributeValue);
|
| - else if (attributeName == kAttributePrintEventDetails)
|
| - m_printEventDetails = parseBoolean(attributeValue);
|
| - else if (attributeName == kAttributeCanProcessDrag)
|
| - m_canProcessDrag = parseBoolean(attributeValue);
|
| - else if (attributeName == kAttributePrintUserGestureStatus)
|
| - m_printUserGestureStatus = parseBoolean(attributeValue);
|
| - }
|
| - if (m_canCreateWithoutRenderer)
|
| - m_delegate->printMessage(std::string("TestPlugin: canCreateWithoutRenderer\n"));
|
| -}
|
| -
|
| -TestPlugin::~TestPlugin()
|
| -{
|
| -}
|
| -
|
| -bool TestPlugin::initialize(WebPluginContainer* container)
|
| -{
|
| - WebGraphicsContext3D::Attributes attrs;
|
| - m_context = Platform::current()->createOffscreenGraphicsContext3D(attrs);
|
| -
|
| - if (!initScene())
|
| - return false;
|
| -
|
| - m_layer = cc::TextureLayer::CreateForMailbox(this);
|
| - m_webLayer = make_scoped_ptr(InstantiateWebLayer(m_layer));
|
| - m_container = container;
|
| - m_container->setWebLayer(m_webLayer.get());
|
| - if (m_reRequestTouchEvents) {
|
| - m_container->requestTouchEventType(WebPluginContainer::TouchEventRequestTypeSynthesizedMouse);
|
| - m_container->requestTouchEventType(WebPluginContainer::TouchEventRequestTypeRaw);
|
| - }
|
| - m_container->requestTouchEventType(m_touchEventRequest);
|
| - m_container->setWantsWheelEvents(true);
|
| - return true;
|
| -}
|
| -
|
| -void TestPlugin::destroy()
|
| -{
|
| - if (m_layer.get())
|
| - m_layer->ClearTexture();
|
| - if (m_container)
|
| - m_container->setWebLayer(0);
|
| - m_webLayer.reset();
|
| - m_layer = NULL;
|
| - destroyScene();
|
| -
|
| - delete m_context;
|
| - m_context = 0;
|
| -
|
| - m_container = 0;
|
| - m_frame = 0;
|
| -
|
| - Platform::current()->callOnMainThread(deferredDelete, this);
|
| -}
|
| -
|
| -NPObject* TestPlugin::scriptableObject()
|
| -{
|
| - return 0;
|
| -}
|
| -
|
| -bool TestPlugin::canProcessDrag() const
|
| -{
|
| - return m_canProcessDrag;
|
| -}
|
| -
|
| -void TestPlugin::updateGeometry(const WebRect& frameRect, const WebRect& clipRect, const WebVector<WebRect>& cutOutsRects, bool isVisible)
|
| -{
|
| - if (clipRect == m_rect)
|
| - return;
|
| - m_rect = clipRect;
|
| -
|
| - if (m_rect.isEmpty()) {
|
| - m_textureMailbox = cc::TextureMailbox();
|
| - } else if (m_context) {
|
| - m_context->viewport(0, 0, m_rect.width, m_rect.height);
|
| -
|
| - m_context->bindTexture(GL_TEXTURE_2D, m_colorTexture);
|
| - m_context->texParameteri(
|
| - GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
| - m_context->texParameteri(
|
| - GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
| - m_context->texParameteri(
|
| - GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
| - m_context->texParameteri(
|
| - GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
| - m_context->texImage2D(GL_TEXTURE_2D,
|
| - 0,
|
| - GL_RGBA,
|
| - m_rect.width,
|
| - m_rect.height,
|
| - 0,
|
| - GL_RGBA,
|
| - GL_UNSIGNED_BYTE,
|
| - 0);
|
| - m_context->bindFramebuffer(GL_FRAMEBUFFER, m_framebuffer);
|
| - m_context->framebufferTexture2D(GL_FRAMEBUFFER,
|
| - GL_COLOR_ATTACHMENT0,
|
| - GL_TEXTURE_2D,
|
| - m_colorTexture,
|
| - 0);
|
| -
|
| - drawSceneGL();
|
| -
|
| - gpu::Mailbox mailbox;
|
| - m_context->genMailboxCHROMIUM(mailbox.name);
|
| - m_context->produceTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name);
|
| - m_context->flush();
|
| - uint32 syncPoint = m_context->insertSyncPoint();
|
| - m_textureMailbox = cc::TextureMailbox(mailbox, GL_TEXTURE_2D, syncPoint);
|
| - } else {
|
| - size_t bytes = 4 * m_rect.width * m_rect.height;
|
| - scoped_ptr<base::SharedMemory> bitmap =
|
| - RenderThread::Get()->HostAllocateSharedMemoryBuffer(bytes);
|
| - if (!bitmap->Map(bytes)) {
|
| - m_textureMailbox = cc::TextureMailbox();
|
| - } else {
|
| - drawSceneSoftware(bitmap->memory(), bytes);
|
| - m_textureMailbox = cc::TextureMailbox(
|
| - bitmap.get(), gfx::Size(m_rect.width, m_rect.height));
|
| - m_sharedBitmap = bitmap.Pass();
|
| - }
|
| - }
|
| -
|
| - m_mailboxChanged = true;
|
| - m_layer->SetNeedsDisplay();
|
| -}
|
| -
|
| -bool TestPlugin::acceptsInputEvents()
|
| -{
|
| - return true;
|
| -}
|
| -
|
| -bool TestPlugin::isPlaceholder()
|
| -{
|
| - return false;
|
| -}
|
| -
|
| -static void ignoreReleaseCallback(uint32 sync_point, bool lost) {}
|
| -
|
| -static void releaseSharedMemory(scoped_ptr<base::SharedMemory> bitmap,
|
| - uint32 sync_point,
|
| - bool lost) {}
|
| -
|
| -bool TestPlugin::PrepareTextureMailbox(
|
| - cc::TextureMailbox* mailbox,
|
| - scoped_ptr<cc::SingleReleaseCallback>* releaseCallback,
|
| - bool useSharedMemory) {
|
| - if (!m_mailboxChanged)
|
| - return false;
|
| - *mailbox = m_textureMailbox;
|
| - if (m_textureMailbox.IsTexture()) {
|
| - *releaseCallback =
|
| - cc::SingleReleaseCallback::Create(base::Bind(&ignoreReleaseCallback));
|
| - } else {
|
| - *releaseCallback = cc::SingleReleaseCallback::Create(
|
| - base::Bind(&releaseSharedMemory, base::Passed(&m_sharedBitmap)));
|
| - }
|
| - m_mailboxChanged = false;
|
| - return true;
|
| -}
|
| -
|
| -TestPlugin::Primitive TestPlugin::parsePrimitive(const WebString& string)
|
| -{
|
| - const CR_DEFINE_STATIC_LOCAL(WebString, kPrimitiveNone, ("none"));
|
| - const CR_DEFINE_STATIC_LOCAL(WebString, kPrimitiveTriangle, ("triangle"));
|
| -
|
| - Primitive primitive = PrimitiveNone;
|
| - if (string == kPrimitiveNone)
|
| - primitive = PrimitiveNone;
|
| - else if (string == kPrimitiveTriangle)
|
| - primitive = PrimitiveTriangle;
|
| - else
|
| - NOTREACHED();
|
| - return primitive;
|
| -}
|
| -
|
| -// FIXME: This method should already exist. Use it.
|
| -// For now just parse primary colors.
|
| -void TestPlugin::parseColor(const WebString& string, unsigned color[3])
|
| -{
|
| - color[0] = color[1] = color[2] = 0;
|
| - if (string == "black")
|
| - return;
|
| -
|
| - if (string == "red")
|
| - color[0] = 255;
|
| - else if (string == "green")
|
| - color[1] = 255;
|
| - else if (string == "blue")
|
| - color[2] = 255;
|
| - else
|
| - NOTREACHED();
|
| -}
|
| -
|
| -float TestPlugin::parseOpacity(const WebString& string)
|
| -{
|
| - return static_cast<float>(atof(string.utf8().data()));
|
| -}
|
| -
|
| -bool TestPlugin::parseBoolean(const WebString& string)
|
| -{
|
| - const CR_DEFINE_STATIC_LOCAL(WebString, kPrimitiveTrue, ("true"));
|
| - return string == kPrimitiveTrue;
|
| -}
|
| -
|
| -bool TestPlugin::initScene()
|
| -{
|
| - if (!m_context)
|
| - return true;
|
| -
|
| - float color[4];
|
| - premultiplyAlpha(m_scene.backgroundColor, m_scene.opacity, color);
|
| -
|
| - m_colorTexture = m_context->createTexture();
|
| - m_framebuffer = m_context->createFramebuffer();
|
| -
|
| - m_context->viewport(0, 0, m_rect.width, m_rect.height);
|
| - m_context->disable(GL_DEPTH_TEST);
|
| - m_context->disable(GL_SCISSOR_TEST);
|
| -
|
| - m_context->clearColor(color[0], color[1], color[2], color[3]);
|
| -
|
| - m_context->enable(GL_BLEND);
|
| - m_context->blendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
|
| -
|
| - return m_scene.primitive != PrimitiveNone ? initProgram() && initPrimitive() : true;
|
| -}
|
| -
|
| -void TestPlugin::drawSceneGL() {
|
| - m_context->viewport(0, 0, m_rect.width, m_rect.height);
|
| - m_context->clear(GL_COLOR_BUFFER_BIT);
|
| -
|
| - if (m_scene.primitive != PrimitiveNone)
|
| - drawPrimitive();
|
| -}
|
| -
|
| -void TestPlugin::drawSceneSoftware(void* memory, size_t bytes) {
|
| - DCHECK_EQ(bytes, m_rect.width * m_rect.height * 4u);
|
| -
|
| - SkColor backgroundColor =
|
| - SkColorSetARGB(static_cast<uint8>(m_scene.opacity * 255),
|
| - m_scene.backgroundColor[0],
|
| - m_scene.backgroundColor[1],
|
| - m_scene.backgroundColor[2]);
|
| -
|
| - const SkImageInfo info = SkImageInfo::MakeN32Premul(m_rect.width,
|
| - m_rect.height);
|
| - SkBitmap bitmap;
|
| - bitmap.installPixels(info, memory, info.minRowBytes());
|
| - SkCanvas canvas(bitmap);
|
| - canvas.clear(backgroundColor);
|
| -
|
| - if (m_scene.primitive != PrimitiveNone) {
|
| - DCHECK_EQ(PrimitiveTriangle, m_scene.primitive);
|
| - SkColor foregroundColor =
|
| - SkColorSetARGB(static_cast<uint8>(m_scene.opacity * 255),
|
| - m_scene.primitiveColor[0],
|
| - m_scene.primitiveColor[1],
|
| - m_scene.primitiveColor[2]);
|
| - SkPath trianglePath;
|
| - trianglePath.moveTo(0.5f * m_rect.width, 0.9f * m_rect.height);
|
| - trianglePath.lineTo(0.1f * m_rect.width, 0.1f * m_rect.height);
|
| - trianglePath.lineTo(0.9f * m_rect.width, 0.1f * m_rect.height);
|
| - SkPaint paint;
|
| - paint.setColor(foregroundColor);
|
| - paint.setStyle(SkPaint::kFill_Style);
|
| - canvas.drawPath(trianglePath, paint);
|
| - }
|
| -}
|
| -
|
| -void TestPlugin::destroyScene()
|
| -{
|
| - if (m_scene.program) {
|
| - m_context->deleteProgram(m_scene.program);
|
| - m_scene.program = 0;
|
| - }
|
| - if (m_scene.vbo) {
|
| - m_context->deleteBuffer(m_scene.vbo);
|
| - m_scene.vbo = 0;
|
| - }
|
| -
|
| - if (m_framebuffer) {
|
| - m_context->deleteFramebuffer(m_framebuffer);
|
| - m_framebuffer = 0;
|
| - }
|
| -
|
| - if (m_colorTexture) {
|
| - m_context->deleteTexture(m_colorTexture);
|
| - m_colorTexture = 0;
|
| - }
|
| -}
|
| -
|
| -bool TestPlugin::initProgram()
|
| -{
|
| - const std::string vertexSource(
|
| - "attribute vec4 position; \n"
|
| - "void main() { \n"
|
| - " gl_Position = position; \n"
|
| - "} \n"
|
| - );
|
| -
|
| - const std::string fragmentSource(
|
| - "precision mediump float; \n"
|
| - "uniform vec4 color; \n"
|
| - "void main() { \n"
|
| - " gl_FragColor = color; \n"
|
| - "} \n"
|
| - );
|
| -
|
| - m_scene.program = loadProgram(vertexSource, fragmentSource);
|
| - if (!m_scene.program)
|
| - return false;
|
| -
|
| - m_scene.colorLocation = m_context->getUniformLocation(m_scene.program, "color");
|
| - m_scene.positionLocation = m_context->getAttribLocation(m_scene.program, "position");
|
| - return true;
|
| -}
|
| -
|
| -bool TestPlugin::initPrimitive()
|
| -{
|
| - DCHECK_EQ(m_scene.primitive, PrimitiveTriangle);
|
| -
|
| - m_scene.vbo = m_context->createBuffer();
|
| - if (!m_scene.vbo)
|
| - return false;
|
| -
|
| - const float vertices[] = {
|
| - 0.0f, 0.8f, 0.0f,
|
| - -0.8f, -0.8f, 0.0f,
|
| - 0.8f, -0.8f, 0.0f };
|
| - m_context->bindBuffer(GL_ARRAY_BUFFER, m_scene.vbo);
|
| - m_context->bufferData(GL_ARRAY_BUFFER, sizeof(vertices), 0, GL_STATIC_DRAW);
|
| - m_context->bufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices);
|
| - return true;
|
| -}
|
| -
|
| -void TestPlugin::drawPrimitive()
|
| -{
|
| - DCHECK_EQ(m_scene.primitive, PrimitiveTriangle);
|
| - DCHECK(m_scene.vbo);
|
| - DCHECK(m_scene.program);
|
| -
|
| - m_context->useProgram(m_scene.program);
|
| -
|
| - // Bind primitive color.
|
| - float color[4];
|
| - premultiplyAlpha(m_scene.primitiveColor, m_scene.opacity, color);
|
| - m_context->uniform4f(m_scene.colorLocation, color[0], color[1], color[2], color[3]);
|
| -
|
| - // Bind primitive vertices.
|
| - m_context->bindBuffer(GL_ARRAY_BUFFER, m_scene.vbo);
|
| - m_context->enableVertexAttribArray(m_scene.positionLocation);
|
| - m_context->vertexAttribPointer(m_scene.positionLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
|
| - m_context->drawArrays(GL_TRIANGLES, 0, 3);
|
| -}
|
| -
|
| -unsigned TestPlugin::loadShader(unsigned type, const std::string& source)
|
| -{
|
| - unsigned shader = m_context->createShader(type);
|
| - if (shader) {
|
| - m_context->shaderSource(shader, source.data());
|
| - m_context->compileShader(shader);
|
| -
|
| - int compiled = 0;
|
| - m_context->getShaderiv(shader, GL_COMPILE_STATUS, &compiled);
|
| - if (!compiled) {
|
| - m_context->deleteShader(shader);
|
| - shader = 0;
|
| - }
|
| - }
|
| - return shader;
|
| -}
|
| -
|
| -unsigned TestPlugin::loadProgram(const std::string& vertexSource, const std::string& fragmentSource)
|
| -{
|
| - unsigned vertexShader = loadShader(GL_VERTEX_SHADER, vertexSource);
|
| - unsigned fragmentShader = loadShader(GL_FRAGMENT_SHADER, fragmentSource);
|
| - unsigned program = m_context->createProgram();
|
| - if (vertexShader && fragmentShader && program) {
|
| - m_context->attachShader(program, vertexShader);
|
| - m_context->attachShader(program, fragmentShader);
|
| - m_context->linkProgram(program);
|
| -
|
| - int linked = 0;
|
| - m_context->getProgramiv(program, GL_LINK_STATUS, &linked);
|
| - if (!linked) {
|
| - m_context->deleteProgram(program);
|
| - program = 0;
|
| - }
|
| - }
|
| - if (vertexShader)
|
| - m_context->deleteShader(vertexShader);
|
| - if (fragmentShader)
|
| - m_context->deleteShader(fragmentShader);
|
| -
|
| - return program;
|
| -}
|
| -
|
| -bool TestPlugin::handleInputEvent(const WebInputEvent& event, WebCursorInfo& info)
|
| -{
|
| - const char* eventName = 0;
|
| - switch (event.type) {
|
| - case WebInputEvent::Undefined: eventName = "unknown"; break;
|
| -
|
| - case WebInputEvent::MouseDown: eventName = "MouseDown"; break;
|
| - case WebInputEvent::MouseUp: eventName = "MouseUp"; break;
|
| - case WebInputEvent::MouseMove: eventName = "MouseMove"; break;
|
| - case WebInputEvent::MouseEnter: eventName = "MouseEnter"; break;
|
| - case WebInputEvent::MouseLeave: eventName = "MouseLeave"; break;
|
| - case WebInputEvent::ContextMenu: eventName = "ContextMenu"; break;
|
| -
|
| - case WebInputEvent::MouseWheel: eventName = "MouseWheel"; break;
|
| -
|
| - case WebInputEvent::RawKeyDown: eventName = "RawKeyDown"; break;
|
| - case WebInputEvent::KeyDown: eventName = "KeyDown"; break;
|
| - case WebInputEvent::KeyUp: eventName = "KeyUp"; break;
|
| - case WebInputEvent::Char: eventName = "Char"; break;
|
| -
|
| - case WebInputEvent::GestureScrollBegin: eventName = "GestureScrollBegin"; break;
|
| - case WebInputEvent::GestureScrollEnd: eventName = "GestureScrollEnd"; break;
|
| - case WebInputEvent::GestureScrollUpdateWithoutPropagation:
|
| - case WebInputEvent::GestureScrollUpdate: eventName = "GestureScrollUpdate"; break;
|
| - case WebInputEvent::GestureFlingStart: eventName = "GestureFlingStart"; break;
|
| - case WebInputEvent::GestureFlingCancel: eventName = "GestureFlingCancel"; break;
|
| - case WebInputEvent::GestureTap: eventName = "GestureTap"; break;
|
| - case WebInputEvent::GestureTapUnconfirmed:
|
| - eventName = "GestureTapUnconfirmed"; break;
|
| - case WebInputEvent::GestureTapDown: eventName = "GestureTapDown"; break;
|
| - case WebInputEvent::GestureShowPress: eventName = "GestureShowPress"; break;
|
| - case WebInputEvent::GestureTapCancel: eventName = "GestureTapCancel"; break;
|
| - case WebInputEvent::GestureDoubleTap: eventName = "GestureDoubleTap"; break;
|
| - case WebInputEvent::GestureTwoFingerTap: eventName = "GestureTwoFingerTap"; break;
|
| - case WebInputEvent::GestureLongPress: eventName = "GestureLongPress"; break;
|
| - case WebInputEvent::GestureLongTap: eventName = "GestureLongTap"; break;
|
| - case WebInputEvent::GesturePinchBegin: eventName = "GesturePinchBegin"; break;
|
| - case WebInputEvent::GesturePinchEnd: eventName = "GesturePinchEnd"; break;
|
| - case WebInputEvent::GesturePinchUpdate: eventName = "GesturePinchUpdate"; break;
|
| -
|
| - case WebInputEvent::TouchStart: eventName = "TouchStart"; break;
|
| - case WebInputEvent::TouchMove: eventName = "TouchMove"; break;
|
| - case WebInputEvent::TouchEnd: eventName = "TouchEnd"; break;
|
| - case WebInputEvent::TouchCancel: eventName = "TouchCancel"; break;
|
| - }
|
| -
|
| - m_delegate->printMessage(std::string("Plugin received event: ") + (eventName ? eventName : "unknown") + "\n");
|
| - if (m_printEventDetails)
|
| - printEventDetails(m_delegate, event);
|
| - if (m_printUserGestureStatus)
|
| - m_delegate->printMessage(std::string("* ") + (WebUserGestureIndicator::isProcessingUserGesture() ? "" : "not ") + "handling user gesture\n");
|
| - if (m_isPersistent)
|
| - m_delegate->printMessage(std::string("TestPlugin: isPersistent\n"));
|
| - return false;
|
| -}
|
| -
|
| -bool TestPlugin::handleDragStatusUpdate(WebDragStatus dragStatus, const WebDragData&, WebDragOperationsMask, const WebPoint& position, const WebPoint& screenPosition)
|
| -{
|
| - const char* dragStatusName = 0;
|
| - switch (dragStatus) {
|
| - case WebDragStatusEnter:
|
| - dragStatusName = "DragEnter";
|
| - break;
|
| - case WebDragStatusOver:
|
| - dragStatusName = "DragOver";
|
| - break;
|
| - case WebDragStatusLeave:
|
| - dragStatusName = "DragLeave";
|
| - break;
|
| - case WebDragStatusDrop:
|
| - dragStatusName = "DragDrop";
|
| - break;
|
| - case WebDragStatusUnknown:
|
| - NOTREACHED();
|
| - }
|
| - m_delegate->printMessage(std::string("Plugin received event: ") + dragStatusName + "\n");
|
| - return false;
|
| -}
|
| -
|
| -TestPlugin* TestPlugin::create(WebFrame* frame, const WebPluginParams& params, WebTestDelegate* delegate)
|
| -{
|
| - return new TestPlugin(frame, params, delegate);
|
| -}
|
| -
|
| -const WebString& TestPlugin::mimeType()
|
| -{
|
| - const CR_DEFINE_STATIC_LOCAL(WebString, kMimeType, ("application/x-webkit-test-webplugin"));
|
| - return kMimeType;
|
| -}
|
| -
|
| -const WebString& TestPlugin::canCreateWithoutRendererMimeType()
|
| -{
|
| - const CR_DEFINE_STATIC_LOCAL(WebString, kCanCreateWithoutRendererMimeType, ("application/x-webkit-test-webplugin-can-create-without-renderer"));
|
| - return kCanCreateWithoutRendererMimeType;
|
| -}
|
| -
|
| -const WebString& TestPlugin::pluginPersistsMimeType()
|
| -{
|
| - const CR_DEFINE_STATIC_LOCAL(WebString, kPluginPersistsMimeType, ("application/x-webkit-test-webplugin-persistent"));
|
| - return kPluginPersistsMimeType;
|
| -}
|
| -
|
| -bool TestPlugin::isSupportedMimeType(const WebString& mimeType)
|
| -{
|
| - return mimeType == TestPlugin::mimeType()
|
| - || mimeType == pluginPersistsMimeType()
|
| - || mimeType == canCreateWithoutRendererMimeType();
|
| -}
|
| -
|
| -} // namespace content
|
|
|