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):
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@184329
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2015-05-13 Simon Fraser <simon.fraser@apple.com>
+
+ 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 <sungmann.cho@navercorp.com>
Fix trivial typos in ApplyBlockElementCommand
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);
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);
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);
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);
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);
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);
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);
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();