1 /*
2 * Copyright (C) 2010 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26 #include "config.h"
27 #include "NetscapePlugin.h"
28
29 #include "NPRuntimeObjectMap.h"
30 #include "NetscapePluginStream.h"
31 #include "PluginController.h"
32 #include "ShareableBitmap.h"
33 #include <WebCore/GraphicsContext.h>
34 #include <WebCore/HTTPHeaderMap.h>
35 #include <WebCore/IntRect.h>
36 #include <WebCore/KURL.h>
37 #include <utility>
38 #include <wtf/text/CString.h>
39
40 using namespace WebCore;
41 using namespace std;
42
43 namespace WebKit {
44
45 // The plug-in that we're currently calling NPP_New for.
46 static NetscapePlugin* currentNPPNewPlugin;
47
create(PassRefPtr<NetscapePluginModule> pluginModule)48 PassRefPtr<NetscapePlugin> NetscapePlugin::create(PassRefPtr<NetscapePluginModule> pluginModule)
49 {
50 if (!pluginModule)
51 return 0;
52
53 return adoptRef(new NetscapePlugin(pluginModule));
54 }
55
NetscapePlugin(PassRefPtr<NetscapePluginModule> pluginModule)56 NetscapePlugin::NetscapePlugin(PassRefPtr<NetscapePluginModule> pluginModule)
57 : m_pluginController(0)
58 , m_nextRequestID(0)
59 , m_pluginModule(pluginModule)
60 , m_npWindow()
61 , m_isStarted(false)
62 #if PLATFORM(MAC)
63 , m_isWindowed(false)
64 #else
65 , m_isWindowed(true)
66 #endif
67 , m_isTransparent(false)
68 , m_inNPPNew(false)
69 , m_loadManually(false)
70 #if PLATFORM(MAC)
71 , m_drawingModel(static_cast<NPDrawingModel>(-1))
72 , m_eventModel(static_cast<NPEventModel>(-1))
73 , m_currentMouseEvent(0)
74 , m_pluginHasFocus(false)
75 , m_windowHasFocus(false)
76 #ifndef NP_NO_CARBON
77 , m_nullEventTimer(RunLoop::main(), this, &NetscapePlugin::nullEventTimerFired)
78 , m_npCGContext()
79 #endif
80 #elif PLUGIN_ARCHITECTURE(X11)
81 , m_drawable(0)
82 , m_pluginDisplay(0)
83 #endif
84 {
85 m_npp.ndata = this;
86 m_npp.pdata = 0;
87
88 m_pluginModule->incrementLoadCount();
89 }
90
~NetscapePlugin()91 NetscapePlugin::~NetscapePlugin()
92 {
93 ASSERT(!m_isStarted);
94
95 m_pluginModule->decrementLoadCount();
96 }
97
fromNPP(NPP npp)98 PassRefPtr<NetscapePlugin> NetscapePlugin::fromNPP(NPP npp)
99 {
100 if (npp)
101 return static_cast<NetscapePlugin*>(npp->ndata);
102
103 // FIXME: Return the current NetscapePlugin here.
104 ASSERT_NOT_REACHED();
105 return 0;
106 }
107
invalidate(const NPRect * invalidRect)108 void NetscapePlugin::invalidate(const NPRect* invalidRect)
109 {
110 IntRect rect;
111
112 if (!invalidRect)
113 rect = IntRect(0, 0, m_frameRect.width(), m_frameRect.height());
114 else
115 rect = IntRect(invalidRect->left, invalidRect->top,
116 invalidRect->right - invalidRect->left, invalidRect->bottom - invalidRect->top);
117
118 if (platformInvalidate(rect))
119 return;
120
121 m_pluginController->invalidate(rect);
122 }
123
userAgent(NPP npp)124 const char* NetscapePlugin::userAgent(NPP npp)
125 {
126 if (npp)
127 return fromNPP(npp)->userAgent();
128
129 if (currentNPPNewPlugin)
130 return currentNPPNewPlugin->userAgent();
131
132 return 0;
133 }
134
userAgent()135 const char* NetscapePlugin::userAgent()
136 {
137 if (m_userAgent.isNull()) {
138 m_userAgent = m_pluginController->userAgent().utf8();
139 ASSERT(!m_userAgent.isNull());
140 }
141 return m_userAgent.data();
142 }
143
loadURL(const String & method,const String & urlString,const String & target,const HTTPHeaderMap & headerFields,const Vector<uint8_t> & httpBody,bool sendNotification,void * notificationData)144 void NetscapePlugin::loadURL(const String& method, const String& urlString, const String& target, const HTTPHeaderMap& headerFields, const Vector<uint8_t>& httpBody,
145 bool sendNotification, void* notificationData)
146 {
147 uint64_t requestID = ++m_nextRequestID;
148
149 m_pluginController->loadURL(requestID, method, urlString, target, headerFields, httpBody, allowPopups());
150
151 if (target.isNull()) {
152 // The browser is going to send the data in a stream, create a plug-in stream.
153 RefPtr<NetscapePluginStream> pluginStream = NetscapePluginStream::create(this, requestID, sendNotification, notificationData);
154 ASSERT(!m_streams.contains(requestID));
155
156 m_streams.set(requestID, pluginStream.release());
157 return;
158 }
159
160 if (sendNotification) {
161 // Eventually we are going to get a frameDidFinishLoading or frameDidFail call for this request.
162 // Keep track of the notification data so we can call NPP_URLNotify.
163 ASSERT(!m_pendingURLNotifications.contains(requestID));
164 m_pendingURLNotifications.set(requestID, make_pair(urlString, notificationData));
165 }
166 }
167
destroyStream(NPStream * stream,NPReason reason)168 NPError NetscapePlugin::destroyStream(NPStream* stream, NPReason reason)
169 {
170 NetscapePluginStream* pluginStream = 0;
171
172 for (StreamsMap::const_iterator it = m_streams.begin(), end = m_streams.end(); it != end; ++it) {
173 if (it->second->npStream() == stream) {
174 pluginStream = it->second.get();
175 break;
176 }
177 }
178
179 if (!pluginStream)
180 return NPERR_INVALID_INSTANCE_ERROR;
181
182 return pluginStream->destroy(reason);
183 }
184
setIsWindowed(bool isWindowed)185 void NetscapePlugin::setIsWindowed(bool isWindowed)
186 {
187 // Once the plugin has started, it's too late to change whether the plugin is windowed or not.
188 // (This is true in Firefox and Chrome, too.) Disallow setting m_isWindowed in that case to
189 // keep our internal state consistent.
190 if (m_isStarted)
191 return;
192
193 m_isWindowed = isWindowed;
194 }
195
setIsTransparent(bool isTransparent)196 void NetscapePlugin::setIsTransparent(bool isTransparent)
197 {
198 m_isTransparent = isTransparent;
199 }
200
setStatusbarText(const String & statusbarText)201 void NetscapePlugin::setStatusbarText(const String& statusbarText)
202 {
203 m_pluginController->setStatusbarText(statusbarText);
204 }
205
setException(const String & exceptionString)206 void NetscapePlugin::setException(const String& exceptionString)
207 {
208 // FIXME: If the plug-in is running in its own process, this needs to send a CoreIPC message instead of
209 // calling the runtime object map directly.
210 NPRuntimeObjectMap::setGlobalException(exceptionString);
211 }
212
evaluate(NPObject * npObject,const String & scriptString,NPVariant * result)213 bool NetscapePlugin::evaluate(NPObject* npObject, const String& scriptString, NPVariant* result)
214 {
215 return m_pluginController->evaluate(npObject, scriptString, result, allowPopups());
216 }
217
isPrivateBrowsingEnabled()218 bool NetscapePlugin::isPrivateBrowsingEnabled()
219 {
220 return m_pluginController->isPrivateBrowsingEnabled();
221 }
222
windowScriptNPObject()223 NPObject* NetscapePlugin::windowScriptNPObject()
224 {
225 return m_pluginController->windowScriptNPObject();
226 }
227
pluginElementNPObject()228 NPObject* NetscapePlugin::pluginElementNPObject()
229 {
230 return m_pluginController->pluginElementNPObject();
231 }
232
cancelStreamLoad(NetscapePluginStream * pluginStream)233 void NetscapePlugin::cancelStreamLoad(NetscapePluginStream* pluginStream)
234 {
235 if (pluginStream == m_manualStream) {
236 m_pluginController->cancelManualStreamLoad();
237 return;
238 }
239
240 // Ask the plug-in controller to cancel this stream load.
241 m_pluginController->cancelStreamLoad(pluginStream->streamID());
242 }
243
removePluginStream(NetscapePluginStream * pluginStream)244 void NetscapePlugin::removePluginStream(NetscapePluginStream* pluginStream)
245 {
246 if (pluginStream == m_manualStream) {
247 m_manualStream = 0;
248 return;
249 }
250
251 ASSERT(m_streams.get(pluginStream->streamID()) == pluginStream);
252 m_streams.remove(pluginStream->streamID());
253 }
254
isAcceleratedCompositingEnabled()255 bool NetscapePlugin::isAcceleratedCompositingEnabled()
256 {
257 #if USE(ACCELERATED_COMPOSITING)
258 return m_pluginController->isAcceleratedCompositingEnabled();
259 #else
260 return false;
261 #endif
262 }
263
pushPopupsEnabledState(bool state)264 void NetscapePlugin::pushPopupsEnabledState(bool state)
265 {
266 m_popupEnabledStates.append(state);
267 }
268
popPopupsEnabledState()269 void NetscapePlugin::popPopupsEnabledState()
270 {
271 ASSERT(!m_popupEnabledStates.isEmpty());
272
273 m_popupEnabledStates.removeLast();
274 }
275
proxiesForURL(const String & urlString)276 String NetscapePlugin::proxiesForURL(const String& urlString)
277 {
278 return m_pluginController->proxiesForURL(urlString);
279 }
280
cookiesForURL(const String & urlString)281 String NetscapePlugin::cookiesForURL(const String& urlString)
282 {
283 return m_pluginController->cookiesForURL(urlString);
284 }
285
setCookiesForURL(const String & urlString,const String & cookieString)286 void NetscapePlugin::setCookiesForURL(const String& urlString, const String& cookieString)
287 {
288 m_pluginController->setCookiesForURL(urlString, cookieString);
289 }
290
NPP_New(NPMIMEType pluginType,uint16_t mode,int16_t argc,char * argn[],char * argv[],NPSavedData * savedData)291 NPError NetscapePlugin::NPP_New(NPMIMEType pluginType, uint16_t mode, int16_t argc, char* argn[], char* argv[], NPSavedData* savedData)
292 {
293 return m_pluginModule->pluginFuncs().newp(pluginType, &m_npp, mode, argc, argn, argv, savedData);
294 }
295
NPP_Destroy(NPSavedData ** savedData)296 NPError NetscapePlugin::NPP_Destroy(NPSavedData** savedData)
297 {
298 return m_pluginModule->pluginFuncs().destroy(&m_npp, savedData);
299 }
300
NPP_SetWindow(NPWindow * npWindow)301 NPError NetscapePlugin::NPP_SetWindow(NPWindow* npWindow)
302 {
303 return m_pluginModule->pluginFuncs().setwindow(&m_npp, npWindow);
304 }
305
NPP_NewStream(NPMIMEType mimeType,NPStream * stream,NPBool seekable,uint16_t * streamType)306 NPError NetscapePlugin::NPP_NewStream(NPMIMEType mimeType, NPStream* stream, NPBool seekable, uint16_t* streamType)
307 {
308 return m_pluginModule->pluginFuncs().newstream(&m_npp, mimeType, stream, seekable, streamType);
309 }
310
NPP_DestroyStream(NPStream * stream,NPReason reason)311 NPError NetscapePlugin::NPP_DestroyStream(NPStream* stream, NPReason reason)
312 {
313 return m_pluginModule->pluginFuncs().destroystream(&m_npp, stream, reason);
314 }
315
NPP_StreamAsFile(NPStream * stream,const char * filename)316 void NetscapePlugin::NPP_StreamAsFile(NPStream* stream, const char* filename)
317 {
318 return m_pluginModule->pluginFuncs().asfile(&m_npp, stream, filename);
319 }
320
NPP_WriteReady(NPStream * stream)321 int32_t NetscapePlugin::NPP_WriteReady(NPStream* stream)
322 {
323 return m_pluginModule->pluginFuncs().writeready(&m_npp, stream);
324 }
325
NPP_Write(NPStream * stream,int32_t offset,int32_t len,void * buffer)326 int32_t NetscapePlugin::NPP_Write(NPStream* stream, int32_t offset, int32_t len, void* buffer)
327 {
328 return m_pluginModule->pluginFuncs().write(&m_npp, stream, offset, len, buffer);
329 }
330
NPP_HandleEvent(void * event)331 int16_t NetscapePlugin::NPP_HandleEvent(void* event)
332 {
333 return m_pluginModule->pluginFuncs().event(&m_npp, event);
334 }
335
NPP_URLNotify(const char * url,NPReason reason,void * notifyData)336 void NetscapePlugin::NPP_URLNotify(const char* url, NPReason reason, void* notifyData)
337 {
338 m_pluginModule->pluginFuncs().urlnotify(&m_npp, url, reason, notifyData);
339 }
340
NPP_GetValue(NPPVariable variable,void * value)341 NPError NetscapePlugin::NPP_GetValue(NPPVariable variable, void *value)
342 {
343 if (!m_pluginModule->pluginFuncs().getvalue)
344 return NPERR_GENERIC_ERROR;
345
346 return m_pluginModule->pluginFuncs().getvalue(&m_npp, variable, value);
347 }
348
NPP_SetValue(NPNVariable variable,void * value)349 NPError NetscapePlugin::NPP_SetValue(NPNVariable variable, void *value)
350 {
351 if (!m_pluginModule->pluginFuncs().setvalue)
352 return NPERR_GENERIC_ERROR;
353
354 return m_pluginModule->pluginFuncs().setvalue(&m_npp, variable, value);
355 }
356
callSetWindow()357 void NetscapePlugin::callSetWindow()
358 {
359 #if PLUGIN_ARCHITECTURE(X11)
360 // We use a backing store as the painting area for the plugin.
361 m_npWindow.x = 0;
362 m_npWindow.y = 0;
363 #else
364 m_npWindow.x = m_frameRect.x();
365 m_npWindow.y = m_frameRect.y();
366 #endif
367 m_npWindow.width = m_frameRect.width();
368 m_npWindow.height = m_frameRect.height();
369 m_npWindow.clipRect.top = m_clipRect.y();
370 m_npWindow.clipRect.left = m_clipRect.x();
371 m_npWindow.clipRect.bottom = m_clipRect.maxY();
372 m_npWindow.clipRect.right = m_clipRect.maxX();
373
374 NPP_SetWindow(&m_npWindow);
375 }
376
shouldLoadSrcURL()377 bool NetscapePlugin::shouldLoadSrcURL()
378 {
379 // Check if we should cancel the load
380 NPBool cancelSrcStream = false;
381
382 if (NPP_GetValue(NPPVpluginCancelSrcStream, &cancelSrcStream) != NPERR_NO_ERROR)
383 return true;
384
385 return !cancelSrcStream;
386 }
387
streamFromID(uint64_t streamID)388 NetscapePluginStream* NetscapePlugin::streamFromID(uint64_t streamID)
389 {
390 return m_streams.get(streamID).get();
391 }
392
stopAllStreams()393 void NetscapePlugin::stopAllStreams()
394 {
395 Vector<RefPtr<NetscapePluginStream> > streams;
396 copyValuesToVector(m_streams, streams);
397
398 for (size_t i = 0; i < streams.size(); ++i)
399 streams[i]->stop(NPRES_USER_BREAK);
400 }
401
allowPopups() const402 bool NetscapePlugin::allowPopups() const
403 {
404 if (m_pluginModule->pluginFuncs().version >= NPVERS_HAS_POPUPS_ENABLED_STATE) {
405 if (!m_popupEnabledStates.isEmpty())
406 return m_popupEnabledStates.last();
407 }
408
409 // FIXME: Check if the current event is a user gesture.
410 // Really old versions of Flash required this for popups to work, but all newer versions
411 // support NPN_PushPopupEnabledState/NPN_PopPopupEnabledState.
412 return false;
413 }
414
initialize(PluginController * pluginController,const Parameters & parameters)415 bool NetscapePlugin::initialize(PluginController* pluginController, const Parameters& parameters)
416 {
417 ASSERT(!m_pluginController);
418 ASSERT(pluginController);
419
420 m_pluginController = pluginController;
421
422 uint16_t mode = parameters.loadManually ? NP_FULL : NP_EMBED;
423
424 m_loadManually = parameters.loadManually;
425
426 CString mimeTypeCString = parameters.mimeType.utf8();
427
428 ASSERT(parameters.names.size() == parameters.values.size());
429
430 Vector<CString> paramNames;
431 Vector<CString> paramValues;
432 for (size_t i = 0; i < parameters.names.size(); ++i) {
433 paramNames.append(parameters.names[i].utf8());
434 paramValues.append(parameters.values[i].utf8());
435 }
436
437 // The strings that these pointers point to are kept alive by paramNames and paramValues.
438 Vector<const char*> names;
439 Vector<const char*> values;
440 for (size_t i = 0; i < paramNames.size(); ++i) {
441 names.append(paramNames[i].data());
442 values.append(paramValues[i].data());
443 }
444
445 #if PLATFORM(MAC)
446 if (m_pluginModule->pluginQuirks().contains(PluginQuirks::MakeTransparentIfBackgroundAttributeExists)) {
447 for (size_t i = 0; i < parameters.names.size(); ++i) {
448 if (equalIgnoringCase(parameters.names[i], "background")) {
449 setIsTransparent(true);
450 break;
451 }
452 }
453 }
454 #endif
455
456 NetscapePlugin* previousNPPNewPlugin = currentNPPNewPlugin;
457
458 m_inNPPNew = true;
459 currentNPPNewPlugin = this;
460
461 NPError error = NPP_New(const_cast<char*>(mimeTypeCString.data()), mode, names.size(),
462 const_cast<char**>(names.data()), const_cast<char**>(values.data()), 0);
463
464 m_inNPPNew = false;
465 currentNPPNewPlugin = previousNPPNewPlugin;
466
467 if (error != NPERR_NO_ERROR)
468 return false;
469
470 m_isStarted = true;
471
472 // FIXME: This is not correct in all cases.
473 m_npWindow.type = NPWindowTypeDrawable;
474
475 if (!platformPostInitialize()) {
476 destroy();
477 return false;
478 }
479
480 // Load the src URL if needed.
481 if (!parameters.loadManually && !parameters.url.isEmpty() && shouldLoadSrcURL())
482 loadURL("GET", parameters.url.string(), String(), HTTPHeaderMap(), Vector<uint8_t>(), false, 0);
483
484 return true;
485 }
486
destroy()487 void NetscapePlugin::destroy()
488 {
489 ASSERT(m_isStarted);
490
491 // Stop all streams.
492 stopAllStreams();
493
494 #if !PLUGIN_ARCHITECTURE(MAC)
495 m_npWindow.window = 0;
496 callSetWindow();
497 #endif
498
499 NPP_Destroy(0);
500
501 m_isStarted = false;
502 m_pluginController = 0;
503
504 platformDestroy();
505 }
506
paint(GraphicsContext * context,const IntRect & dirtyRect)507 void NetscapePlugin::paint(GraphicsContext* context, const IntRect& dirtyRect)
508 {
509 ASSERT(m_isStarted);
510
511 platformPaint(context, dirtyRect);
512 }
513
snapshot()514 PassRefPtr<ShareableBitmap> NetscapePlugin::snapshot()
515 {
516 if (!supportsSnapshotting() || m_frameRect.isEmpty())
517 return 0;
518
519 ASSERT(m_isStarted);
520
521 RefPtr<ShareableBitmap> bitmap = ShareableBitmap::createShareable(m_frameRect.size(), ShareableBitmap::SupportsAlpha);
522 OwnPtr<GraphicsContext> context = bitmap->createGraphicsContext();
523
524 context->translate(-m_frameRect.x(), -m_frameRect.y());
525
526 platformPaint(context.get(), m_frameRect, true);
527
528 return bitmap.release();
529 }
530
isTransparent()531 bool NetscapePlugin::isTransparent()
532 {
533 return m_isTransparent;
534 }
535
geometryDidChange(const IntRect & frameRect,const IntRect & clipRect)536 void NetscapePlugin::geometryDidChange(const IntRect& frameRect, const IntRect& clipRect)
537 {
538 ASSERT(m_isStarted);
539
540 if (m_frameRect == frameRect && m_clipRect == clipRect) {
541 // Nothing to do.
542 return;
543 }
544
545 m_frameRect = frameRect;
546 m_clipRect = clipRect;
547
548 platformGeometryDidChange();
549 callSetWindow();
550 }
551
frameDidFinishLoading(uint64_t requestID)552 void NetscapePlugin::frameDidFinishLoading(uint64_t requestID)
553 {
554 ASSERT(m_isStarted);
555
556 PendingURLNotifyMap::iterator it = m_pendingURLNotifications.find(requestID);
557 if (it == m_pendingURLNotifications.end())
558 return;
559
560 String url = it->second.first;
561 void* notificationData = it->second.second;
562
563 m_pendingURLNotifications.remove(it);
564
565 NPP_URLNotify(url.utf8().data(), NPRES_DONE, notificationData);
566 }
567
frameDidFail(uint64_t requestID,bool wasCancelled)568 void NetscapePlugin::frameDidFail(uint64_t requestID, bool wasCancelled)
569 {
570 ASSERT(m_isStarted);
571
572 PendingURLNotifyMap::iterator it = m_pendingURLNotifications.find(requestID);
573 if (it == m_pendingURLNotifications.end())
574 return;
575
576 String url = it->second.first;
577 void* notificationData = it->second.second;
578
579 m_pendingURLNotifications.remove(it);
580
581 NPP_URLNotify(url.utf8().data(), wasCancelled ? NPRES_USER_BREAK : NPRES_NETWORK_ERR, notificationData);
582 }
583
didEvaluateJavaScript(uint64_t requestID,const String & requestURLString,const String & result)584 void NetscapePlugin::didEvaluateJavaScript(uint64_t requestID, const String& requestURLString, const String& result)
585 {
586 ASSERT(m_isStarted);
587
588 if (NetscapePluginStream* pluginStream = streamFromID(requestID))
589 pluginStream->sendJavaScriptStream(requestURLString, result);
590 }
591
streamDidReceiveResponse(uint64_t streamID,const KURL & responseURL,uint32_t streamLength,uint32_t lastModifiedTime,const String & mimeType,const String & headers)592 void NetscapePlugin::streamDidReceiveResponse(uint64_t streamID, const KURL& responseURL, uint32_t streamLength,
593 uint32_t lastModifiedTime, const String& mimeType, const String& headers)
594 {
595 ASSERT(m_isStarted);
596
597 if (NetscapePluginStream* pluginStream = streamFromID(streamID))
598 pluginStream->didReceiveResponse(responseURL, streamLength, lastModifiedTime, mimeType, headers);
599 }
600
streamDidReceiveData(uint64_t streamID,const char * bytes,int length)601 void NetscapePlugin::streamDidReceiveData(uint64_t streamID, const char* bytes, int length)
602 {
603 ASSERT(m_isStarted);
604
605 if (NetscapePluginStream* pluginStream = streamFromID(streamID))
606 pluginStream->didReceiveData(bytes, length);
607 }
608
streamDidFinishLoading(uint64_t streamID)609 void NetscapePlugin::streamDidFinishLoading(uint64_t streamID)
610 {
611 ASSERT(m_isStarted);
612
613 if (NetscapePluginStream* pluginStream = streamFromID(streamID))
614 pluginStream->didFinishLoading();
615 }
616
streamDidFail(uint64_t streamID,bool wasCancelled)617 void NetscapePlugin::streamDidFail(uint64_t streamID, bool wasCancelled)
618 {
619 ASSERT(m_isStarted);
620
621 if (NetscapePluginStream* pluginStream = streamFromID(streamID))
622 pluginStream->didFail(wasCancelled);
623 }
624
manualStreamDidReceiveResponse(const KURL & responseURL,uint32_t streamLength,uint32_t lastModifiedTime,const String & mimeType,const String & headers)625 void NetscapePlugin::manualStreamDidReceiveResponse(const KURL& responseURL, uint32_t streamLength, uint32_t lastModifiedTime,
626 const String& mimeType, const String& headers)
627 {
628 ASSERT(m_isStarted);
629 ASSERT(m_loadManually);
630 ASSERT(!m_manualStream);
631
632 m_manualStream = NetscapePluginStream::create(this, 0, false, 0);
633 m_manualStream->didReceiveResponse(responseURL, streamLength, lastModifiedTime, mimeType, headers);
634 }
635
manualStreamDidReceiveData(const char * bytes,int length)636 void NetscapePlugin::manualStreamDidReceiveData(const char* bytes, int length)
637 {
638 ASSERT(m_isStarted);
639 ASSERT(m_loadManually);
640 ASSERT(m_manualStream);
641
642 m_manualStream->didReceiveData(bytes, length);
643 }
644
manualStreamDidFinishLoading()645 void NetscapePlugin::manualStreamDidFinishLoading()
646 {
647 ASSERT(m_isStarted);
648 ASSERT(m_loadManually);
649 ASSERT(m_manualStream);
650
651 m_manualStream->didFinishLoading();
652 }
653
manualStreamDidFail(bool wasCancelled)654 void NetscapePlugin::manualStreamDidFail(bool wasCancelled)
655 {
656 ASSERT(m_isStarted);
657 ASSERT(m_loadManually);
658 ASSERT(m_manualStream);
659
660 m_manualStream->didFail(wasCancelled);
661 }
662
handleMouseEvent(const WebMouseEvent & mouseEvent)663 bool NetscapePlugin::handleMouseEvent(const WebMouseEvent& mouseEvent)
664 {
665 ASSERT(m_isStarted);
666
667 return platformHandleMouseEvent(mouseEvent);
668 }
669
handleWheelEvent(const WebWheelEvent & wheelEvent)670 bool NetscapePlugin::handleWheelEvent(const WebWheelEvent& wheelEvent)
671 {
672 ASSERT(m_isStarted);
673
674 return platformHandleWheelEvent(wheelEvent);
675 }
676
handleMouseEnterEvent(const WebMouseEvent & mouseEvent)677 bool NetscapePlugin::handleMouseEnterEvent(const WebMouseEvent& mouseEvent)
678 {
679 ASSERT(m_isStarted);
680
681 return platformHandleMouseEnterEvent(mouseEvent);
682 }
683
handleMouseLeaveEvent(const WebMouseEvent & mouseEvent)684 bool NetscapePlugin::handleMouseLeaveEvent(const WebMouseEvent& mouseEvent)
685 {
686 ASSERT(m_isStarted);
687
688 return platformHandleMouseLeaveEvent(mouseEvent);
689 }
690
handleKeyboardEvent(const WebKeyboardEvent & keyboardEvent)691 bool NetscapePlugin::handleKeyboardEvent(const WebKeyboardEvent& keyboardEvent)
692 {
693 ASSERT(m_isStarted);
694
695 return platformHandleKeyboardEvent(keyboardEvent);
696 }
697
setFocus(bool hasFocus)698 void NetscapePlugin::setFocus(bool hasFocus)
699 {
700 ASSERT(m_isStarted);
701
702 platformSetFocus(hasFocus);
703 }
704
pluginScriptableNPObject()705 NPObject* NetscapePlugin::pluginScriptableNPObject()
706 {
707 ASSERT(m_isStarted);
708 NPObject* scriptableNPObject = 0;
709
710 if (NPP_GetValue(NPPVpluginScriptableNPObject, &scriptableNPObject) != NPERR_NO_ERROR)
711 return 0;
712
713 return scriptableNPObject;
714 }
715
privateBrowsingStateChanged(bool privateBrowsingEnabled)716 void NetscapePlugin::privateBrowsingStateChanged(bool privateBrowsingEnabled)
717 {
718 ASSERT(m_isStarted);
719
720 // From https://wiki.mozilla.org/Plugins:PrivateMode
721 // When the browser turns private mode on or off it will call NPP_SetValue for "NPNVprivateModeBool"
722 // (assigned enum value 18) with a pointer to an NPBool value on all applicable instances.
723 // Plugins should check the boolean value pointed to, not the pointer itself.
724 // The value will be true when private mode is on.
725 NPBool value = privateBrowsingEnabled;
726 NPP_SetValue(NPNVprivateModeBool, &value);
727 }
728
supportsSnapshotting() const729 bool NetscapePlugin::supportsSnapshotting() const
730 {
731 #if PLATFORM(MAC)
732 return m_pluginModule && m_pluginModule->pluginQuirks().contains(PluginQuirks::SupportsSnapshotting);
733 #endif
734 return false;
735 }
736
controller()737 PluginController* NetscapePlugin::controller()
738 {
739 return m_pluginController;
740 }
741
742 } // namespace WebKit
743