Title: [161469] trunk/Source/WebKit/mac
Revision
161469
Author
[email protected]
Date
2014-01-07 16:42:18 -0800 (Tue, 07 Jan 2014)

Log Message

[iOS] Upstream a bug fix for plugin-backed media elements
https://bugs.webkit.org/show_bug.cgi?id=126412

Reviewed by Eric Carlson.

Media elements backed by plug-ins should outlive being removed from the
document, like their native counterparts do.

* Plugins/WebPluginController.h:
* Plugins/WebPluginController.mm:
(-[NSView isMediaPlugInProxyView]):
(-[NSView setIsMediaPlugInProxyView:]):
(-[WebPluginController plugInViewWithArguments:fromPluginPackage:]):
(-[WebPluginController mediaPlugInProxyViewCreated:]):
(-[WebPluginController destroyPlugin:]):
* WebCoreSupport/WebFrameLoaderClient.mm:
(pluginView):

Modified Paths

Diff

Modified: trunk/Source/WebKit/mac/ChangeLog (161468 => 161469)


--- trunk/Source/WebKit/mac/ChangeLog	2014-01-08 00:42:15 UTC (rev 161468)
+++ trunk/Source/WebKit/mac/ChangeLog	2014-01-08 00:42:18 UTC (rev 161469)
@@ -1,3 +1,23 @@
+2014-01-02  Andy Estes  <[email protected]>
+
+        [iOS] Upstream a bug fix for plugin-backed media elements
+        https://bugs.webkit.org/show_bug.cgi?id=126412
+
+        Reviewed by Eric Carlson.
+
+        Media elements backed by plug-ins should outlive being removed from the
+        document, like their native counterparts do.
+
+        * Plugins/WebPluginController.h:
+        * Plugins/WebPluginController.mm:
+        (-[NSView isMediaPlugInProxyView]):
+        (-[NSView setIsMediaPlugInProxyView:]):
+        (-[WebPluginController plugInViewWithArguments:fromPluginPackage:]):
+        (-[WebPluginController mediaPlugInProxyViewCreated:]):
+        (-[WebPluginController destroyPlugin:]):
+        * WebCoreSupport/WebFrameLoaderClient.mm:
+        (pluginView):
+
 2014-01-07  Mark Rowe  <[email protected]>
 
         <https://webkit.org/b/126562> DOMProgressEvent has unspecified availability

Modified: trunk/Source/WebKit/mac/Plugins/WebPluginController.h (161468 => 161469)


--- trunk/Source/WebKit/mac/Plugins/WebPluginController.h	2014-01-08 00:42:15 UTC (rev 161468)
+++ trunk/Source/WebKit/mac/Plugins/WebPluginController.h	2014-01-08 00:42:18 UTC (rev 161469)
@@ -50,7 +50,7 @@
 #endif
 }
 
-+ (NSView *)plugInViewWithArguments:(NSDictionary *)arguments fromPluginPackage:(WebPluginPackage *)plugin;
+- (NSView *)plugInViewWithArguments:(NSDictionary *)arguments fromPluginPackage:(WebPluginPackage *)plugin;
 + (BOOL)isPlugInView:(NSView *)view;
 
 - (id)initWithDocumentView:(NSView *)view;
@@ -60,7 +60,7 @@
 - (void)addPlugin:(NSView *)view;
 - (void)destroyPlugin:(NSView *)view;
 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
-- (void)pluginViewCreated:(NSView *)view;
+- (void)mediaPlugInProxyViewCreated:(NSView *)view;
 + (void)pluginViewHidden:(NSView *)view;
 #endif
 

Modified: trunk/Source/WebKit/mac/Plugins/WebPluginController.mm (161468 => 161469)


--- trunk/Source/WebKit/mac/Plugins/WebPluginController.mm	2014-01-08 00:42:15 UTC (rev 161468)
+++ trunk/Source/WebKit/mac/Plugins/WebPluginController.mm	2014-01-08 00:42:18 UTC (rev 161469)
@@ -30,6 +30,7 @@
 #import "WebPluginController.h"
 
 #import "DOMNodeInternal.h"
+#import "WebBasePluginPackage.h"
 #import "WebDataSourceInternal.h"
 #import "WebFrameInternal.h"
 #import "WebFrameView.h"
@@ -117,17 +118,36 @@
 }
 #endif
 
+#if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
+@interface NSView (WebPluginControllerAdditions)
+@property (nonatomic) BOOL isMediaPlugInProxyView;
+@end
+
+@implementation NSView (WebPluginControllerAdditions)
+
+- (BOOL)isMediaPlugInProxyView
+{
+    return [(NSNumber *)objc_getAssociatedObject(self, @selector(isMediaPlugInProxyView)) boolValue];
+}
+
+- (void)setIsMediaPlugInProxyView:(BOOL)isMediaPlugInProxyView
+{
+    objc_setAssociatedObject(self, @selector(isMediaPlugInProxyView), [NSNumber numberWithBool:isMediaPlugInProxyView], OBJC_ASSOCIATION_RETAIN_NONATOMIC);
+}
+
+@end
+#endif // ENABLE(PLUGIN_PROXY_FOR_VIDEO)
+
 @implementation WebPluginController
 
-+ (NSView *)plugInViewWithArguments:(NSDictionary *)arguments fromPluginPackage:(WebPluginPackage *)pluginPackage
+- (NSView *)plugInViewWithArguments:(NSDictionary *)arguments fromPluginPackage:(WebPluginPackage *)pluginPackage
 {
 #if PLATFORM(IOS)
     initializeAudioSession();
 #endif
 
     [pluginPackage load];
-    Class viewFactory = [pluginPackage viewFactory];
-    
+
     NSView *view = nil;
 
 #if PLATFORM(IOS)
@@ -137,6 +157,7 @@
         view = [[webView _UIKitDelegateForwarder] webView:webView plugInViewWithArguments:arguments fromPlugInPackage:pluginPackage];
     }
 #else
+    Class viewFactory = [pluginPackage viewFactory];
     if ([viewFactory respondsToSelector:@selector(plugInViewWithArguments:)]) {
         JSC::JSLock::DropAllLocks dropAllLocks(JSDOMWindowBase::commonVM());
         view = [viewFactory plugInViewWithArguments:arguments];
@@ -145,7 +166,7 @@
         view = [viewFactory pluginViewWithArguments:arguments];
     }
 #endif
-    
+
     if (view == nil) {
         return nil;
     }
@@ -154,7 +175,7 @@
         pluginViews = [[NSMutableSet alloc] init];
     }
     [pluginViews addObject:view];
-    
+
     return view;
 }
 
@@ -347,8 +368,9 @@
 #endif // PLATFORM(IOS)
 
 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
-- (void)pluginViewCreated:(NSView *)view
+- (void)mediaPlugInProxyViewCreated:(NSView *)view
 {
+    view.isMediaPlugInProxyView = YES;
     if (!_viewsNotInDocument)
         _viewsNotInDocument= [[NSMutableArray alloc] init];
     if (![_viewsNotInDocument containsObject:view])
@@ -423,10 +445,15 @@
 - (void)destroyPlugin:(NSView *)view
 {
 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
-    if ([_views containsObject:view] || [_viewsNotInDocument containsObject:view]) {
-#else
+    // destroyPlugin: is called when a plug-in view is removed from its parent
+    // view, but native media players continue to exist even when they aren't in
+    // the view hierarchy. So if this plug-in view is a proxy for a native media
+    // player, don't destroy it here.
+    if (view.isMediaPlugInProxyView)
+        return;
+#endif
+
     if ([_views containsObject:view]) {
-#endif
         if (_started)
             [self stopOnePlugin:view];
         [self destroyOnePlugin:view];
@@ -441,9 +468,6 @@
         [[_documentView _webView] removePluginInstanceView:view];
 #endif
         [_views removeObject:view];
-#if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
-        [_viewsNotInDocument removeObject:view];
-#endif
     }
 }
 

Modified: trunk/Source/WebKit/mac/WebCoreSupport/WebFrameLoaderClient.mm (161468 => 161469)


--- trunk/Source/WebKit/mac/WebCoreSupport/WebFrameLoaderClient.mm	2014-01-08 00:42:15 UTC (rev 161468)
+++ trunk/Source/WebKit/mac/WebCoreSupport/WebFrameLoaderClient.mm	2014-01-08 00:42:18 UTC (rev 161469)
@@ -36,6 +36,7 @@
 #import "DOMElementInternal.h"
 #import "DOMHTMLFormElementInternal.h"
 #import "WebBackForwardList.h"
+#import "WebBasePluginPackage.h"
 #import "WebCachedFramePlatformData.h"
 #import "WebChromeClient.h"
 #import "WebDataSourceInternal.h"
@@ -1837,8 +1838,17 @@
         LOG(Plugins, "arguments:\n%@", arguments);
     }
 
-    view = [WebPluginController plugInViewWithArguments:arguments fromPluginPackage:pluginPackage];
+    view = [pluginController plugInViewWithArguments:arguments fromPluginPackage:pluginPackage];
     [attributes release];
+
+    if (!view)
+        return nil;
+
+#if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
+    Element* node = core(element);
+    if (node->hasTagName(HTMLNames::videoTag) || node->hasTagName(HTMLNames::audioTag))
+        [pluginController mediaPlugInProxyViewCreated:view];
+#endif
     return view;
 }
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to