[WTF] Import std::optional reference implementation as WTF::Optional
[WebKit-https.git] / Source / WebKit / mac / Plugins / WebNetscapePluginView.mm
index 3d0e3b2..d9e58e3 100644 (file)
@@ -10,7 +10,7 @@
  * 2.  Redistributions in binary form must reproduce the above copyright
  *     notice, this list of conditions and the following disclaimer in the
  *     documentation and/or other materials provided with the distribution. 
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * 3.  Neither the name of Apple Inc. ("Apple") nor the names of
  *     its contributors may be used to endorse or promote products derived
  *     from this software without specific prior written permission. 
  *
 #import "WebNSURLExtras.h"
 #import "WebNSURLRequestExtras.h"
 #import "WebNSViewExtras.h"
-#import "WebNetscapeContainerCheckContextInfo.h"
-#import "WebNetscapeContainerCheckPrivate.h"
 #import "WebNetscapePluginEventHandler.h"
 #import "WebNetscapePluginPackage.h"
 #import "WebNetscapePluginStream.h"
-#import "WebPluginContainerCheck.h"
 #import "WebPluginRequest.h"
 #import "WebPreferences.h"
 #import "WebUIDelegatePrivate.h"
 #import <WebCore/FrameTree.h>
 #import <WebCore/FrameView.h>
 #import <WebCore/HTMLPlugInElement.h>
-#import <WebCore/Page.h> 
-#import <WebCore/PluginMainThreadScheduler.h>
+#import <WebCore/NP_jsobject.h>
+#import <WebCore/Page.h>
 #import <WebCore/ProxyServer.h>
 #import <WebCore/ScriptController.h>
 #import <WebCore/SecurityOrigin.h>
 #import <WebCore/SoftLinking.h> 
+#import <WebCore/UserGestureIndicator.h>
 #import <WebCore/WebCoreObjCExtras.h>
 #import <WebCore/WebCoreURLResponse.h>
 #import <WebCore/npruntime_impl.h>
-#import <WebKit/DOMPrivate.h>
-#import <WebKit/WebUIDelegate.h>
-#import <objc/objc-runtime.h>
+#import <WebCore/runtime_root.h>
+#import <WebKitLegacy/DOMPrivate.h>
+#import <WebKitLegacy/WebUIDelegate.h>
+#import <objc/runtime.h>
 #import <runtime/InitializeThreading.h>
 #import <runtime/JSLock.h>
 #import <wtf/Assertions.h>
-#import <wtf/Threading.h>
+#import <wtf/MainThread.h>
+#import <wtf/RunLoop.h>
 #import <wtf/text/CString.h>
 
 #define LoginWindowDidSwitchFromUserNotification    @"WebLoginWindowDidSwitchFromUserNotification"
@@ -89,7 +89,6 @@ static const int WKNVSilverlightFullscreenPerformanceIssueFixed = 7288546; /* TR
 
 using namespace WebCore;
 using namespace WebKit;
-using namespace std;
 
 static inline bool isDrawingModelQuickDraw(NPDrawingModel drawingModel)
 {
@@ -134,7 +133,7 @@ public:
         double timeInterval = m_interval / 1000.0;
         
         if (throttle)
-            timeInterval = max(timeInterval, ThrottledTimerInterval);
+            timeInterval = std::max(timeInterval, ThrottledTimerInterval);
         
         if (m_repeat)
             startRepeating(timeInterval);
@@ -193,9 +192,7 @@ typedef struct {
 {
     JSC::initializeThreading();
     WTF::initializeMainThreadToProcessMainThread();
-#ifndef BUILDING_ON_TIGER
-    WebCoreObjCFinalizeOnMainThread(self);
-#endif
+    RunLoop::initializeMainRunLoop();
     WKSendUserChangeNotifications();
 }
 
@@ -667,16 +664,13 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
     [self willCallPlugInFunction];
     // Set the pluginAllowPopup flag.
     ASSERT(_eventHandler);
-    bool oldAllowPopups = frame->script()->allowPopupsFromPlugin();
-    frame->script()->setAllowPopupsFromPlugin(_eventHandler->currentEventIsUserGesture());    
     {
-        JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
+        JSC::JSLock::DropAllLocks dropAllLocks(JSDOMWindowBase::commonVM());
+        UserGestureIndicator gestureIndicator(_eventHandler->currentEventIsUserGesture() ? std::optional<ProcessingUserGestureState>(ProcessingUserGesture) : std::nullopt);
         acceptedEvent = [_pluginPackage.get() pluginFuncs]->event(plugin, event);
     }
-    // Restore the old pluginAllowPopup flag.
-    frame->script()->setAllowPopupsFromPlugin(oldAllowPopups);     
     [self didCallPlugInFunction];
-        
+
     if (portState) {
         if ([self currentWindow])
             [self restorePortState:portState];
@@ -710,11 +704,8 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
     if (!timers)
         return;
 
-    HashMap<uint32_t, PluginTimer*>::const_iterator end = timers->end();
-    for (HashMap<uint32_t, PluginTimer*>::const_iterator it = timers->begin(); it != end; ++it) {
-        PluginTimer* timer = it->second;
-        timer->stop();
-    }    
+    for (auto& it: timers->values())
+        it->stop();
 }
 
 - (void)startTimers
@@ -728,11 +719,9 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
     if (!timers)
         return;
     
-    HashMap<uint32_t, PluginTimer*>::const_iterator end = timers->end();
-    for (HashMap<uint32_t, PluginTimer*>::const_iterator it = timers->begin(); it != end; ++it) {
-        PluginTimer* timer = it->second;
-        ASSERT(!timer->isActive());
-        timer->start(_isCompletelyObscured);
+    for (auto& it: timers->values()) {
+        ASSERT(!it->isActive());
+        it->start(_isCompletelyObscured);
     }    
 }
 
@@ -852,7 +841,7 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
 
     [self willCallPlugInFunction];
     {
-        JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
+        JSC::JSLock::DropAllLocks dropAllLocks(JSDOMWindowBase::commonVM());
         if ([_pluginPackage.get() pluginFuncs]->setvalue)
             [_pluginPackage.get() pluginFuncs]->setvalue(plugin, NPNVprivateModeBool, &value);
     }
@@ -993,7 +982,7 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
         inSetWindow = YES;        
         [self willCallPlugInFunction];
         {
-            JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
+            JSC::JSLock::DropAllLocks dropAllLocks(JSDOMWindowBase::commonVM());
             npErr = [_pluginPackage.get() pluginFuncs]->setwindow(plugin, &window);
         }
         [self didCallPlugInFunction];
@@ -1088,36 +1077,32 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
     }        
 #endif // NP_NO_CARBON
     
-#ifndef BUILDING_ON_TIGER
     if (drawingModel == NPDrawingModelCoreAnimation) {
         void *value = 0;
         if ([_pluginPackage.get() pluginFuncs]->getvalue(plugin, NPPVpluginCoreAnimationLayer, &value) == NPERR_NO_ERROR && value) {
 
             // The plug-in gives us a retained layer.
-            _pluginLayer.adoptNS((CALayer *)value);
+            _pluginLayer = adoptNS((CALayer *)value);
 
             BOOL accleratedCompositingEnabled = false;
-#if USE(ACCELERATED_COMPOSITING)
             accleratedCompositingEnabled = [[[self webView] preferences] acceleratedCompositingEnabled];
-#endif
             if (accleratedCompositingEnabled) {
                 // FIXME: This code can be shared between WebHostedNetscapePluginView and WebNetscapePluginView.
-#ifndef BUILDING_ON_LEOPARD
                 // Since this layer isn't going to be inserted into a view, we need to create another layer and flip its geometry
                 // in order to get the coordinate system right.
-                RetainPtr<CALayer> realPluginLayer(AdoptNS, _pluginLayer.releaseRef());
+                RetainPtr<CALayer> realPluginLayer = adoptNS(_pluginLayer.leakRef());
                 
-                _pluginLayer.adoptNS([[CALayer alloc] init]);
+                _pluginLayer = adoptNS([[CALayer alloc] init]);
                 _pluginLayer.get().bounds = realPluginLayer.get().bounds;
                 _pluginLayer.get().geometryFlipped = YES;
 
                 realPluginLayer.get().autoresizingMask = kCALayerWidthSizable | kCALayerHeightSizable;
                 [_pluginLayer.get() addSublayer:realPluginLayer.get()];
-#endif
-                // Eagerly enter compositing mode, since we know we'll need it. This avoids firing setNeedsStyleRecalc()
+
+                // Eagerly enter compositing mode, since we know we'll need it. This avoids firing invalidateStyle()
                 // for iframes that contain composited plugins at bad times. https://bugs.webkit.org/show_bug.cgi?id=39033
                 core([self webFrame])->view()->enterCompositingMode();
-                [self element]->setNeedsStyleRecalc(SyntheticStyleChange);
+                [self element]->invalidateStyleAndLayerComposition();
             } else
                 [self setWantsLayer:YES];
 
@@ -1126,7 +1111,6 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
 
         ASSERT(_pluginLayer);
     }
-#endif
     
     // Create the event handler
     _eventHandler = WebNetscapePluginEventHandler::create(self);
@@ -1134,7 +1118,6 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
     return YES;
 }
 
-#ifndef BUILDING_ON_TIGER
 // FIXME: This method is an ideal candidate to move up to the base class
 - (CALayer *)pluginLayer
 {
@@ -1151,7 +1134,6 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
         [newLayer addSublayer:_pluginLayer.get()];
     }
 }
-#endif
 
 - (void)loadStream
 {
@@ -1167,7 +1149,7 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
     // Check for this and don't start a load in this case.
     if (_sourceURL && ![_sourceURL.get() _web_isEmpty]) {
         NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:_sourceURL.get()];
-        [request _web_setHTTPReferrer:core([self webFrame])->loader()->outgoingReferrer()];
+        [request _web_setHTTPReferrer:core([self webFrame])->loader().outgoingReferrer()];
         [self loadRequest:request inTarget:nil withNotifyData:nil sendNotification:NO];
     } 
 }
@@ -1191,25 +1173,24 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
     // To stop active streams it's necessary to invoke stop() on a copy 
     // of streams. This is because calling WebNetscapePluginStream::stop() also has the side effect
     // of removing a stream from this hash set.
-    Vector<RefPtr<WebNetscapePluginStream> > streamsCopy;
+    Vector<RefPtr<WebNetscapePluginStream>> streamsCopy;
     copyToVector(streams, streamsCopy);
-    for (size_t i = 0; i < streamsCopy.size(); i++)
-        streamsCopy[i]->stop();
-    
-    [[_pendingFrameLoads.get() allKeys] makeObjectsPerformSelector:@selector(_setInternalLoadDelegate:) withObject:nil];
+    for (auto& stream: streamsCopy)
+        stream->stop();
+
+    for (WebFrame *frame in [_pendingFrameLoads keyEnumerator])
+        [frame _setInternalLoadDelegate:nil];
     [NSObject cancelPreviousPerformRequestsWithTarget:self];
 
     // Setting the window type to 0 ensures that NPP_SetWindow will be called if the plug-in is restarted.
     lastSetWindow.type = (NPWindowType)0;
     
-#ifndef BUILDING_ON_TIGER
-    _pluginLayer = 0;
-#endif
+    _pluginLayer = nil;
     
     [self _destroyPlugin];
     [_pluginPackage.get() close];
     
-    _eventHandler.clear();
+    _eventHandler = nullptr;
 }
 
 - (NPEventModel)eventModel
@@ -1265,83 +1246,6 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
     }
 }
 
-- (uint32_t)checkIfAllowedToLoadURL:(const char*)urlCString frame:(const char*)frameNameCString 
-                       callbackFunc:(void (*)(NPP npp, uint32_t checkID, NPBool allowed, void* context))callbackFunc 
-                            context:(void*)context
-{
-    if (!_containerChecksInProgress) 
-        _containerChecksInProgress = [[NSMutableDictionary alloc] init];
-    
-    NSString *frameName = frameNameCString ? [NSString stringWithCString:frameNameCString encoding:NSISOLatin1StringEncoding] : nil;
-    
-    ++_currentContainerCheckRequestID;
-    WebNetscapeContainerCheckContextInfo *contextInfo = [[WebNetscapeContainerCheckContextInfo alloc] initWithCheckRequestID:_currentContainerCheckRequestID 
-                                                                                                                callbackFunc:callbackFunc
-                                                                                                                      context:context];
-    
-    WebPluginContainerCheck *check = [WebPluginContainerCheck checkWithRequest:[self requestWithURLCString:urlCString]
-                                                                        target:frameName
-                                                                  resultObject:self
-                                                                      selector:@selector(_containerCheckResult:contextInfo:)
-                                                                    controller:self 
-                                                                   contextInfo:contextInfo];
-    
-    [contextInfo release];
-    [_containerChecksInProgress setObject:check forKey:[NSNumber numberWithInt:_currentContainerCheckRequestID]];
-    [check start];
-    
-    return _currentContainerCheckRequestID;
-}
-
-- (void)_containerCheckResult:(PolicyAction)policy contextInfo:(id)contextInfo
-{
-    ASSERT([contextInfo isKindOfClass:[WebNetscapeContainerCheckContextInfo class]]);
-    void (*pluginCallback)(NPP npp, uint32_t, NPBool, void*) = [contextInfo callback];
-    
-    if (!pluginCallback) {
-        ASSERT_NOT_REACHED();
-        return;
-    }
-    
-    pluginCallback([self plugin], [contextInfo checkRequestID], (policy == PolicyUse), [contextInfo context]);
-}
-
-- (void)cancelCheckIfAllowedToLoadURL:(uint32_t)checkID
-{
-    WebPluginContainerCheck *check = (WebPluginContainerCheck *)[_containerChecksInProgress objectForKey:[NSNumber numberWithInt:checkID]];
-    
-    if (!check)
-        return;
-    
-    [check cancel];
-    [_containerChecksInProgress removeObjectForKey:[NSNumber numberWithInt:checkID]];
-}
-
-// WebPluginContainerCheck automatically calls this method after invoking our _containerCheckResult: selector.
-// It works this way because calling -[WebPluginContainerCheck cancel] allows it to do it's teardown process.
-- (void)_webPluginContainerCancelCheckIfAllowedToLoadRequest:(id)webPluginContainerCheck
-{
-    ASSERT([webPluginContainerCheck isKindOfClass:[WebPluginContainerCheck class]]);
-    WebPluginContainerCheck *check = (WebPluginContainerCheck *)webPluginContainerCheck;
-    ASSERT([[check contextInfo] isKindOfClass:[WebNetscapeContainerCheckContextInfo class]]);
-    
-    [self cancelCheckIfAllowedToLoadURL:[[check contextInfo] checkRequestID]];
-}
-
-#ifdef BUILDING_ON_TIGER
-// The Tiger compiler requires these two methods be present. Otherwise it doesn't think WebNetscapePluginView
-// conforms to the WebPluginContainerCheckController protocol.
-- (WebView *)webView
-{
-    return [super webView];   
-}
-
-- (WebFrame *)webFrame
-{
-    return [super webFrame];   
-}
-#endif
-
 // MARK: NSVIEW
 
 - (id)initWithFrame:(NSRect)frame
@@ -1357,9 +1261,9 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
     self = [super initWithFrame:frame pluginPackage:pluginPackage URL:URL baseURL:baseURL MIMEType:MIME attributeKeys:keys attributeValues:values loadManually:loadManually element:element];
     if (!self)
         return nil;
-    _pendingFrameLoads.adoptNS([[NSMutableDictionary alloc] init]);
-    
+
+    _pendingFrameLoads = adoptNS([[NSMapTable alloc] initWithKeyOptions:NSPointerFunctionsStrongMemory valueOptions:NSPointerFunctionsStrongMemory capacity:0]);
+
     // load the plug-in if it is not already loaded
     if (![pluginPackage load]) {
         [self release];
@@ -1390,13 +1294,6 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
     free(cValues);
     
     ASSERT(!_eventHandler);
-    
-    if (timers) {
-        deleteAllValues(*timers);
-        delete timers;
-    }  
-    
-    [_containerChecksInProgress release];
 }
 
 - (void)disconnectStream:(WebNetscapePluginStream*)stream
@@ -1414,16 +1311,6 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
     [super dealloc];
 }
 
-- (void)finalize
-{
-    ASSERT_MAIN_THREAD();
-    ASSERT(!_isStarted);
-
-    [self fini];
-
-    [super finalize];
-}
-
 - (void)drawRect:(NSRect)rect
 {
     if (_cachedSnapshot) {
@@ -1465,7 +1352,7 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
     NPError error;
     [self willCallPlugInFunction];
     {
-        JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
+        JSC::JSLock::DropAllLocks dropAllLocks(JSDOMWindowBase::commonVM());
         error = [_pluginPackage.get() pluginFuncs]->getvalue(plugin, NPPVpluginScriptableNPObject, &value);
     }
     [self didCallPlugInFunction];
@@ -1475,6 +1362,26 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
     return value;
 }
 
+- (BOOL)getFormValue:(NSString **)value
+{
+    if (![_pluginPackage.get() pluginFuncs]->getvalue || !_isStarted)
+        return false;
+    // Plugins will allocate memory for the buffer by using NPN_MemAlloc().
+    char* buffer = NULL;
+    NPError error;
+    [self willCallPlugInFunction];
+    {
+        JSC::JSLock::DropAllLocks dropAllLocks(JSDOMWindowBase::commonVM());
+        error = [_pluginPackage.get() pluginFuncs]->getvalue(plugin, NPPVformValue, &buffer);
+    }
+    [self didCallPlugInFunction];
+    if (error != NPERR_NO_ERROR || !buffer)
+        return false;
+    *value = [[NSString alloc] initWithUTF8String:buffer];
+    [_pluginPackage.get() browserFuncs]->memfree(buffer);
+    return true;
+}
+
 - (void)willCallPlugInFunction
 {
     ASSERT(plugin);
@@ -1501,7 +1408,7 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
     ASSERT(_loadManually);
     ASSERT(!_manualStream);
 
-    _manualStream = WebNetscapePluginStream::create(core([self webFrame])->loader());
+    _manualStream = WebNetscapePluginStream::create(&core([self webFrame])->loader());
 }
 
 - (void)pluginView:(NSView *)pluginView receivedData:(NSData *)data
@@ -1596,7 +1503,7 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
         if ([JSPluginRequest sendNotification]) {
             [self willCallPlugInFunction];
             {
-                JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
+                JSC::JSLock::DropAllLocks dropAllLocks(JSDOMWindowBase::commonVM());
                 [_pluginPackage.get() pluginFuncs]->urlnotify(plugin, [URL _web_URLCString], NPRES_DONE, [JSPluginRequest notifyData]);
             }
             [self didCallPlugInFunction];
@@ -1607,7 +1514,7 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
         
         RefPtr<WebNetscapePluginStream> stream = WebNetscapePluginStream::create([NSURLRequest requestWithURL:URL], plugin, [JSPluginRequest sendNotification], [JSPluginRequest notifyData]);
         
-        RetainPtr<NSURLResponse> response(AdoptNS, [[NSURLResponse alloc] initWithURL:URL 
+        RetainPtr<NSURLResponse> response = adoptNS([[NSURLResponse alloc] initWithURL:URL 
                                                                              MIMEType:@"text/plain" 
                                                                 expectedContentLength:[JSData length]
                                                                      textEncodingName:nil]);
@@ -1622,18 +1529,18 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
 {
     ASSERT(_isStarted);
     
-    WebPluginRequest *pluginRequest = [_pendingFrameLoads.get() objectForKey:webFrame];
+    WebPluginRequest *pluginRequest = [_pendingFrameLoads objectForKey:webFrame];
     ASSERT(pluginRequest != nil);
     ASSERT([pluginRequest sendNotification]);
         
     [self willCallPlugInFunction];
     {
-        JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
+        JSC::JSLock::DropAllLocks dropAllLocks(JSDOMWindowBase::commonVM());
         [_pluginPackage.get() pluginFuncs]->urlnotify(plugin, [[[pluginRequest request] URL] _web_URLCString], reason, [pluginRequest notifyData]);
     }
     [self didCallPlugInFunction];
     
-    [_pendingFrameLoads.get() removeObjectForKey:webFrame];
+    [_pendingFrameLoads removeObjectForKey:webFrame];
     [webFrame _setInternalLoadDelegate:nil];
 }
 
@@ -1659,7 +1566,7 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
     if (frameName) {
         // FIXME - need to get rid of this window creation which
         // bypasses normal targeted link handling
-        frame = kit(core([self webFrame])->loader()->findFrameForNavigation(frameName));
+        frame = kit(core([self webFrame])->loader().findFrameForNavigation(frameName));
         if (frame == nil) {
             WebView *currentWebView = [self webView];
             NSDictionary *features = [[NSDictionary alloc] init];
@@ -1672,7 +1579,7 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
                 if ([pluginRequest sendNotification]) {
                     [self willCallPlugInFunction];
                     {
-                        JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
+                        JSC::JSLock::DropAllLocks dropAllLocks(JSDOMWindowBase::commonVM());
                         [_pluginPackage.get() pluginFuncs]->urlnotify(plugin, [[[pluginRequest request] URL] _web_URLCString], NPERR_GENERIC_ERROR, [pluginRequest notifyData]);
                     }
                     [self didCallPlugInFunction];
@@ -1681,7 +1588,7 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
             }
             
             frame = [newWebView mainFrame];
-            core(frame)->tree()->setName(frameName);
+            core(frame)->tree().setName(frameName);
             [[newWebView _UIDelegateForwarder] webViewShow:newWebView];
         }
     }
@@ -1699,7 +1606,7 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
                 ASSERT([view isKindOfClass:[WebNetscapePluginView class]]);
                 [view webFrame:frame didFinishLoadWithReason:NPRES_USER_BREAK];
             }
-            [_pendingFrameLoads.get() _webkit_setObject:pluginRequest forUncopiedKey:frame];
+            [_pendingFrameLoads setObject:pluginRequest forKey:frame];
             [frame _setInternalLoadDelegate:self];
         }
     }
@@ -1725,7 +1632,7 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
 
     // don't let a plugin start any loads if it is no longer part of a document that is being 
     // displayed unless the loads are in the same frame as the plugin.
-    if ([[self dataSource] _documentLoader] != core([self webFrame])->loader()->activeDocumentLoader() &&
+    if ([[self dataSource] _documentLoader] != core([self webFrame])->loader().activeDocumentLoader() &&
         (!cTarget || [frame findFrameNamed:target] != frame)) {
         return NPERR_GENERIC_ERROR; 
     }
@@ -1746,7 +1653,7 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
     }
         
     if (cTarget || JSString) {
-        // Make when targetting a frame or evaluating a JS string, perform the request after a delay because we don't
+        // Make when targeting a frame or evaluating a JS string, perform the request after a delay because we don't
         // want to potentially kill the plug-in inside of its URL request.
         
         if (JSString && target && [frame findFrameNamed:target] != frame) {
@@ -1819,7 +1726,7 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
         } else {
             path = bufString;
         }
-        postData = [NSData dataWithContentsOfFile:[path _webkit_fixedCarbonPOSIXPath]];
+        postData = [NSData dataWithContentsOfFile:path];
         CFRelease(bufString);
         if (!postData) {
             return NPERR_FILE_NOT_FOUND;
@@ -1852,7 +1759,7 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
                 NSString *contentLength = [header objectForKey:@"Content-Length"];
 
                 if (contentLength != nil)
-                    dataLength = min<unsigned>([contentLength intValue], dataLength);
+                    dataLength = std::min<unsigned>([contentLength intValue], dataLength);
                 [header removeObjectForKey:@"Content-Length"];
 
                 if ([header count] > 0) {
@@ -1999,11 +1906,11 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
 
 - (NPError)getVariable:(NPNVariable)variable value:(void *)value
 {
-    switch (variable) {
+    switch (static_cast<unsigned>(variable)) {
         case NPNVWindowNPObject:
         {
             Frame* frame = core([self webFrame]);
-            NPObject* windowScriptObject = frame ? frame->script()->windowScriptNPObject() : 0;
+            NPObject* windowScriptObject = frame ? frame->script().windowScriptNPObject() : 0;
 
             // Return value is expected to be retained, as described here: <http://www.mozilla.org/projects/plugins/npruntime.html#browseraccess>
             if (windowScriptObject)
@@ -2017,17 +1924,26 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
 
         case NPNVPluginElementNPObject:
         {
-            if (!_element)
-                return NPERR_GENERIC_ERROR;
-            
-            NPObject *plugInScriptObject = _element->getNPObject();
+            if (!_elementNPObject) {
+                if (!_element)
+                    return NPERR_GENERIC_ERROR;
+
+                Frame* frame = core(self.webFrame);
+                if (!frame)
+                    return NPERR_GENERIC_ERROR;
+
+                JSC::JSObject* object = frame->script().jsObjectForPluginElement(_element.get());
+                if (!object)
+                    _elementNPObject = _NPN_CreateNoScriptObject();
+                else
+                    _elementNPObject = _NPN_CreateScriptObject(0, object, frame->script().bindingRootObject());
+            }
 
             // Return value is expected to be retained, as described here: <http://www.mozilla.org/projects/plugins/npruntime.html#browseraccess>
-            if (plugInScriptObject)
-                _NPN_RetainObject(plugInScriptObject);
+            if (_elementNPObject)
+                _NPN_RetainObject(_elementNPObject);
 
-            void **v = (void **)value;
-            *v = plugInScriptObject;
+            *(void **)value = _elementNPObject;
 
             return NPERR_NO_ERROR;
         }
@@ -2060,11 +1976,7 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
         
         case NPNVsupportsCoreAnimationBool:
         {
-#ifdef BUILDING_ON_TIGER
-            *(NPBool *)value = FALSE;
-#else
             *(NPBool *)value = TRUE;
-#endif
             return NPERR_NO_ERROR;
         }
             
@@ -2088,18 +2000,12 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
             return NPERR_NO_ERROR;
         }
 
-        case WKNVBrowserContainerCheckFuncs:
-        {
-            *(WKNBrowserContainerCheckFuncs **)value = browserContainerCheckFuncs();
-            return NPERR_NO_ERROR;
-        }
-#if USE(ACCELERATED_COMPOSITING)
         case WKNVSupportsCompositingCoreAnimationPluginsBool:
         {
             *(NPBool *)value = [[[self webView] preferences] acceleratedCompositingEnabled];
             return NPERR_NO_ERROR;
         }
-#endif
+
         default:
             break;
     }
@@ -2124,9 +2030,7 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
                 case NPDrawingModelQuickDraw:
 #endif
                 case NPDrawingModelCoreGraphics:
-#ifndef BUILDING_ON_TIGER
                 case NPDrawingModelCoreAnimation:
-#endif
                     drawingModel = newDrawingModel;
                     return NPERR_NO_ERROR;
                     
@@ -2173,20 +2077,21 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
         return 0;
     
     if (!timers)
-        timers = new HashMap<uint32_t, PluginTimer*>;
-    
+        timers = std::make_unique<HashMap<uint32_t, std::unique_ptr<PluginTimer>>>();
+
+    std::unique_ptr<PluginTimer>* slot;
     uint32_t timerID;
-    
-    do {
+    do
         timerID = ++currentTimerID;
-    } while (timers->contains(timerID) || timerID == 0);
-    
-    PluginTimer* timer = new PluginTimer(plugin, timerID, interval, repeat, timerFunc);
-    timers->set(timerID, timer);
+    while (!timers->isValidKey(timerID) || *(slot = &timers->add(timerID, nullptr).iterator->value));
+
+    auto timer = std::make_unique<PluginTimer>(plugin, timerID, interval, repeat, timerFunc);
 
     if (_shouldFireTimers)
         timer->start(_isCompletelyObscured);
     
+    *slot = WTFMove(timer);
+
     return timerID;
 }
 
@@ -2195,8 +2100,7 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
     if (!timers)
         return;
     
-    if (PluginTimer* timer = timers->take(timerID))
-        delete timer;
+    timers->remove(timerID);
 }
 
 - (NPError)popUpContextMenu:(NPMenu *)menu
@@ -2223,7 +2127,11 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
                 break;
             
             if (Frame* frame = core([self webFrame])) {
-                String cookieString = cookies(frame->document(), URL); 
+                auto* document = frame->document();
+                if (!document)
+                    break;
+
+                String cookieString = cookies(*document, URL);
                 CString cookieStringUTF8 = cookieString.utf8();
                 if (cookieStringUTF8.isNull())
                     return NPERR_GENERIC_ERROR;
@@ -2238,7 +2146,6 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
             break;
         }
         case NPNURLVProxy: {
-#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
             if (!value)
                 break;
             
@@ -2256,9 +2163,6 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
                *length = proxiesUTF8.length();
             
             return NPERR_NO_ERROR;
-#else
-            break;
-#endif
         }
     }
     return NPERR_GENERIC_ERROR;
@@ -2277,7 +2181,8 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
                 break;
             
             if (Frame* frame = core([self webFrame])) {
-                setCookies(frame->document(), URL, cookieString);
+                if (auto* document = frame->document())
+                    setCookies(*document, URL, cookieString);
                 return NPERR_NO_ERROR;
             }
             
@@ -2313,17 +2218,6 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
     return NPERR_NO_ERROR;
 }
 
-- (char*)resolveURL:(const char*)url forTarget:(const char*)target
-{
-    CString location = [self resolvedURLStringForURL:url target:target];
-
-    if (location.isNull())
-        return 0;
-    
-    // We use strdup here because the caller needs to free it with NPN_MemFree (which calls free).
-    return strdup(location.data());
-}
-
 @end
 
 @implementation WebNetscapePluginView (Internal)
@@ -2348,7 +2242,6 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
 // For now, we'll distinguish older broken versions of Silverlight by asking the plug-in if it resolved its full screen badness.
 - (void)_workaroundSilverlightFullscreenBug:(BOOL)initializedPlugin
 {
-#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD)
     ASSERT(_isSilverlight);
     NPBool isFullscreenPerformanceIssueFixed = 0;
     NPPluginFuncs *pluginFuncs = [_pluginPackage.get() pluginFuncs];
@@ -2371,7 +2264,6 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
         if (!refCount) 
             CGLReleasePixelFormat(pixelFormatObject);
     }
-#endif
 }
 
 - (NPError)_createPlugin
@@ -2384,8 +2276,6 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
     // NPN_New(), which creates the plug-in instance, should never be called while calling a plug-in function for that instance.
     ASSERT(pluginFunctionCallDepth == 0);
 
-    PluginMainThreadScheduler::scheduler().registerPlugin(plugin);
-
     _isFlash = [_pluginPackage.get() bundleIdentifier] == "com.macromedia.Flash Player.plugin";
     _isSilverlight = [_pluginPackage.get() bundleIdentifier] == "com.microsoft.SilverlightPlugin";
 
@@ -2400,17 +2290,18 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
 
 - (void)_destroyPlugin
 {
-    PluginMainThreadScheduler::scheduler().unregisterPlugin(plugin);
-    
     if (_isSilverlight)
         [self _workaroundSilverlightFullscreenBug:NO];
     
     NPError npErr;
     npErr = ![_pluginPackage.get() pluginFuncs]->destroy(plugin, NULL);
     LOG(Plugins, "NPP_Destroy: %d", npErr);
-    
+
+    if (_elementNPObject)
+        _NPN_ReleaseObject(_elementNPObject);
+
     if (Frame* frame = core([self webFrame]))
-        frame->script()->cleanupScriptObjectsForPlugin(self);
+        frame->script().cleanupScriptObjectsForPlugin(self);
         
     free(plugin);
     plugin = NULL;
@@ -2478,7 +2369,7 @@ static inline void getNPRect(const NSRect& nr, NPRect& npr)
     // Tell the plugin to print into the GWorld
     [self willCallPlugInFunction];
     {
-        JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
+        JSC::JSLock::DropAllLocks dropAllLocks(JSDOMWindowBase::commonVM());
         [_pluginPackage.get() pluginFuncs]->print(plugin, &npPrint);
     }
     [self didCallPlugInFunction];