Title: [239084] branches/safari-606-branch/Source/WebCore
Revision
239084
Author
alanc...@apple.com
Date
2018-12-11 13:12:07 -0800 (Tue, 11 Dec 2018)

Log Message

Cherry-pick r238582. rdar://problem/46085283

    Refactor duplicate code for calling into media controls
    https://bugs.webkit.org/show_bug.cgi?id=192040
    <rdar://problem/46278931>

    Reviewed by Youenn Fablet.

    No new tests, no functional change.

    * html/HTMLMediaElement.cpp:
    (WebCore::HTMLMediaElement::setupAndCallJS):
    (WebCore::HTMLMediaElement::updateCaptionContainer):
    (WebCore::HTMLMediaElement::configureTextTrackDisplay):
    (WebCore::HTMLMediaElement::ensureMediaControlsInjectedScript):
    (WebCore::HTMLMediaElement::setControllerJSProperty):
    (WebCore::HTMLMediaElement::didAddUserAgentShadowRoot):
    (WebCore::HTMLMediaElement::updateMediaControlsAfterPresentationModeChange):
    (WebCore::HTMLMediaElement::getCurrentMediaControlsStatus):
    * html/HTMLMediaElement.h:

    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@238582 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Modified Paths

Diff

Modified: branches/safari-606-branch/Source/WebCore/ChangeLog (239083 => 239084)


--- branches/safari-606-branch/Source/WebCore/ChangeLog	2018-12-11 21:12:04 UTC (rev 239083)
+++ branches/safari-606-branch/Source/WebCore/ChangeLog	2018-12-11 21:12:07 UTC (rev 239084)
@@ -1,5 +1,51 @@
 2018-12-11  Alan Coon  <alanc...@apple.com>
 
+        Cherry-pick r238582. rdar://problem/46085283
+
+    Refactor duplicate code for calling into media controls
+    https://bugs.webkit.org/show_bug.cgi?id=192040
+    <rdar://problem/46278931>
+    
+    Reviewed by Youenn Fablet.
+    
+    No new tests, no functional change.
+    
+    * html/HTMLMediaElement.cpp:
+    (WebCore::HTMLMediaElement::setupAndCallJS):
+    (WebCore::HTMLMediaElement::updateCaptionContainer):
+    (WebCore::HTMLMediaElement::configureTextTrackDisplay):
+    (WebCore::HTMLMediaElement::ensureMediaControlsInjectedScript):
+    (WebCore::HTMLMediaElement::setControllerJSProperty):
+    (WebCore::HTMLMediaElement::didAddUserAgentShadowRoot):
+    (WebCore::HTMLMediaElement::updateMediaControlsAfterPresentationModeChange):
+    (WebCore::HTMLMediaElement::getCurrentMediaControlsStatus):
+    * html/HTMLMediaElement.h:
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@238582 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    2018-11-27  Eric Carlson  <eric.carl...@apple.com>
+
+            Refactor duplicate code for calling into media controls
+            https://bugs.webkit.org/show_bug.cgi?id=192040
+            <rdar://problem/46278931>
+
+            Reviewed by Youenn Fablet.
+
+            No new tests, no functional change.
+
+            * html/HTMLMediaElement.cpp:
+            (WebCore::HTMLMediaElement::setupAndCallJS):
+            (WebCore::HTMLMediaElement::updateCaptionContainer):
+            (WebCore::HTMLMediaElement::configureTextTrackDisplay):
+            (WebCore::HTMLMediaElement::ensureMediaControlsInjectedScript):
+            (WebCore::HTMLMediaElement::setControllerJSProperty):
+            (WebCore::HTMLMediaElement::didAddUserAgentShadowRoot):
+            (WebCore::HTMLMediaElement::updateMediaControlsAfterPresentationModeChange):
+            (WebCore::HTMLMediaElement::getCurrentMediaControlsStatus):
+            * html/HTMLMediaElement.h:
+
+2018-12-11  Alan Coon  <alanc...@apple.com>
+
         Cherry-pick r238232. rdar://problem/46085281
 
     Modernize RTCPeerConnection handling of pendingActivity

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)
 

Modified: branches/safari-606-branch/Source/WebCore/html/HTMLMediaElement.h (239083 => 239084)


--- branches/safari-606-branch/Source/WebCore/html/HTMLMediaElement.h	2018-12-11 21:12:04 UTC (rev 239083)
+++ branches/safari-606-branch/Source/WebCore/html/HTMLMediaElement.h	2018-12-11 21:12:07 UTC (rev 239084)
@@ -77,11 +77,13 @@
 class AudioTrackPrivate;
 class Blob;
 class DOMException;
+class DOMWrapperWorld;
 class DeferredPromise;
 class Event;
 class HTMLSourceElement;
 class HTMLTrackElement;
 class InbandTextTrackPrivate;
+class JSDOMGlobalObject;
 class MediaController;
 class MediaControls;
 class MediaControlsHost;
@@ -93,6 +95,7 @@
 class MediaSource;
 class MediaStream;
 class RenderMedia;
+class ScriptController;
 class ScriptExecutionContext;
 class SourceBuffer;
 class TextTrackList;
@@ -890,6 +893,9 @@
     void updateCaptionContainer();
     void ensureMediaControlsShadowRoot();
 
+    using JSSetupFunction = WTF::Function<bool(JSDOMGlobalObject&, JSC::ExecState&, ScriptController&, DOMWrapperWorld&)>;
+    bool setupAndCallJS(const JSSetupFunction&);
+
 #if ENABLE(WIRELESS_PLAYBACK_TARGET)
     void prepareForDocumentSuspension() final;
     void resumeFromDocumentSuspension() final;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to