Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(96)

Side by Side Diff: Source/testing/runner/TestPlugin.cpp

Issue 23618022: BrowserPlugin/WebView - Move plugin lifetime to DOM (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Fix mac compile issue. Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011 Google Inc. All rights reserved. 2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 12 matching lines...) Expand all
23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */ 24 */
25 25
26 #include "TestPlugin.h" 26 #include "TestPlugin.h"
27 27
28 #include "TestCommon.h" 28 #include "TestCommon.h"
29 #include "public/platform/Platform.h" 29 #include "public/platform/Platform.h"
30 #include "public/platform/WebCompositorSupport.h" 30 #include "public/platform/WebCompositorSupport.h"
31 #include "public/platform/WebGraphicsContext3D.h" 31 #include "public/platform/WebGraphicsContext3D.h"
32 #include "public/testing/WebTestDelegate.h" 32 #include "public/testing/WebTestDelegate.h"
33 #include "public/web/WebBindings.h"
33 #include "public/web/WebFrame.h" 34 #include "public/web/WebFrame.h"
34 #include "public/web/WebInputEvent.h" 35 #include "public/web/WebInputEvent.h"
35 #include "public/web/WebKit.h" 36 #include "public/web/WebKit.h"
36 #include "public/web/WebPluginParams.h" 37 #include "public/web/WebPluginParams.h"
37 #include "public/web/WebTouchPoint.h" 38 #include "public/web/WebTouchPoint.h"
38 #include "public/web/WebUserGestureIndicator.h" 39 #include "public/web/WebUserGestureIndicator.h"
39 40
40 using namespace blink; 41 using namespace blink;
41 using namespace std; 42 using namespace std;
42 43
43 namespace WebTestRunner { 44 namespace WebTestRunner {
44 45
45 namespace { 46 namespace {
46 47
47 // GLenum values copied from gl2.h. 48 // GLenum values copied from gl2.h.
48 #define GL_FALSE 0 49 #define GL_FALSE 0
49 #define GL_TRUE 1 50 #define GL_TRUE 1
50 #define GL_ONE 1 51 #define GL_ONE 1
51 #define GL_TRIANGLES 0x0004 52 #define GL_TRIANGLES 0x0004
52 #define GL_ONE_MINUS_SRC_ALPHA 0x0303 53 #define GL_ONE_MINUS_SRC_ALPHA 0x0303
53 #define GL_DEPTH_TEST 0x0B71 54 #define GL_DEPTH_TEST 0x0B71
54 #define GL_BLEND 0x0BE2 55 #define GL_BLEND 0x0BE2
55 #define GL_SCISSOR_TEST 0x0B90
56 #define GL_TEXTURE_2D 0x0DE1 56 #define GL_TEXTURE_2D 0x0DE1
57 #define GL_FLOAT 0x1406 57 #define GL_FLOAT 0x1406
58 #define GL_RGBA 0x1908 58 #define GL_RGBA 0x1908
59 #define GL_UNSIGNED_BYTE 0x1401 59 #define GL_UNSIGNED_BYTE 0x1401
60 #define GL_TEXTURE_MAG_FILTER 0x2800 60 #define GL_TEXTURE_MAG_FILTER 0x2800
61 #define GL_TEXTURE_MIN_FILTER 0x2801 61 #define GL_TEXTURE_MIN_FILTER 0x2801
62 #define GL_TEXTURE_WRAP_S 0x2802 62 #define GL_TEXTURE_WRAP_S 0x2802
63 #define GL_TEXTURE_WRAP_T 0x2803 63 #define GL_TEXTURE_WRAP_T 0x2803
64 #define GL_NEAREST 0x2600 64 #define GL_NEAREST 0x2600
65 #define GL_COLOR_BUFFER_BIT 0x4000
66 #define GL_CLAMP_TO_EDGE 0x812F 65 #define GL_CLAMP_TO_EDGE 0x812F
67 #define GL_ARRAY_BUFFER 0x8892 66 #define GL_ARRAY_BUFFER 0x8892
68 #define GL_STATIC_DRAW 0x88E4 67 #define GL_STATIC_DRAW 0x88E4
69 #define GL_FRAGMENT_SHADER 0x8B30 68 #define GL_FRAGMENT_SHADER 0x8B30
70 #define GL_VERTEX_SHADER 0x8B31 69 #define GL_VERTEX_SHADER 0x8B31
71 #define GL_COMPILE_STATUS 0x8B81 70 #define GL_COMPILE_STATUS 0x8B81
72 #define GL_LINK_STATUS 0x8B82 71 #define GL_LINK_STATUS 0x8B82
73 #define GL_COLOR_ATTACHMENT0 0x8CE0 72 #define GL_COLOR_ATTACHMENT0 0x8CE0
74 #define GL_FRAMEBUFFER_COMPLETE 0x8CD5 73 #define GL_FRAMEBUFFER_COMPLETE 0x8CD5
75 #define GL_FRAMEBUFFER 0x8D40 74 #define GL_FRAMEBUFFER 0x8D40
76 75
76 // Mac defines these elsewhere and doesn't like duplicates.
eseidel 2013/12/18 18:38:18 Why are we defining these in TestPlugin.cpp in teh
wjmaclean 2013/12/23 23:49:53 I'm not sure, though I would imagine that one reas
77 #ifndef GL_SCISSOR_TEST
78 #define GL_SCISSOR_TEST 0x0B90
79 #endif
80 #ifndef GL_COLOR_BUFFER_BIT
81 #define GL_COLOR_BUFFER_BIT 0x4000
82 #endif
83
77 void premultiplyAlpha(const unsigned colorIn[3], float alpha, float colorOut[4]) 84 void premultiplyAlpha(const unsigned colorIn[3], float alpha, float colorOut[4])
78 { 85 {
79 for (int i = 0; i < 3; ++i) 86 for (int i = 0; i < 3; ++i)
80 colorOut[i] = (colorIn[i] / 255.0f) * alpha; 87 colorOut[i] = (colorIn[i] / 255.0f) * alpha;
81 88
82 colorOut[3] = alpha; 89 colorOut[3] = alpha;
83 } 90 }
84 91
85 const char* pointState(WebTouchPoint::State state) 92 const char* pointState(WebTouchPoint::State state)
86 { 93 {
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
140 } 147 }
141 148
142 void deferredDelete(void* context) 149 void deferredDelete(void* context)
143 { 150 {
144 TestPlugin* plugin = static_cast<TestPlugin*>(context); 151 TestPlugin* plugin = static_cast<TestPlugin*>(context);
145 delete plugin; 152 delete plugin;
146 } 153 }
147 154
148 } 155 }
149 156
157 static int s_instanceCount = 0;
150 158
151 TestPlugin::TestPlugin(WebFrame* frame, const WebPluginParams& params, WebTestDe legate* delegate) 159 TestPlugin::TestPlugin(WebFrame* frame, const WebPluginParams& params, WebTestDe legate* delegate)
152 : m_frame(frame) 160 : m_frame(frame)
153 , m_delegate(delegate) 161 , m_delegate(delegate)
154 , m_container(0) 162 , m_container(0)
155 , m_context(0) 163 , m_context(0)
156 , m_colorTexture(0) 164 , m_colorTexture(0)
157 , m_mailboxChanged(false) 165 , m_mailboxChanged(false)
158 , m_framebuffer(0) 166 , m_framebuffer(0)
159 , m_touchEventRequest(WebPluginContainer::TouchEventRequestTypeNone) 167 , m_touchEventRequest(WebPluginContainer::TouchEventRequestTypeNone)
160 , m_reRequestTouchEvents(false) 168 , m_reRequestTouchEvents(false)
161 , m_printEventDetails(false) 169 , m_printEventDetails(false)
162 , m_printUserGestureStatus(false) 170 , m_printUserGestureStatus(false)
163 , m_canProcessDrag(false) 171 , m_canProcessDrag(false)
172 , m_npObject(0)
173 , m_instanceId(++s_instanceCount)
174 , m_isPersistent(params.mimeType.utf8().find(pluginPersistsSuffix().utf8()) != std::string::npos)
175 , m_canCreateWithoutRenderer(params.mimeType.utf8().find(canCreateWithoutRen dererSuffix().utf8()) != std::string::npos)
eseidel 2013/12/18 18:38:18 Why all the .utf8? Does this not have a contains(
wjmaclean 2013/12/23 23:49:53 No longer using find()
164 { 176 {
165 static const WebString kAttributePrimitive = WebString::fromUTF8("primitive" ); 177 static const WebString kAttributePrimitive = WebString::fromUTF8("primitive" );
166 static const WebString kAttributeBackgroundColor = WebString::fromUTF8("back ground-color"); 178 static const WebString kAttributeBackgroundColor = WebString::fromUTF8("back ground-color");
167 static const WebString kAttributePrimitiveColor = WebString::fromUTF8("primi tive-color"); 179 static const WebString kAttributePrimitiveColor = WebString::fromUTF8("primi tive-color");
168 static const WebString kAttributeOpacity = WebString::fromUTF8("opacity"); 180 static const WebString kAttributeOpacity = WebString::fromUTF8("opacity");
169 static const WebString kAttributeAcceptsTouch = WebString::fromUTF8("accepts -touch"); 181 static const WebString kAttributeAcceptsTouch = WebString::fromUTF8("accepts -touch");
170 static const WebString kAttributeReRequestTouchEvents = WebString::fromUTF8( "re-request-touch"); 182 static const WebString kAttributeReRequestTouchEvents = WebString::fromUTF8( "re-request-touch");
171 static const WebString kAttributePrintEventDetails = WebString::fromUTF8("pr int-event-details"); 183 static const WebString kAttributePrintEventDetails = WebString::fromUTF8("pr int-event-details");
172 static const WebString kAttributeCanProcessDrag = WebString::fromUTF8("can-p rocess-drag"); 184 static const WebString kAttributeCanProcessDrag = WebString::fromUTF8("can-p rocess-drag");
173 static const WebString kAttributePrintUserGestureStatus = WebString::fromUTF 8("print-user-gesture-status"); 185 static const WebString kAttributePrintUserGestureStatus = WebString::fromUTF 8("print-user-gesture-status");
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 230
219 m_layer = WebScopedPtr<WebExternalTextureLayer>(Platform::current()->composi torSupport()->createExternalTextureLayer(this)); 231 m_layer = WebScopedPtr<WebExternalTextureLayer>(Platform::current()->composi torSupport()->createExternalTextureLayer(this));
220 m_container = container; 232 m_container = container;
221 m_container->setWebLayer(m_layer->layer()); 233 m_container->setWebLayer(m_layer->layer());
222 if (m_reRequestTouchEvents) { 234 if (m_reRequestTouchEvents) {
223 m_container->requestTouchEventType(WebPluginContainer::TouchEventRequest TypeSynthesizedMouse); 235 m_container->requestTouchEventType(WebPluginContainer::TouchEventRequest TypeSynthesizedMouse);
224 m_container->requestTouchEventType(WebPluginContainer::TouchEventRequest TypeRaw); 236 m_container->requestTouchEventType(WebPluginContainer::TouchEventRequest TypeRaw);
225 } 237 }
226 m_container->requestTouchEventType(m_touchEventRequest); 238 m_container->requestTouchEventType(m_touchEventRequest);
227 m_container->setWantsWheelEvents(true); 239 m_container->setWantsWheelEvents(true);
240 m_container->allowScriptObjects();
228 return true; 241 return true;
229 } 242 }
230 243
231 void TestPlugin::destroy() 244 void TestPlugin::destroy()
232 { 245 {
233 if (m_layer.get()) 246 if (m_layer.get())
234 m_layer->clearTexture(); 247 m_layer->clearTexture();
235 if (m_container) 248 if (m_container)
236 m_container->setWebLayer(0); 249 m_container->setWebLayer(0);
237 m_layer.reset(); 250 m_layer.reset();
238 destroyScene(); 251 destroyScene();
239 252
240 delete m_context; 253 delete m_context;
241 m_context = 0; 254 m_context = 0;
242 255
243 m_container = 0; 256 m_container = 0;
244 m_frame = 0; 257 m_frame = 0;
245 258
246 Platform::current()->callOnMainThread(deferredDelete, this); 259 Platform::current()->callOnMainThread(deferredDelete, this);
247 } 260 }
248 261
262 class TestPluginNPObject : public NPObject {
263 public:
264 TestPluginNPObject(TestPlugin* plugin): m_plugin(plugin) { }
265 ~TestPluginNPObject() { }
266
267 // This is a raw pointer; we assume this object doesn't outlive the associat ed
268 // plugin object.
269 TestPlugin* m_plugin;
270 };
271
272 NPObject* TestPluginBindingsAllocate(NPP npp, NPClass* nppClass)
273 {
274 return new TestPluginNPObject(static_cast<TestPlugin*>(npp->pdata));
275 }
276
277 WebString NPIdentifierToString(const NPIdentifier& npIdentifier)
278 {
279 NPUTF8* nputF8 = blink::WebBindings::utf8FromIdentifier(npIdentifier);
280 WebString identifier = WebString::fromUTF8(nputF8);
281 free(nputF8);
eseidel 2013/12/18 18:38:18 Do we have a OwnPtr-like concept for this instead?
wjmaclean 2013/12/23 23:49:53 I'm unsure ... aren't all the owned-ptr types base
282 return identifier;
283 }
284
285 static const WebString kPropertyInstanceId = WebString::fromUTF8("instanceId");
286 static const WebString kPropertyIsPersistent = WebString::fromUTF8("isPersistent ");
287 static const WebString kPropertyCanCreateWithoutRenderer = WebString::fromUTF8(" canCreateWithoutRenderer");
288
289 bool TestPluginBindingsHasProperty(NPObject* npObject, NPIdentifier name)
290 {
291 WebString nameString = NPIdentifierToString(name);
292 return nameString == kPropertyInstanceId || nameString == kPropertyIsPersist ent || nameString == kPropertyCanCreateWithoutRenderer;
293 }
294
295 bool TestPluginBindingsGetProperty(NPObject* npObject, NPIdentifier name, NPVari ant* result)
296 {
297 if (!npObject)
298 return false;
299
300 WebString nameString = NPIdentifierToString(name);
301 if (nameString == kPropertyInstanceId)
302 INT32_TO_NPVARIANT(static_cast<TestPluginNPObject*>(npObject)->m_plugin- >instanceId(), *result);
eseidel 2013/12/18 18:38:18 Should we pull this cast out into a local?
wjmaclean 2013/12/23 23:49:53 Done.
303
304 if (nameString == kPropertyIsPersistent)
305 BOOLEAN_TO_NPVARIANT(static_cast<TestPluginNPObject*>(npObject)->m_plugi n->isPersistent(), *result);
306
307 if (nameString == kPropertyCanCreateWithoutRenderer)
308 BOOLEAN_TO_NPVARIANT(static_cast<TestPluginNPObject*>(npObject)->m_plugi n->canCreateWithoutRenderer(), *result);
309
310 return true;
311 }
312
313 bool TestPluginBindingsSetProperty(NPObject* npObject, NPIdentifier, const NPVar iant*result)
314 {
315 // For now, all properties are read-only.
316 return false;
317 }
318
319 NPClass testPluginClass = {
320 NP_CLASS_STRUCT_VERSION,
321 &TestPluginBindingsAllocate,
322 0,
323 0,
324 0,
325 0,
326 0,
327 &TestPluginBindingsHasProperty,
328 &TestPluginBindingsGetProperty,
329 &TestPluginBindingsSetProperty,
330 0,
331 0,
332 };
333
334 NPObject* TestPlugin::scriptableObject()
335 {
336 if (!m_npObject) {
337 m_NPP.reset(new NPP_t);
338 m_NPP->pdata = this;
339 m_NPP->ndata = 0;
340 m_npObject = blink::WebBindings::createObject(m_NPP.get(), &testPluginCl ass);
341 blink::WebBindings::retainObject(m_npObject);
342 }
343 return m_npObject;
344 }
345
249 void TestPlugin::updateGeometry(const WebRect& frameRect, const WebRect& clipRec t, const WebVector<WebRect>& cutOutsRects, bool isVisible) 346 void TestPlugin::updateGeometry(const WebRect& frameRect, const WebRect& clipRec t, const WebVector<WebRect>& cutOutsRects, bool isVisible)
250 { 347 {
251 if (clipRect == m_rect) 348 if (clipRect == m_rect)
252 return; 349 return;
253 m_rect = clipRect; 350 m_rect = clipRect;
254 if (m_rect.isEmpty()) 351 if (m_rect.isEmpty())
255 return; 352 return;
256 353
257 m_context->reshapeWithScaleFactor(m_rect.width, m_rect.height, 1.f); 354 m_context->reshapeWithScaleFactor(m_rect.width, m_rect.height, 1.f);
258 m_context->viewport(0, 0, m_rect.width, m_rect.height); 355 m_context->viewport(0, 0, m_rect.width, m_rect.height);
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after
571 { 668 {
572 return new TestPlugin(frame, params, delegate); 669 return new TestPlugin(frame, params, delegate);
573 } 670 }
574 671
575 const WebString& TestPlugin::mimeType() 672 const WebString& TestPlugin::mimeType()
576 { 673 {
577 static const WebString kMimeType = WebString::fromUTF8("application/x-webkit -test-webplugin"); 674 static const WebString kMimeType = WebString::fromUTF8("application/x-webkit -test-webplugin");
578 return kMimeType; 675 return kMimeType;
579 } 676 }
580 677
678 const WebString& TestPlugin::canCreateWithoutRendererSuffix()
679 {
680 static const WebString kCanCreateWithoutRendererSuffix = WebString::fromUTF 8("-can-create-without-renderer");
681 return kCanCreateWithoutRendererSuffix;
581 } 682 }
683
684 const WebString& TestPlugin::pluginPersistsSuffix()
685 {
686 static const WebString kPluginPersistsSuffix = WebString::fromUTF8("-persist ent");
687 return kPluginPersistsSuffix;
688 }
689
690 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698