Title: [184329] trunk/Source/WebCore
Revision
184329
Author
[email protected]
Date
2015-05-13 22:10:55 -0700 (Wed, 13 May 2015)

Log Message

Get the ScriptController from the correct frame for media elements and plug-ins
https://bugs.webkit.org/show_bug.cgi?id=144983
rdar://problem/20692642&19943135

Reviewed by Sam Weinig.

HTMLMediaElement, QuickTimePluginReplacement and HTMLPlugInImageElement were
getting the main frame's ScriptController instead of the one for their frame.
This caused media controls JS to be running in the context of the main frame,
which broke media controls which use getCSSCanvasContext() and -webkit-canvas.

Fix by getting the frame via the element's document.

Also undo r180584 which was working around this bug.

* Modules/mediacontrols/mediaControlsiOS.js:
(ControllerIOS.prototype.drawTimelineBackground):
* Modules/plugins/QuickTimePluginReplacement.mm:
(WebCore::QuickTimePluginReplacement::ensureReplacementScriptInjected):
(WebCore::QuickTimePluginReplacement::installReplacement):
* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::updateCaptionContainer):
(WebCore::HTMLMediaElement::ensureMediaControlsInjectedScript):
(WebCore::HTMLMediaElement::didAddUserAgentShadowRoot):
(WebCore::HTMLMediaElement::pageScaleFactorChanged):
* html/HTMLPlugInImageElement.cpp:
(WebCore::HTMLPlugInImageElement::didAddUserAgentShadowRoot):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (184328 => 184329)


--- trunk/Source/WebCore/ChangeLog	2015-05-14 04:19:18 UTC (rev 184328)
+++ trunk/Source/WebCore/ChangeLog	2015-05-14 05:10:55 UTC (rev 184329)
@@ -1,3 +1,33 @@
+2015-05-13  Simon Fraser  <[email protected]>
+
+        Get the ScriptController from the correct frame for media elements and plug-ins
+        https://bugs.webkit.org/show_bug.cgi?id=144983
+        rdar://problem/20692642&19943135
+
+        Reviewed by Sam Weinig.
+
+        HTMLMediaElement, QuickTimePluginReplacement and HTMLPlugInImageElement were
+        getting the main frame's ScriptController instead of the one for their frame.
+        This caused media controls JS to be running in the context of the main frame,
+        which broke media controls which use getCSSCanvasContext() and -webkit-canvas.
+        
+        Fix by getting the frame via the element's document.
+        
+        Also undo r180584 which was working around this bug.
+
+        * Modules/mediacontrols/mediaControlsiOS.js:
+        (ControllerIOS.prototype.drawTimelineBackground):
+        * Modules/plugins/QuickTimePluginReplacement.mm:
+        (WebCore::QuickTimePluginReplacement::ensureReplacementScriptInjected):
+        (WebCore::QuickTimePluginReplacement::installReplacement):
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::updateCaptionContainer):
+        (WebCore::HTMLMediaElement::ensureMediaControlsInjectedScript):
+        (WebCore::HTMLMediaElement::didAddUserAgentShadowRoot):
+        (WebCore::HTMLMediaElement::pageScaleFactorChanged):
+        * html/HTMLPlugInImageElement.cpp:
+        (WebCore::HTMLPlugInImageElement::didAddUserAgentShadowRoot):
+
 2015-05-13  Sungmann Cho  <[email protected]>
 
         Fix trivial typos in ApplyBlockElementCommand

Modified: trunk/Source/WebCore/Modules/mediacontrols/mediaControlsiOS.js (184328 => 184329)


--- trunk/Source/WebCore/Modules/mediacontrols/mediaControlsiOS.js	2015-05-14 04:19:18 UTC (rev 184328)
+++ trunk/Source/WebCore/Modules/mediacontrols/mediaControlsiOS.js	2015-05-14 05:10:55 UTC (rev 184329)
@@ -256,7 +256,7 @@
         buffered /= this.video.duration;
         buffered = Math.max(buffered, played);
 
-        var ctx = this.video.ownerDocument.getCSSCanvasContext('2d', this.timelineContextName, width, height);
+        var ctx = document.getCSSCanvasContext('2d', this.timelineContextName, width, height);
 
         ctx.clearRect(0, 0, width, height);
 

Modified: trunk/Source/WebCore/Modules/plugins/QuickTimePluginReplacement.mm (184328 => 184329)


--- trunk/Source/WebCore/Modules/plugins/QuickTimePluginReplacement.mm	2015-05-14 04:19:18 UTC (rev 184328)
+++ trunk/Source/WebCore/Modules/plugins/QuickTimePluginReplacement.mm	2015-05-14 05:10:55 UTC (rev 184329)
@@ -148,12 +148,11 @@
 
 bool QuickTimePluginReplacement::ensureReplacementScriptInjected()
 {
-    Page* page = m_parentElement->document().page();
-    if (!page)
+    if (!m_parentElement->document().frame())
         return false;
     
     DOMWrapperWorld& world = isolatedWorld();
-    ScriptController& scriptController = page->mainFrame().script();
+    ScriptController& scriptController = m_parentElement->document().frame()->script();
     JSDOMGlobalObject* globalObject = JSC::jsCast<JSDOMGlobalObject*>(scriptController.globalObject(world));
     JSC::ExecState* exec = globalObject->globalExec();
     JSC::JSLockHolder lock(exec);
@@ -174,13 +173,14 @@
 
 bool QuickTimePluginReplacement::installReplacement(ShadowRoot* root)
 {
-    Page* page = m_parentElement->document().page();
-
     if (!ensureReplacementScriptInjected())
         return false;
 
+    if (!m_parentElement->document().frame())
+        return false;
+
     DOMWrapperWorld& world = isolatedWorld();
-    ScriptController& scriptController = page->mainFrame().script();
+    ScriptController& scriptController = m_parentElement->document().frame()->script();
     JSDOMGlobalObject* globalObject = JSC::jsCast<JSDOMGlobalObject*>(scriptController.globalObject(world));
     JSC::ExecState* exec = globalObject->globalExec();
     JSC::JSLockHolder lock(exec);

Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (184328 => 184329)


--- trunk/Source/WebCore/html/HTMLMediaElement.cpp	2015-05-14 04:19:18 UTC (rev 184328)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp	2015-05-14 05:10:55 UTC (rev 184329)
@@ -3745,7 +3745,7 @@
     if (!m_mediaControlsHost)
         m_mediaControlsHost = MediaControlsHost::create(this);
 
-    ScriptController& scriptController = page->mainFrame().script();
+    ScriptController& scriptController = document().frame()->script();
     JSDOMGlobalObject* globalObject = JSC::jsCast<JSDOMGlobalObject*>(scriptController.globalObject(world));
     JSC::ExecState* exec = globalObject->globalExec();
     JSC::JSLockHolder lock(exec);
@@ -5968,7 +5968,7 @@
         return false;
 
     DOMWrapperWorld& world = ensureIsolatedWorld();
-    ScriptController& scriptController = page->mainFrame().script();
+    ScriptController& scriptController = document().frame()->script();
     JSDOMGlobalObject* globalObject = JSC::jsCast<JSDOMGlobalObject*>(scriptController.globalObject(world));
     JSC::ExecState* exec = globalObject->globalExec();
     JSC::JSLockHolder lock(exec);
@@ -6011,7 +6011,7 @@
     if (!ensureMediaControlsInjectedScript())
         return;
 
-    ScriptController& scriptController = page->mainFrame().script();
+    ScriptController& scriptController = document().frame()->script();
     JSDOMGlobalObject* globalObject = JSC::jsCast<JSDOMGlobalObject*>(scriptController.globalObject(world));
     JSC::ExecState* exec = globalObject->globalExec();
     JSC::JSLockHolder lock(exec);
@@ -6098,7 +6098,7 @@
 
     LOG(Media, "HTMLMediaElement::pageScaleFactorChanged(%p) = %f", this, page->pageScaleFactor());
     DOMWrapperWorld& world = ensureIsolatedWorld();
-    ScriptController& scriptController = page->mainFrame().script();
+    ScriptController& scriptController = document().frame()->script();
     JSDOMGlobalObject* globalObject = JSC::jsCast<JSDOMGlobalObject*>(scriptController.globalObject(world));
     JSC::ExecState* exec = globalObject->globalExec();
     JSC::JSLockHolder lock(exec);

Modified: trunk/Source/WebCore/html/HTMLPlugInImageElement.cpp (184328 => 184329)


--- trunk/Source/WebCore/html/HTMLPlugInImageElement.cpp	2015-05-14 04:19:18 UTC (rev 184328)
+++ trunk/Source/WebCore/html/HTMLPlugInImageElement.cpp	2015-05-14 05:10:55 UTC (rev 184329)
@@ -379,7 +379,7 @@
     DOMWrapperWorld& isolatedWorld = plugInImageElementIsolatedWorld();
     document().ensurePlugInsInjectedScript(isolatedWorld);
 
-    ScriptController& scriptController = page->mainFrame().script();
+    ScriptController& scriptController = document().frame()->script();
     JSDOMGlobalObject* globalObject = JSC::jsCast<JSDOMGlobalObject*>(scriptController.globalObject(isolatedWorld));
     JSC::ExecState* exec = globalObject->globalExec();
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to