Changeset 217910 in webkit


Ignore:
Timestamp:
Jun 7, 2017 4:27:14 PM (7 years ago)
Author:
commit-queue@webkit.org
Message:

getUserMedia is prompting too often
https://bugs.webkit.org/show_bug.cgi?id=172859
<rdar://problem/32589950>

Patch by Youenn Fablet <youenn@apple.com> on 2017-06-07
Reviewed by Eric Carlson.

Source/WebCore:

Tests: fast/mediastream/getUserMedia-grant-persistency-reload.html

fast/mediastream/getUserMedia-grant-persistency.html

  • loader/FrameLoaderClient.h:
  • page/Frame.cpp:

(WebCore::Frame::setDocument): Allows notifying of change of main frame document.
UIProcess will use that to remove unneeded previously granted gum permission.

Source/WebKit2:

Introduce a storage of granted requests to skip prompting when needed.
This is a partial implementation as granted requests should not happen for background tabs.
This will be covered in a follow-up patch.
Covered by manual tests.

A granted request keeps its mainFrameID.
Whenever the document of the main frame changes, the granted requests for that mainFrameID will be removed.
This handles the case of navigating, reloading... while still supporting the case of granting getUserMedia after in page navigation.

  • UIProcess/UserMediaPermissionRequestManagerProxy.cpp:

(WebKit::UserMediaPermissionRequestManagerProxy::createRequest):
(WebKit::UserMediaPermissionRequestManagerProxy::userMediaAccessWasGranted):
(WebKit::UserMediaPermissionRequestManagerProxy::removeGrantedAccess):
(WebKit::UserMediaPermissionRequestManagerProxy::searchForGrantedRequest):
(WebKit::UserMediaPermissionRequestManagerProxy::grantAccess):
(WebKit::UserMediaPermissionRequestManagerProxy::requestUserMediaPermissionForFrame):

  • UIProcess/UserMediaPermissionRequestManagerProxy.h:
  • UIProcess/UserMediaPermissionRequestProxy.cpp:

(WebKit::UserMediaPermissionRequestProxy::UserMediaPermissionRequestProxy):

  • UIProcess/UserMediaPermissionRequestProxy.h:

(WebKit::UserMediaPermissionRequestProxy::create):
(WebKit::UserMediaPermissionRequestProxy::mainFrameID):
(WebKit::UserMediaPermissionRequestProxy::frameID):
(WebKit::UserMediaPermissionRequestProxy::userMediaDocumentSecurityOrigin):

  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::didChangeMainDocument):
(WebKit::WebPageProxy::backForwardGoToItem):

  • UIProcess/WebPageProxy.h:
  • UIProcess/WebPageProxy.messages.in:
  • WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:

(WebKit::WebFrameLoaderClient::dispatchDidChangeMainDocument):

  • WebProcess/WebCoreSupport/WebFrameLoaderClient.h:

LayoutTests:

  • fast/mediastream/getUserMedia-grant-persistency-expected.txt: Added.
  • fast/mediastream/getUserMedia-grant-persistency-reload-expected.txt: Added.
  • fast/mediastream/getUserMedia-grant-persistency-reload.html: Added.
  • fast/mediastream/getUserMedia-grant-persistency.html: Added.
  • http/tests/media/media-stream/get-user-media-prompt-expected.txt:
  • http/tests/media/media-stream/get-user-media-prompt.html: Last gum does not need a prompt anymore.
Location:
trunk
Files:
4 added
16 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r217901 r217910  
     12017-06-07  Youenn Fablet  <youenn@apple.com>
     2
     3        getUserMedia is prompting too often
     4        https://bugs.webkit.org/show_bug.cgi?id=172859
     5        <rdar://problem/32589950>
     6
     7        Reviewed by Eric Carlson.
     8
     9        * fast/mediastream/getUserMedia-grant-persistency-expected.txt: Added.
     10        * fast/mediastream/getUserMedia-grant-persistency-reload-expected.txt: Added.
     11        * fast/mediastream/getUserMedia-grant-persistency-reload.html: Added.
     12        * fast/mediastream/getUserMedia-grant-persistency.html: Added.
     13        * http/tests/media/media-stream/get-user-media-prompt-expected.txt:
     14        * http/tests/media/media-stream/get-user-media-prompt.html: Last gum does not need a prompt anymore.
     15
    1162017-06-07  Daniel Bates  <dabates@apple.com>
    217
  • trunk/LayoutTests/http/tests/media/media-stream/get-user-media-prompt-expected.txt

    r217081 r217910  
    44
    55
    6 PASS numberOfTimesGetUserMediaHasBeenCalled() is 0
     6PASS numberOfTimesGetUserMediaPromptHasBeenCalled() is 0
    77
    88** Request an audio-only stream, the user should be prompted **
    99PASS navigator.mediaDevices.getUserMedia({audio:true}).then(gotStream1); did not throw exception.
    10 PASS numberOfTimesGetUserMediaHasBeenCalled() is 1
     10PASS numberOfTimesGetUserMediaPromptHasBeenCalled() is 1
    1111PASS stream.getAudioTracks().length is 1
    1212PASS stream.getVideoTracks().length is 0
     
    1414** Request a video-only stream, the user should be prompted **
    1515PASS navigator.mediaDevices.getUserMedia({video:true}).then(gotStream2); did not throw exception.
    16 PASS numberOfTimesGetUserMediaHasBeenCalled() is 2
     16PASS numberOfTimesGetUserMediaPromptHasBeenCalled() is 2
    1717PASS stream.getAudioTracks().length is 0
    1818PASS stream.getVideoTracks().length is 1
    1919
    20 ** Request a stream with video and audio, the user should be prompted again **
     20** Request a stream with video and audio, the user should not be prompted again **
    2121PASS navigator.mediaDevices.getUserMedia({audio:true, video:true}).then(gotStream3); did not throw exception.
    22 PASS numberOfTimesGetUserMediaHasBeenCalled() is 3
     22PASS numberOfTimesGetUserMediaPromptHasBeenCalled() is 2
    2323PASS stream.getAudioTracks().length is 1
    2424PASS stream.getVideoTracks().length is 1
  • trunk/LayoutTests/http/tests/media/media-stream/get-user-media-prompt.html

    r217081 r217910  
    88        <script>
    99
    10             function numberOfTimesGetUserMediaHasBeenCalled()
     10            function numberOfTimesGetUserMediaPromptHasBeenCalled()
    1111            {
    1212                return testRunner.userMediaPermissionRequestCountForOrigin(document.location.href, document.location.href);
     
    1616            {
    1717                stream = s;
    18                 shouldBe("numberOfTimesGetUserMediaHasBeenCalled()", "3");
     18                shouldBe("numberOfTimesGetUserMediaPromptHasBeenCalled()", "2");
    1919                shouldBe("stream.getAudioTracks().length", "1");
    2020                shouldBe("stream.getVideoTracks().length", "1");
     
    2727            {
    2828                stream = s;
    29                 shouldBe("numberOfTimesGetUserMediaHasBeenCalled()", "2");
     29                shouldBe("numberOfTimesGetUserMediaPromptHasBeenCalled()", "2");
    3030                shouldBe("stream.getAudioTracks().length", "0");
    3131                shouldBe("stream.getVideoTracks().length", "1");
    3232
    33                 debug("<br>** Request a stream with video and audio, the user should be prompted again **");
     33                debug("<br>** Request a stream with video and audio, the user should not be prompted again **");
    3434                shouldNotThrow("navigator.mediaDevices.getUserMedia({audio:true, video:true}).then(gotStream3);");
    3535            }
     
    3838            {
    3939                stream = s;
    40                 shouldBe("numberOfTimesGetUserMediaHasBeenCalled()", "1");
     40                shouldBe("numberOfTimesGetUserMediaPromptHasBeenCalled()", "1");
    4141                shouldBe("stream.getAudioTracks().length", "1");
    4242                shouldBe("stream.getVideoTracks().length", "0");
     
    5151
    5252                testRunner.resetUserMediaPermissionRequestCountForOrigin(document.location.href, document.location.href);
    53                 shouldBe("numberOfTimesGetUserMediaHasBeenCalled()", "0");
     53                shouldBe("numberOfTimesGetUserMediaPromptHasBeenCalled()", "0");
    5454
    5555                debug("<br>** Request an audio-only stream, the user should be prompted **");
  • trunk/Source/WebCore/ChangeLog

    r217907 r217910  
     12017-06-07  Youenn Fablet  <youenn@apple.com>
     2
     3        getUserMedia is prompting too often
     4        https://bugs.webkit.org/show_bug.cgi?id=172859
     5        <rdar://problem/32589950>
     6
     7        Reviewed by Eric Carlson.
     8
     9        Tests: fast/mediastream/getUserMedia-grant-persistency-reload.html
     10               fast/mediastream/getUserMedia-grant-persistency.html
     11
     12        * loader/FrameLoaderClient.h:
     13        * page/Frame.cpp:
     14        (WebCore::Frame::setDocument): Allows notifying of change of main frame document.
     15        UIProcess will use that to remove unneeded previously granted gum permission.
     16
    1172017-06-07  Chris Dumez  <cdumez@apple.com>
    218
  • trunk/Source/WebCore/loader/FrameLoaderClient.h

    r214266 r217910  
    153153    virtual void dispatchDidCancelClientRedirect() = 0;
    154154    virtual void dispatchWillPerformClientRedirect(const URL&, double interval, double fireDate) = 0;
     155    virtual void dispatchDidChangeMainDocument() { }
    155156    virtual void dispatchDidNavigateWithinPage() { }
    156157    virtual void dispatchDidChangeLocationWithinPage() = 0;
  • trunk/Source/WebCore/page/Frame.cpp

    r215955 r217910  
    272272
    273273    m_documentIsBeingReplaced = true;
    274    
     274
     275    if (isMainFrame())
     276        m_loader.client().dispatchDidChangeMainDocument();
     277
    275278    if (m_doc && m_doc->pageCacheState() != Document::InPageCache)
    276279        m_doc->prepareForDestruction();
  • trunk/Source/WebKit2/ChangeLog

    r217908 r217910  
     12017-06-07  Youenn Fablet  <youenn@apple.com>
     2
     3        getUserMedia is prompting too often
     4        https://bugs.webkit.org/show_bug.cgi?id=172859
     5        <rdar://problem/32589950>
     6
     7        Reviewed by Eric Carlson.
     8
     9        Introduce a storage of granted requests to skip prompting when needed.
     10        This is a partial implementation as granted requests should not happen for background tabs.
     11        This will be covered in a follow-up patch.
     12        Covered by manual tests.
     13
     14        A granted request keeps its mainFrameID.
     15        Whenever the document of the main frame changes, the granted requests for that mainFrameID will be removed.
     16        This handles the case of navigating, reloading... while still supporting the case of granting getUserMedia after in page navigation.
     17
     18        * UIProcess/UserMediaPermissionRequestManagerProxy.cpp:
     19        (WebKit::UserMediaPermissionRequestManagerProxy::createRequest):
     20        (WebKit::UserMediaPermissionRequestManagerProxy::userMediaAccessWasGranted):
     21        (WebKit::UserMediaPermissionRequestManagerProxy::removeGrantedAccess):
     22        (WebKit::UserMediaPermissionRequestManagerProxy::searchForGrantedRequest):
     23        (WebKit::UserMediaPermissionRequestManagerProxy::grantAccess):
     24        (WebKit::UserMediaPermissionRequestManagerProxy::requestUserMediaPermissionForFrame):
     25        * UIProcess/UserMediaPermissionRequestManagerProxy.h:
     26        * UIProcess/UserMediaPermissionRequestProxy.cpp:
     27        (WebKit::UserMediaPermissionRequestProxy::UserMediaPermissionRequestProxy):
     28        * UIProcess/UserMediaPermissionRequestProxy.h:
     29        (WebKit::UserMediaPermissionRequestProxy::create):
     30        (WebKit::UserMediaPermissionRequestProxy::mainFrameID):
     31        (WebKit::UserMediaPermissionRequestProxy::frameID):
     32        (WebKit::UserMediaPermissionRequestProxy::userMediaDocumentSecurityOrigin):
     33        * UIProcess/WebPageProxy.cpp:
     34        (WebKit::WebPageProxy::didChangeMainDocument):
     35        (WebKit::WebPageProxy::backForwardGoToItem):
     36        * UIProcess/WebPageProxy.h:
     37        * UIProcess/WebPageProxy.messages.in:
     38        * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
     39        (WebKit::WebFrameLoaderClient::dispatchDidChangeMainDocument):
     40        * WebProcess/WebCoreSupport/WebFrameLoaderClient.h:
     41
    1422017-06-07  Dan Bernstein  <mitz@apple.com>
    243
  • trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.cpp

    r217837 r217910  
    8080}
    8181
    82 Ref<UserMediaPermissionRequestProxy> UserMediaPermissionRequestManagerProxy::createRequest(uint64_t userMediaID, uint64_t frameID, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin, Vector<String>&& audioDeviceUIDs, Vector<String>&& videoDeviceUIDs, String&& deviceIDHashSalt)
    83 {
    84     auto request = UserMediaPermissionRequestProxy::create(*this, userMediaID, frameID, WTFMove(userMediaDocumentOrigin), WTFMove(topLevelDocumentOrigin), WTFMove(audioDeviceUIDs), WTFMove(videoDeviceUIDs), WTFMove(deviceIDHashSalt));
     82Ref<UserMediaPermissionRequestProxy> UserMediaPermissionRequestManagerProxy::createRequest(uint64_t userMediaID, uint64_t mainFrameID, uint64_t frameID, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin, Vector<String>&& audioDeviceUIDs, Vector<String>&& videoDeviceUIDs, String&& deviceIDHashSalt)
     83{
     84    auto request = UserMediaPermissionRequestProxy::create(*this, userMediaID, mainFrameID, frameID, WTFMove(userMediaDocumentOrigin), WTFMove(topLevelDocumentOrigin), WTFMove(audioDeviceUIDs), WTFMove(videoDeviceUIDs), WTFMove(deviceIDHashSalt));
    8585    m_pendingUserMediaRequests.add(userMediaID, request.ptr());
    8686    return request;
     
    155155        return;
    156156
    157     UserMediaProcessManager::singleton().willCreateMediaStream(*this, !audioDeviceUID.isEmpty(), !videoDeviceUID.isEmpty());
    158     m_page.process().send(Messages::WebPage::UserMediaAccessWasGranted(userMediaID, audioDeviceUID, videoDeviceUID, request->deviceIdentifierHashSalt()), m_page.pageID());
     157    grantAccess(userMediaID, audioDeviceUID, videoDeviceUID, request->deviceIdentifierHashSalt());
     158    m_grantedRequests.append(request.releaseNonNull());
    159159#else
    160160    UNUSED_PARAM(userMediaID);
     
    164164}
    165165
     166#if ENABLE(MEDIA_STREAM)
     167void UserMediaPermissionRequestManagerProxy::removeGrantedAccess(uint64_t frameID)
     168{
     169    m_grantedRequests.removeAllMatching([frameID](const auto& grantedRequest) {
     170        return grantedRequest->mainFrameID() == frameID;
     171    });
     172}
     173
     174const UserMediaPermissionRequestProxy* UserMediaPermissionRequestManagerProxy::searchForGrantedRequest(uint64_t frameID, const WebCore::SecurityOrigin& userMediaDocumentOrigin, const WebCore::SecurityOrigin& topLevelDocumentOrigin, bool needsAudio, bool needsVideo) const
     175{
     176    bool checkForAudio = needsAudio;
     177    bool checkForVideo = needsVideo;
     178    for (const auto& grantedRequest : m_grantedRequests) {
     179        if (!grantedRequest->userMediaDocumentSecurityOrigin().isSameSchemeHostPort(userMediaDocumentOrigin))
     180            continue;
     181        if (!grantedRequest->topLevelDocumentSecurityOrigin().isSameSchemeHostPort(topLevelDocumentOrigin))
     182            continue;
     183        if (grantedRequest->frameID() != frameID)
     184            continue;
     185
     186        if (!grantedRequest->videoDeviceUIDs().isEmpty())
     187            checkForVideo = false;
     188
     189        if (!grantedRequest->audioDeviceUIDs().isEmpty())
     190            checkForAudio = false;
     191
     192        if (checkForVideo || checkForAudio)
     193            continue;
     194
     195        return grantedRequest.ptr();
     196    }
     197    return nullptr;
     198}
     199
     200void UserMediaPermissionRequestManagerProxy::grantAccess(uint64_t userMediaID, const String& audioDeviceUID, const String& videoDeviceUID, const String& deviceIdentifierHashSalt)
     201{
     202    UserMediaProcessManager::singleton().willCreateMediaStream(*this, !audioDeviceUID.isEmpty(), !videoDeviceUID.isEmpty());
     203    m_page.process().send(Messages::WebPage::UserMediaAccessWasGranted(userMediaID, audioDeviceUID, videoDeviceUID, deviceIdentifierHashSalt), m_page.pageID());
     204}
     205#endif
     206
    166207void UserMediaPermissionRequestManagerProxy::rejectionTimerFired()
    167208{
     
    198239
    199240    WebCore::RealtimeMediaSourceCenter::ValidConstraintsHandler validHandler = [this, userMediaID, frameID, userMediaDocumentOrigin = userMediaDocumentOrigin.copyRef(), topLevelDocumentOrigin = topLevelDocumentOrigin.copyRef()](Vector<String>&& audioDeviceUIDs, Vector<String>&& videoDeviceUIDs, String&& deviceIdentifierHashSalt) mutable {
    200         if (!m_page.isValid())
     241        if (!m_page.isValid() || !m_page.mainFrame())
    201242            return;
    202243
     
    206247        }
    207248
     249        auto* grantedRequest = searchForGrantedRequest(frameID, userMediaDocumentOrigin.get(), topLevelDocumentOrigin.get(), !audioDeviceUIDs.isEmpty(), !videoDeviceUIDs.isEmpty());
     250        if (grantedRequest) {
     251            // We select the first available devices, but the current client API allows client to select which device to pick.
     252            // FIXME: Remove the possiblity for the client to do the device selection.
     253            grantAccess(userMediaID, audioDeviceUIDs.isEmpty() ? String() : audioDeviceUIDs[0], videoDeviceUIDs.isEmpty() ? String() : videoDeviceUIDs[0], grantedRequest->deviceIdentifierHashSalt());
     254            return;
     255        }
    208256        auto userMediaOrigin = API::SecurityOrigin::create(userMediaDocumentOrigin.get());
    209257        auto topLevelOrigin = API::SecurityOrigin::create(topLevelDocumentOrigin.get());
    210         auto request = createRequest(userMediaID, frameID, WTFMove(userMediaDocumentOrigin), WTFMove(topLevelDocumentOrigin), WTFMove(audioDeviceUIDs), WTFMove(videoDeviceUIDs), WTFMove(deviceIdentifierHashSalt));
     258
     259        auto request = createRequest(userMediaID, m_page.mainFrame()->frameID(), frameID, WTFMove(userMediaDocumentOrigin), WTFMove(topLevelDocumentOrigin), WTFMove(audioDeviceUIDs), WTFMove(videoDeviceUIDs), WTFMove(deviceIdentifierHashSalt));
    211260
    212261        if (m_page.preferences().mockCaptureDevicesEnabled() && !m_page.preferences().mockCaptureDevicesPromptEnabled()) {
  • trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.h

    r217081 r217910  
    4848    void requestUserMediaPermissionForFrame(uint64_t userMediaID, uint64_t frameID, Ref<WebCore::SecurityOrigin>&&  userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin, const WebCore::MediaConstraints& audioConstraints, const WebCore::MediaConstraints& videoConstraints);
    4949
     50    void removeGrantedAccess(uint64_t mainFrameID);
     51
    5052    void userMediaAccessWasGranted(uint64_t, const String& audioDeviceUID, const String& videoDeviceUID);
    5153    void userMediaAccessWasDenied(uint64_t, UserMediaPermissionRequestProxy::UserMediaAccessDenialReason);
     
    6264
    6365private:
    64     Ref<UserMediaPermissionRequestProxy> createRequest(uint64_t userMediaID, uint64_t frameID, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin, Vector<String>&& audioDeviceUIDs, Vector<String>&& videoDeviceUIDs, String&&);
     66    Ref<UserMediaPermissionRequestProxy> createRequest(uint64_t userMediaID, uint64_t mainFrameID, uint64_t frameID, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin, Vector<String>&& audioDeviceUIDs, Vector<String>&& videoDeviceUIDs, String&&);
    6567    void denyRequest(uint64_t userMediaID, UserMediaPermissionRequestProxy::UserMediaAccessDenialReason, const String& invalidConstraint);
     68#if ENABLE(MEDIA_STREAM)
     69    void grantAccess(uint64_t userMediaID, const String& audioDeviceUID, const String& videoDeviceUID, const String& deviceIdentifierHashSalt);
    6670
     71    const UserMediaPermissionRequestProxy* searchForGrantedRequest(uint64_t frameID, const WebCore::SecurityOrigin& userMediaDocumentOrigin, const WebCore::SecurityOrigin& topLevelDocumentOrigin, bool needsAudio, bool needsVideo) const;
     72#endif
    6773    void getUserMediaPermissionInfo(uint64_t userMediaID, uint64_t frameID, UserMediaPermissionCheckProxy::CompletionHandler&&, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin);
    6874
     
    7682    WebCore::Timer m_rejectionTimer;
    7783    Vector<uint64_t> m_pendingRejections;
     84
     85    Vector<Ref<UserMediaPermissionRequestProxy>> m_grantedRequests;
    7886};
    7987
  • trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestProxy.cpp

    r217081 r217910  
    3131namespace WebKit {
    3232
    33 UserMediaPermissionRequestProxy::UserMediaPermissionRequestProxy(UserMediaPermissionRequestManagerProxy& manager, uint64_t userMediaID, uint64_t frameID, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin, Vector<String>&& audioDeviceUIDs, Vector<String>&& videoDeviceUIDs, String&& deviceIDHashSalt)
     33UserMediaPermissionRequestProxy::UserMediaPermissionRequestProxy(UserMediaPermissionRequestManagerProxy& manager, uint64_t userMediaID, uint64_t mainFrameID, uint64_t frameID, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin, Vector<String>&& audioDeviceUIDs, Vector<String>&& videoDeviceUIDs, String&& deviceIDHashSalt)
    3434    : m_manager(&manager)
    3535    , m_userMediaID(userMediaID)
     36    , m_mainFrameID(mainFrameID)
    3637    , m_frameID(frameID)
    3738    , m_userMediaDocumentSecurityOrigin(WTFMove(userMediaDocumentOrigin))
  • trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestProxy.h

    r217081 r217910  
    3434class UserMediaPermissionRequestProxy : public API::ObjectImpl<API::Object::Type::UserMediaPermissionRequest> {
    3535public:
    36     static Ref<UserMediaPermissionRequestProxy> create(UserMediaPermissionRequestManagerProxy& manager, uint64_t userMediaID, uint64_t frameID, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin, Vector<String>&& videoDeviceUIDs, Vector<String>&& audioDeviceUIDs, String&& deviceIDHashSalt)
     36    static Ref<UserMediaPermissionRequestProxy> create(UserMediaPermissionRequestManagerProxy& manager, uint64_t userMediaID, uint64_t mainFrameID, uint64_t frameID, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin, Vector<String>&& videoDeviceUIDs, Vector<String>&& audioDeviceUIDs, String&& deviceIDHashSalt)
    3737    {
    38         return adoptRef(*new UserMediaPermissionRequestProxy(manager, userMediaID, frameID, WTFMove(userMediaDocumentOrigin), WTFMove(topLevelDocumentOrigin), WTFMove(videoDeviceUIDs), WTFMove(audioDeviceUIDs), WTFMove(deviceIDHashSalt)));
     38        return adoptRef(*new UserMediaPermissionRequestProxy(manager, userMediaID, mainFrameID, frameID, WTFMove(userMediaDocumentOrigin), WTFMove(topLevelDocumentOrigin), WTFMove(videoDeviceUIDs), WTFMove(audioDeviceUIDs), WTFMove(deviceIDHashSalt)));
    3939    }
    4040
     
    5252    const Vector<String>& audioDeviceUIDs() const { return m_audioDeviceUIDs; }
    5353
     54    uint64_t mainFrameID() const { return m_mainFrameID; }
    5455    uint64_t frameID() const { return m_frameID; }
     56    WebCore::SecurityOrigin& topLevelDocumentSecurityOrigin() { return m_topLevelDocumentSecurityOrigin.get(); }
    5557    WebCore::SecurityOrigin& userMediaDocumentSecurityOrigin() { return m_userMediaDocumentSecurityOrigin.get(); }
    56     WebCore::SecurityOrigin& topLevelDocumentSecurityOrigin() { return m_topLevelDocumentSecurityOrigin.get(); }
    5758
    5859    const String& deviceIdentifierHashSalt() const { return m_deviceIdentifierHashSalt; }
    5960
    6061private:
    61     UserMediaPermissionRequestProxy(UserMediaPermissionRequestManagerProxy&, uint64_t userMediaID, uint64_t frameID, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin, Vector<String>&& videoDeviceUIDs, Vector<String>&& audioDeviceUIDs, String&&);
     62    UserMediaPermissionRequestProxy(UserMediaPermissionRequestManagerProxy&, uint64_t userMediaID, uint64_t mainFrameID, uint64_t frameID, Ref<WebCore::SecurityOrigin>&& userMediaDocumentOrigin, Ref<WebCore::SecurityOrigin>&& topLevelDocumentOrigin, Vector<String>&& videoDeviceUIDs, Vector<String>&& audioDeviceUIDs, String&&);
    6263
    6364    UserMediaPermissionRequestManagerProxy* m_manager;
    6465    uint64_t m_userMediaID;
     66    uint64_t m_mainFrameID;
    6567    uint64_t m_frameID;
    6668    Ref<WebCore::SecurityOrigin> m_userMediaDocumentSecurityOrigin;
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp

    r217837 r217910  
    35233523}
    35243524
     3525void WebPageProxy::didChangeMainDocument(uint64_t frameID)
     3526{
     3527#if ENABLE(MEDIA_STREAM)
     3528    userMediaPermissionRequestManager().removeGrantedAccess(frameID);
     3529#else
     3530    UNUSED_PARAM(frameID);
     3531#endif
     3532}
     3533
    35253534void WebPageProxy::didReceiveTitleForFrame(uint64_t frameID, const String& title, const UserData& userData)
    35263535{
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.h

    r217837 r217910  
    12461246    void didFailLoadForFrame(uint64_t frameID, uint64_t navigationID, const WebCore::ResourceError&, const UserData&);
    12471247    void didSameDocumentNavigationForFrame(uint64_t frameID, uint64_t navigationID, uint32_t sameDocumentNavigationType, const String&, const UserData&);
     1248    void didChangeMainDocument(uint64_t frameID);
     1249
    12481250    void didReceiveTitleForFrame(uint64_t frameID, const String&, const UserData&);
    12491251    void didFirstLayoutForFrame(uint64_t frameID, const UserData&);
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in

    r217737 r217910  
    134134    DidDetectXSSForFrame(uint64_t frameID, WebKit::UserData userData)
    135135    DidSameDocumentNavigationForFrame(uint64_t frameID, uint64_t navigationID, uint32_t type, String url, WebKit::UserData userData)
     136    DidChangeMainDocument(uint64_t frameID);
    136137    DidDestroyNavigation(uint64_t navigationID)
    137138
  • trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp

    r217725 r217910  
    337337}
    338338
     339void WebFrameLoaderClient::dispatchDidChangeMainDocument()
     340{
     341    WebPage* webPage = m_frame->page();
     342    if (!webPage)
     343        return;
     344
     345    webPage->send(Messages::WebPageProxy::DidChangeMainDocument(m_frame->frameID()));
     346}
     347
    339348void WebFrameLoaderClient::dispatchDidPushStateWithinPage()
    340349{
  • trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.h

    r214266 r217910  
    8585    void dispatchDidFinishDataDetection(NSArray *detectionResults) final;
    8686#endif
    87    
     87    void dispatchDidChangeMainDocument() final;
     88
    8889    void dispatchDidDispatchOnloadEvents() final;
    8990    void dispatchDidReceiveServerRedirectForProvisionalLoad() final;
Note: See TracChangeset for help on using the changeset viewer.