• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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