Modified: branches/safari-606-branch/Source/WebCore/html/HTMLMediaElement.cpp (239083 => 239084)
--- branches/safari-606-branch/Source/WebCore/html/HTMLMediaElement.cpp 2018-12-11 21:12:04 UTC (rev 239083)
+++ branches/safari-606-branch/Source/WebCore/html/HTMLMediaElement.cpp 2018-12-11 21:12:07 UTC (rev 239084)
@@ -4322,6 +4322,26 @@
m_creatingControls = false;
}
+bool HTMLMediaElement::setupAndCallJS(const JSSetupFunction& task)
+{
+ Page* page = document().page();
+ if (!page)
+ return false;
+
+ auto pendingActivity = makePendingActivity(*this);
+ auto& world = ensureIsolatedWorld();
+ auto& scriptController = document().frame()->script();
+ auto* globalObject = JSC::jsCast<JSDOMGlobalObject*>(scriptController.globalObject(world));
+ auto& vm = globalObject->vm();
+ JSC::JSLockHolder lock(vm);
+ auto scope = DECLARE_THROW_SCOPE(vm);
+ auto* exec = globalObject->globalExec();
+
+ RETURN_IF_EXCEPTION(scope, false);
+
+ return task(*globalObject, *exec, scriptController, world);
+}
+
void HTMLMediaElement::updateCaptionContainer()
{
#if ENABLE(MEDIA_CONTROLS_SCRIPT)
@@ -4328,12 +4348,6 @@
if (m_haveSetUpCaptionContainer)
return;
- Page* page = document().page();
- if (!page)
- return;
-
- DOMWrapperWorld& world = ensureIsolatedWorld();
-
if (!ensureMediaControlsInjectedScript())
return;
@@ -4342,40 +4356,40 @@
if (!m_mediaControlsHost)
m_mediaControlsHost = MediaControlsHost::create(this);
- ScriptController& scriptController = document().frame()->script();
- JSDOMGlobalObject* globalObject = JSC::jsCast<JSDOMGlobalObject*>(scriptController.globalObject(world));
- JSC::VM& vm = globalObject->vm();
- JSC::JSLockHolder lock(vm);
- auto scope = DECLARE_CATCH_SCOPE(vm);
- JSC::ExecState* exec = globalObject->globalExec();
+ setupAndCallJS([this](JSDOMGlobalObject& globalObject, JSC::ExecState& exec, ScriptController&, DOMWrapperWorld&) {
+ auto& vm = globalObject.vm();
+ auto scope = DECLARE_CATCH_SCOPE(vm);
+ auto controllerValue = controllerJSValue(exec, globalObject, *this);
+ auto* controllerObject = JSC::jsDynamicCast<JSC::JSObject*>(vm, controllerValue);
+ if (!controllerObject)
+ return false;
- JSC::JSValue controllerValue = controllerJSValue(*exec, *globalObject, *this);
- JSC::JSObject* controllerObject = JSC::jsDynamicCast<JSC::JSObject*>(vm, controllerValue);
- if (!controllerObject)
- return;
+ // The media controls script must provide a method on the Controller object with the following details.
+ // Name: updateCaptionContainer
+ // Parameters:
+ // None
+ // Return value:
+ // None
+ auto methodValue = controllerObject->get(&exec, JSC::Identifier::fromString(&exec, "updateCaptionContainer"));
+ auto* methodObject = JSC::jsDynamicCast<JSC::JSObject*>(vm, methodValue);
+ if (!methodObject)
+ return false;
- // The media controls script must provide a method on the Controller object with the following details.
- // Name: updateCaptionContainer
- // Parameters:
- // None
- // Return value:
- // None
- JSC::JSValue methodValue = controllerObject->get(exec, JSC::Identifier::fromString(exec, "updateCaptionContainer"));
- JSC::JSObject* methodObject = JSC::jsDynamicCast<JSC::JSObject*>(vm, methodValue);
- if (!methodObject)
- return;
+ JSC::CallData callData;
+ auto callType = methodObject->methodTable(vm)->getCallData(methodObject, callData);
+ if (callType == JSC::CallType::None)
+ return false;
- JSC::CallData callData;
- JSC::CallType callType = methodObject->methodTable(vm)->getCallData(methodObject, callData);
- if (callType == JSC::CallType::None)
- return;
+ JSC::MarkedArgumentBuffer noArguments;
+ ASSERT(!noArguments.hasOverflowed());
+ JSC::call(&exec, methodObject, callType, callData, controllerObject, noArguments);
+ scope.clearException();
- JSC::MarkedArgumentBuffer noArguments;
- ASSERT(!noArguments.hasOverflowed());
- JSC::call(exec, methodObject, callType, callData, controllerObject, noArguments);
- scope.clearException();
+ m_haveSetUpCaptionContainer = true;
- m_haveSetUpCaptionContainer = true;
+ return true;
+ });
+
#endif
}
@@ -6406,6 +6420,7 @@
#if ENABLE(VIDEO_TRACK)
void HTMLMediaElement::configureTextTrackDisplay(TextTrackVisibilityCheckType checkType)
{
+ ALWAYS_LOG(LOGIDENTIFIER);
ASSERT(m_textTracks);
if (m_processingPreferenceChange)
@@ -7102,6 +7117,7 @@
bool HTMLMediaElement::ensureMediaControlsInjectedScript()
{
DEBUG_LOG(LOGIDENTIFIER);
+
Page* page = document().page();
if (!page)
return false;
@@ -7110,31 +7126,28 @@
if (!mediaControlsScript.length())
return false;
- DOMWrapperWorld& world = ensureIsolatedWorld();
- ScriptController& scriptController = document().frame()->script();
- JSDOMGlobalObject* globalObject = JSC::jsCast<JSDOMGlobalObject*>(scriptController.globalObject(world));
- JSC::VM& vm = globalObject->vm();
- JSC::JSLockHolder lock(vm);
- auto scope = DECLARE_CATCH_SCOPE(vm);
- JSC::ExecState* exec = globalObject->globalExec();
+ return setupAndCallJS([mediaControlsScript](JSDOMGlobalObject& globalObject, JSC::ExecState& exec, ScriptController& scriptController, DOMWrapperWorld& world) {
+ auto& vm = globalObject.vm();
+ auto scope = DECLARE_CATCH_SCOPE(vm);
- JSC::JSValue functionValue = globalObject->get(exec, JSC::Identifier::fromString(exec, "createControls"));
- if (functionValue.isFunction(vm))
- return true;
+ auto functionValue = globalObject.get(&exec, JSC::Identifier::fromString(&exec, "createControls"));
+ if (functionValue.isFunction(vm))
+ return true;
#ifndef NDEBUG
- // Setting a scriptURL allows the source to be debuggable in the inspector.
- URL scriptURL = URL(ParsedURLString, "mediaControlsScript"_s);
+ // Setting a scriptURL allows the source to be debuggable in the inspector.
+ URL scriptURL = URL({ }, "mediaControlsScript"_s);
#else
- URL scriptURL;
+ URL scriptURL;
#endif
- scriptController.evaluateInWorld(ScriptSourceCode(mediaControlsScript, scriptURL), world);
- if (UNLIKELY(scope.exception())) {
- scope.clearException();
- return false;
- }
+ scriptController.evaluateInWorld(ScriptSourceCode(mediaControlsScript, scriptURL), world);
+ if (UNLIKELY(scope.exception())) {
+ scope.clearException();
+ return false;
+ }
- return true;
+ return true;
+ });
}
void HTMLMediaElement::updatePageScaleFactorJSProperty()
@@ -7158,23 +7171,21 @@
void HTMLMediaElement::setControllerJSProperty(const char* propertyName, JSC::JSValue propertyValue)
{
- DOMWrapperWorld& world = ensureIsolatedWorld();
- ScriptController& scriptController = document().frame()->script();
- JSDOMGlobalObject* globalObject = JSC::jsCast<JSDOMGlobalObject*>(scriptController.globalObject(world));
- JSC::ExecState* exec = globalObject->globalExec();
- JSC::VM& vm = exec->vm();
- JSC::JSLockHolder lock(vm);
+ setupAndCallJS([this, propertyName, propertyValue](JSDOMGlobalObject& globalObject, JSC::ExecState& exec, ScriptController&, DOMWrapperWorld&) {
+ auto& vm = globalObject.vm();
+ auto controllerValue = controllerJSValue(exec, globalObject, *this);
+ if (controllerValue.isNull())
+ return false;
- JSC::JSValue controllerValue = controllerJSValue(*exec, *globalObject, *this);
- if (controllerValue.isNull())
- return;
+ JSC::PutPropertySlot propertySlot(controllerValue);
+ auto* controllerObject = controllerValue.toObject(&exec);
+ if (!controllerObject)
+ return false;
- JSC::PutPropertySlot propertySlot(controllerValue);
- JSC::JSObject* controllerObject = controllerValue.toObject(exec);
- if (!controllerObject)
- return;
+ controllerObject->methodTable(vm)->put(controllerObject, &exec, JSC::Identifier::fromString(&exec, propertyName), propertyValue, propertySlot);
- controllerObject->methodTable(vm)->put(controllerObject, exec, JSC::Identifier::fromString(exec, propertyName), propertyValue, propertySlot);
+ return true;
+ });
}
void HTMLMediaElement::didAddUserAgentShadowRoot(ShadowRoot& root)
@@ -7181,84 +7192,78 @@
{
DEBUG_LOG(LOGIDENTIFIER);
- Page* page = document().page();
- if (!page)
+ if (!ensureMediaControlsInjectedScript())
return;
- DOMWrapperWorld& world = ensureIsolatedWorld();
+ setupAndCallJS([this, &root](JSDOMGlobalObject& globalObject, JSC::ExecState& exec, ScriptController&, DOMWrapperWorld&) {
+ auto& vm = globalObject.vm();
+ auto scope = DECLARE_CATCH_SCOPE(vm);
- if (!ensureMediaControlsInjectedScript())
- return;
+ // The media controls script must provide a method with the following details.
+ // Name: createControls
+ // Parameters:
+ // 1. The ShadowRoot element that will hold the controls.
+ // 2. This object (and HTMLMediaElement).
+ // 3. The MediaControlsHost object.
+ // Return value:
+ // A reference to the created media controller instance.
- ScriptController& scriptController = document().frame()->script();
- JSDOMGlobalObject* globalObject = JSC::jsCast<JSDOMGlobalObject*>(scriptController.globalObject(world));
- JSC::VM& vm = globalObject->vm();
- JSC::JSLockHolder lock(vm);
- auto scope = DECLARE_CATCH_SCOPE(vm);
- JSC::ExecState* exec = globalObject->globalExec();
+ auto functionValue = globalObject.get(&exec, JSC::Identifier::fromString(&exec, "createControls"));
+ if (functionValue.isUndefinedOrNull())
+ return false;
- // The media controls script must provide a method with the following details.
- // Name: createControls
- // Parameters:
- // 1. The ShadowRoot element that will hold the controls.
- // 2. This object (and HTMLMediaElement).
- // 3. The MediaControlsHost object.
- // Return value:
- // A reference to the created media controller instance.
+ if (!m_mediaControlsHost)
+ m_mediaControlsHost = MediaControlsHost::create(this);
- JSC::JSValue functionValue = globalObject->get(exec, JSC::Identifier::fromString(exec, "createControls"));
- if (functionValue.isUndefinedOrNull())
- return;
+ auto mediaJSWrapper = toJS(&exec, &globalObject, *this);
+ auto mediaControlsHostJSWrapper = toJS(&exec, &globalObject, *m_mediaControlsHost);
- if (!m_mediaControlsHost)
- m_mediaControlsHost = MediaControlsHost::create(this);
+ JSC::MarkedArgumentBuffer argList;
+ argList.append(toJS(&exec, &globalObject, root));
+ argList.append(mediaJSWrapper);
+ argList.append(mediaControlsHostJSWrapper);
+ ASSERT(!argList.hasOverflowed());
- auto mediaJSWrapper = toJS(exec, globalObject, *this);
- auto mediaControlsHostJSWrapper = toJS(exec, globalObject, *m_mediaControlsHost);
+ auto* function = functionValue.toObject(&exec);
+ scope.assertNoException();
+ JSC::CallData callData;
+ auto callType = function->methodTable(vm)->getCallData(function, callData);
+ if (callType == JSC::CallType::None)
+ return false;
- JSC::MarkedArgumentBuffer argList;
- argList.append(toJS(exec, globalObject, root));
- argList.append(mediaJSWrapper);
- argList.append(mediaControlsHostJSWrapper);
- ASSERT(!argList.hasOverflowed());
+ auto controllerValue = JSC::call(&exec, function, callType, callData, &globalObject, argList);
+ scope.clearException();
+ auto* controllerObject = JSC::jsDynamicCast<JSC::JSObject*>(vm, controllerValue);
+ if (!controllerObject)
+ return false;
- JSC::JSObject* function = functionValue.toObject(exec);
- scope.assertNoException();
- JSC::CallData callData;
- JSC::CallType callType = function->methodTable(vm)->getCallData(function, callData);
- if (callType == JSC::CallType::None)
- return;
+ // Connect the Media, MediaControllerHost, and Controller so the GC knows about their relationship
+ auto* mediaJSWrapperObject = mediaJSWrapper.toObject(&exec);
+ scope.assertNoException();
+ auto controlsHost = JSC::Identifier::fromString(&exec.vm(), "controlsHost");
- JSC::JSValue controllerValue = JSC::call(exec, function, callType, callData, globalObject, argList);
- scope.clearException();
- JSC::JSObject* controllerObject = JSC::jsDynamicCast<JSC::JSObject*>(vm, controllerValue);
- if (!controllerObject)
- return;
+ ASSERT(!mediaJSWrapperObject->hasProperty(&exec, controlsHost));
- // Connect the Media, MediaControllerHost, and Controller so the GC knows about their relationship
- JSC::JSObject* mediaJSWrapperObject = mediaJSWrapper.toObject(exec);
- scope.assertNoException();
- JSC::Identifier controlsHost = JSC::Identifier::fromString(&exec->vm(), "controlsHost");
+ mediaJSWrapperObject->putDirect(exec.vm(), controlsHost, mediaControlsHostJSWrapper, JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::DontEnum | JSC::PropertyAttribute::ReadOnly);
- ASSERT(!mediaJSWrapperObject->hasProperty(exec, controlsHost));
+ auto* mediaControlsHostJSWrapperObject = JSC::jsDynamicCast<JSC::JSObject*>(vm, mediaControlsHostJSWrapper);
+ if (!mediaControlsHostJSWrapperObject)
+ return false;
- mediaJSWrapperObject->putDirect(exec->vm(), controlsHost, mediaControlsHostJSWrapper, JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::DontEnum | JSC::PropertyAttribute::ReadOnly);
+ auto controller = JSC::Identifier::fromString(&exec.vm(), "controller");
- JSC::JSObject* mediaControlsHostJSWrapperObject = JSC::jsDynamicCast<JSC::JSObject*>(vm, mediaControlsHostJSWrapper);
- if (!mediaControlsHostJSWrapperObject)
- return;
+ ASSERT(!controllerObject->hasProperty(&exec, controller));
- JSC::Identifier controller = JSC::Identifier::fromString(&exec->vm(), "controller");
+ mediaControlsHostJSWrapperObject->putDirect(exec.vm(), controller, controllerValue, JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::DontEnum | JSC::PropertyAttribute::ReadOnly);
- ASSERT(!controllerObject->hasProperty(exec, controller));
+ updatePageScaleFactorJSProperty();
+ updateUsesLTRUserInterfaceLayoutDirectionJSProperty();
- mediaControlsHostJSWrapperObject->putDirect(exec->vm(), controller, controllerValue, JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::DontEnum | JSC::PropertyAttribute::ReadOnly);
+ if (UNLIKELY(scope.exception()))
+ scope.clearException();
- updatePageScaleFactorJSProperty();
- updateUsesLTRUserInterfaceLayoutDirectionJSProperty();
-
- if (UNLIKELY(scope.exception()))
- scope.clearException();
+ return true;
+ });
}
void HTMLMediaElement::setMediaControlsDependOnPageScaleFactor(bool dependsOnPageScale)
@@ -7289,33 +7294,32 @@
if (!m_mediaControlsHost || document().activeDOMObjectsAreSuspended() || document().activeDOMObjectsAreStopped())
return;
- DOMWrapperWorld& world = ensureIsolatedWorld();
- ScriptController& scriptController = document().frame()->script();
- JSDOMGlobalObject* globalObject = JSC::jsCast<JSDOMGlobalObject*>(scriptController.globalObject(world));
- JSC::VM& vm = globalObject->vm();
- JSC::JSLockHolder lock(vm);
- auto scope = DECLARE_THROW_SCOPE(vm);
- JSC::ExecState* exec = globalObject->globalExec();
+ setupAndCallJS([this](JSDOMGlobalObject& globalObject, JSC::ExecState& exec, ScriptController&, DOMWrapperWorld&) {
+ auto& vm = globalObject.vm();
+ auto scope = DECLARE_THROW_SCOPE(vm);
- JSC::JSValue controllerValue = controllerJSValue(*exec, *globalObject, *this);
- JSC::JSObject* controllerObject = controllerValue.toObject(exec);
+ auto controllerValue = controllerJSValue(exec, globalObject, *this);
+ auto* controllerObject = controllerValue.toObject(&exec);
- RETURN_IF_EXCEPTION(scope, void());
+ RETURN_IF_EXCEPTION(scope, false);
- JSC::JSValue functionValue = controllerObject->get(exec, JSC::Identifier::fromString(exec, "handlePresentationModeChange"));
- if (UNLIKELY(scope.exception()) || functionValue.isUndefinedOrNull())
- return;
+ auto functionValue = controllerObject->get(&exec, JSC::Identifier::fromString(&exec, "handlePresentationModeChange"));
+ if (UNLIKELY(scope.exception()) || functionValue.isUndefinedOrNull())
+ return false;
- JSC::JSObject* function = functionValue.toObject(exec);
- scope.assertNoException();
- JSC::CallData callData;
- JSC::CallType callType = function->methodTable(vm)->getCallData(function, callData);
- if (callType == JSC::CallType::None)
- return;
+ auto* function = functionValue.toObject(&exec);
+ scope.assertNoException();
+ JSC::CallData callData;
+ auto callType = function->methodTable(vm)->getCallData(function, callData);
+ if (callType == JSC::CallType::None)
+ return false;
- JSC::MarkedArgumentBuffer argList;
- ASSERT(!argList.hasOverflowed());
- JSC::call(exec, function, callType, callData, controllerObject, argList);
+ JSC::MarkedArgumentBuffer argList;
+ ASSERT(!argList.hasOverflowed());
+ JSC::call(&exec, function, callType, callData, controllerObject, argList);
+
+ return true;
+ });
}
void HTMLMediaElement::pageScaleFactorChanged()
@@ -7330,39 +7334,40 @@
String HTMLMediaElement::getCurrentMediaControlsStatus()
{
- DOMWrapperWorld& world = ensureIsolatedWorld();
ensureMediaControlsShadowRoot();
- ScriptController& scriptController = document().frame()->script();
- JSDOMGlobalObject* globalObject = JSC::jsCast<JSDOMGlobalObject*>(scriptController.globalObject(world));
- JSC::VM& vm = globalObject->vm();
- JSC::JSLockHolder lock(vm);
- auto scope = DECLARE_THROW_SCOPE(vm);
- JSC::ExecState* exec = globalObject->globalExec();
+ String status;
+ setupAndCallJS([this, &status](JSDOMGlobalObject& globalObject, JSC::ExecState& exec, ScriptController&, DOMWrapperWorld&) {
+ auto& vm = globalObject.vm();
+ auto scope = DECLARE_THROW_SCOPE(vm);
- JSC::JSValue controllerValue = controllerJSValue(*exec, *globalObject, *this);
- JSC::JSObject* controllerObject = controllerValue.toObject(exec);
+ auto controllerValue = controllerJSValue(exec, globalObject, *this);
+ auto* controllerObject = controllerValue.toObject(&exec);
- RETURN_IF_EXCEPTION(scope, emptyString());
+ RETURN_IF_EXCEPTION(scope, false);
- JSC::JSValue functionValue = controllerObject->get(exec, JSC::Identifier::fromString(exec, "getCurrentControlsStatus"));
- if (UNLIKELY(scope.exception()) || functionValue.isUndefinedOrNull())
- return emptyString();
+ auto functionValue = controllerObject->get(&exec, JSC::Identifier::fromString(&exec, "getCurrentControlsStatus"));
+ if (UNLIKELY(scope.exception()) || functionValue.isUndefinedOrNull())
+ return false;
- JSC::JSObject* function = functionValue.toObject(exec);
- scope.assertNoException();
- JSC::CallData callData;
- JSC::CallType callType = function->methodTable(vm)->getCallData(function, callData);
- JSC::MarkedArgumentBuffer argList;
- ASSERT(!argList.hasOverflowed());
- if (callType == JSC::CallType::None)
- return emptyString();
+ auto* function = functionValue.toObject(&exec);
+ scope.assertNoException();
+ JSC::CallData callData;
+ auto callType = function->methodTable(vm)->getCallData(function, callData);
+ JSC::MarkedArgumentBuffer argList;
+ ASSERT(!argList.hasOverflowed());
+ if (callType == JSC::CallType::None)
+ return false;
- JSC::JSValue outputValue = JSC::call(exec, function, callType, callData, controllerObject, argList);
+ auto outputValue = JSC::call(&exec, function, callType, callData, controllerObject, argList);
- RETURN_IF_EXCEPTION(scope, emptyString());
+ RETURN_IF_EXCEPTION(scope, false);
- return outputValue.getString(exec);
+ status = outputValue.getString(&exec);
+ return true;
+ });
+
+ return status;
}
#endif // ENABLE(MEDIA_CONTROLS_SCRIPT)