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