Changeset 208606 in webkit
- Timestamp:
- Nov 11, 2016, 1:45:21 PM (8 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r208602 r208606 1 2016-11-11 Eric Carlson <eric.carlson@apple.com> 2 3 [MediaStream] defer resolution of getUserMedia promise made in a background tab 4 https://bugs.webkit.org/show_bug.cgi?id=164643 5 <rdar://problem/29048317> 6 7 Reviewed by Brady Eidson. 8 9 * fast/mediastream/get-user-media-background-tab-expected.txt: Added. 10 * fast/mediastream/get-user-media-background-tab.html: Added. 11 1 12 2016-11-10 Jiewen Tan <jiewen_tan@apple.com> 2 13 -
trunk/Source/WebCore/ChangeLog
r208605 r208606 1 2016-11-11 Eric Carlson <eric.carlson@apple.com> 2 3 [MediaStream] defer resolution of getUserMedia promise made in a background tab 4 https://bugs.webkit.org/show_bug.cgi?id=164643 5 <rdar://problem/29048317> 6 7 Reviewed by Brady Eidson. 8 9 Test: fast/mediastream/get-user-media-background-tab.html 10 11 Do not start producing data when the document does not allow media 12 to start playing. Instead, register with the document for a callback 13 when playback is allowed and start then. 14 * Modules/mediastream/MediaStream.cpp: 15 (WebCore::MediaStream::~MediaStream): 16 (WebCore::MediaStream::mediaCanStart): 17 (WebCore::MediaStream::startProducingData): 18 (WebCore::MediaStream::stopProducingData): 19 (WebCore::MediaStream::pageMutedStateDidChange): 20 * Modules/mediastream/MediaStream.h: 21 22 * Modules/webaudio/AudioContext.cpp: 23 (WebCore::AudioContext::mediaCanStart): Deal with API change. 24 * Modules/webaudio/AudioContext.h: 25 26 * html/HTMLMediaElement.cpp: 27 (WebCore::HTMLMediaElement::mediaCanStart): Ditto. 28 * html/HTMLMediaElement.h: 29 * page/MediaCanStartListener.h: 30 31 * page/Page.cpp: 32 (WebCore::Page::takeAnyMediaCanStartListener): Return the listener and document. 33 (WebCore::Page::setCanStartMedia): Pass the document to the listener. 34 * page/Page.h: 35 1 36 2016-11-11 Zalan Bujtas <zalan@apple.com> 2 37 -
trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp
r207839 r208606 2 2 * Copyright (C) 2011 Google Inc. All rights reserved. 3 3 * Copyright (C) 2011, 2012, 2015 Ericsson AB. All rights reserved. 4 * Copyright (C) 2013-201 5Apple Inc. All rights reserved.4 * Copyright (C) 2013-2016 Apple Inc. All rights reserved. 5 5 * Copyright (C) 2013 Nokia Corporation and/or its subsidiary(-ies). 6 6 * … … 35 35 #include "EventNames.h" 36 36 #include "ExceptionCode.h" 37 #include "Logging.h" 37 38 #include "MediaStreamRegistry.h" 38 39 #include "MediaStreamTrackEvent.h" … … 112 113 for (auto& track : m_trackSet.values()) 113 114 track->removeObserver(this); 114 if (Document* document = this->document()) 115 if (Document* document = this->document()) { 115 116 document->removeAudioProducer(this); 117 if (m_isWaitingUntilMediaCanStart) 118 document->removeMediaCanStartListener(this); 119 } 116 120 } 117 121 … … 248 252 } 249 253 254 void MediaStream::mediaCanStart(Document& document) 255 { 256 ASSERT_UNUSED(document, &document == this->document()); 257 ASSERT(m_isWaitingUntilMediaCanStart); 258 if (m_isWaitingUntilMediaCanStart) { 259 m_isWaitingUntilMediaCanStart = false; 260 startProducingData(); 261 } 262 } 263 264 void MediaStream::startProducingData() 265 { 266 Document* document = this->document(); 267 if (!document || !document->page()) 268 return; 269 270 // If we can't start a load right away, start it later. 271 if (!document->page()->canStartMedia()) { 272 LOG(Media, "MediaStream::startProducingData(%p) - not allowed to start in background, waiting", this); 273 if (m_isWaitingUntilMediaCanStart) 274 return; 275 276 m_isWaitingUntilMediaCanStart = true; 277 document->addMediaCanStartListener(this); 278 return; 279 } 280 281 m_private->startProducingData(); 282 } 283 284 void MediaStream::stopProducingData() 285 { 286 m_private->stopProducingData(); 287 } 288 250 289 void MediaStream::pageMutedStateDidChange() 251 290 { … … 263 302 m_externallyMuted = pageMuted; 264 303 if (pageMuted) 265 m_private->stopProducingData();304 stopProducingData(); 266 305 else 267 m_private->startProducingData();306 startProducingData(); 268 307 } 269 308 -
trunk/Source/WebCore/Modules/mediastream/MediaStream.h
r200231 r208606 34 34 #include "EventTarget.h" 35 35 #include "ExceptionBase.h" 36 #include "MediaCanStartListener.h" 36 37 #include "MediaProducer.h" 37 38 #include "MediaStreamPrivate.h" … … 48 49 class Document; 49 50 50 class MediaStream final : public URLRegistrable, public EventTargetWithInlineData, public ContextDestructionObserver, public MediaStreamTrack::Observer, public MediaStreamPrivate::Observer, private MediaProducer, public RefCounted<MediaStream> { 51 class MediaStream final 52 : public URLRegistrable 53 , public EventTargetWithInlineData 54 , public ContextDestructionObserver 55 , public MediaStreamTrack::Observer 56 , public MediaStreamPrivate::Observer 57 , private MediaProducer 58 , private MediaCanStartListener 59 , public RefCounted<MediaStream> { 51 60 public: 52 61 class Observer { … … 78 87 79 88 MediaStreamPrivate* privateStream() const { return m_private.get(); } 89 90 void startProducingData(); 91 void stopProducingData(); 80 92 81 93 // EventTarget … … 119 131 MediaProducer::MediaStateFlags mediaState() const final; 120 132 133 // MediaCanStartListener 134 void mediaCanStart(Document&) final; 135 121 136 bool internalAddTrack(Ref<MediaStreamTrack>&&, StreamModifier); 122 137 bool internalRemoveTrack(const String&, StreamModifier); … … 143 158 bool m_isMuted { true }; 144 159 bool m_externallyMuted { false }; 160 bool m_isWaitingUntilMediaCanStart { false }; 145 161 }; 146 162 -
trunk/Source/WebCore/Modules/webaudio/AudioContext.cpp
r208474 r208606 958 958 } 959 959 960 void AudioContext::mediaCanStart() 961 { 960 void AudioContext::mediaCanStart(Document& document) 961 { 962 ASSERT_UNUSED(document, &document == this->document()); 962 963 removeBehaviorRestriction(AudioContext::RequirePageConsentForAudioStartRestriction); 963 964 mayResumePlayback(true); -
trunk/Source/WebCore/Modules/webaudio/AudioContext.h
r208476 r208606 285 285 void scheduleNodeDeletion(); 286 286 287 void mediaCanStart( ) override;287 void mediaCanStart(Document&) override; 288 288 289 289 // MediaProducer -
trunk/Source/WebCore/html/HTMLMediaElement.cpp
r208603 r208606 5665 5665 #endif 5666 5666 5667 void HTMLMediaElement::mediaCanStart() 5668 { 5667 void HTMLMediaElement::mediaCanStart(Document& document) 5668 { 5669 ASSERT_UNUSED(document, &document == &this->document()); 5669 5670 LOG(Media, "HTMLMediaElement::mediaCanStart(%p) - m_isWaitingUntilMediaCanStart = %s, m_pausedInternal = %s", 5670 5671 this, boolString(m_isWaitingUntilMediaCanStart), boolString(m_pausedInternal) ); -
trunk/Source/WebCore/html/HTMLMediaElement.h
r208539 r208606 728 728 void setPlaybackRateInternal(double); 729 729 730 void mediaCanStart( ) override;730 void mediaCanStart(Document&) final; 731 731 732 732 void invalidateCachedTime() const; -
trunk/Source/WebCore/page/MediaCanStartListener.h
r208179 r208606 28 28 namespace WebCore { 29 29 30 class Document; 31 30 32 class MediaCanStartListener { 31 33 public: 32 virtual void mediaCanStart( ) = 0;34 virtual void mediaCanStart(Document&) = 0; 33 35 protected: 34 36 virtual ~MediaCanStartListener() { } -
trunk/Source/WebCore/page/Page.cpp
r208479 r208606 556 556 } 557 557 558 inline MediaCanStartListener*Page::takeAnyMediaCanStartListener()558 inline Optional<std::pair<MediaCanStartListener&, Document&>> Page::takeAnyMediaCanStartListener() 559 559 { 560 560 for (Frame* frame = &mainFrame(); frame; frame = frame->tree().traverseNext()) { … … 562 562 continue; 563 563 if (MediaCanStartListener* listener = frame->document()->takeAnyMediaCanStartListener()) 564 return listener;565 } 566 return 0;564 return { { *listener, *frame->document() } }; 565 } 566 return Nullopt; 567 567 } 568 568 … … 575 575 576 576 while (m_canStartMedia) { 577 MediaCanStartListener*listener = takeAnyMediaCanStartListener();577 auto listener = takeAnyMediaCanStartListener(); 578 578 if (!listener) 579 579 break; 580 listener-> mediaCanStart();580 listener->first.mediaCanStart(listener->second); 581 581 } 582 582 } -
trunk/Source/WebCore/page/Page.h
r208361 r208606 550 550 unsigned findMatchesForText(const String&, FindOptions, unsigned maxMatchCount, ShouldHighlightMatches, ShouldMarkMatches); 551 551 552 MediaCanStartListener*takeAnyMediaCanStartListener();552 Optional<std::pair<MediaCanStartListener&, Document&>> takeAnyMediaCanStartListener(); 553 553 554 554 Vector<Ref<PluginViewBase>> pluginViews(); -
trunk/Source/WebKit2/ChangeLog
r208603 r208606 1 2016-11-11 Eric Carlson <eric.carlson@apple.com> 2 3 [MediaStream] defer resolution of getUserMedia promise made in a background tab 4 https://bugs.webkit.org/show_bug.cgi?id=164643 5 <rdar://problem/29048317> 6 7 Reviewed by Brady Eidson. 8 9 Do not ask for user for access to capture devices when the document does not 10 allow media to play, wait until playback is allowed. 11 12 * WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp: 13 (WebKit::UserMediaPermissionRequestManager::startUserMediaRequest): 14 (WebKit::UserMediaPermissionRequestManager::sendUserMediaRequest): 15 (WebKit::UserMediaPermissionRequestManager::mediaCanStart): 16 (WebKit::UserMediaPermissionRequestManager::grantUserMediaDevicesSandboxExtension): 17 * WebProcess/MediaStream/UserMediaPermissionRequestManager.h: 18 * WebProcess/Plugins/PluginView.cpp: 19 (WebKit::PluginView::mediaCanStart): 20 * WebProcess/Plugins/PluginView.h: 21 1 22 2016-11-11 Darin Adler <darin@apple.com> 2 23 -
trunk/Source/WebKit2/WebProcess/MediaStream/UserMediaPermissionRequestManager.cpp
r208558 r208606 61 61 Frame* frame = document ? document->frame() : nullptr; 62 62 63 if (!frame || !document->page()) { 64 request.deny(UserMediaRequest::OtherFailure, emptyString()); 65 return; 66 } 67 68 if (document->page()->canStartMedia()) { 69 sendUserMediaRequest(request); 70 return; 71 } 72 73 auto& pendingRequests = m_blockedRequests.add(document, Vector<RefPtr<UserMediaRequest>>()).iterator->value; 74 if (pendingRequests.isEmpty()) 75 document->addMediaCanStartListener(this); 76 pendingRequests.append(&request); 77 } 78 79 void UserMediaPermissionRequestManager::sendUserMediaRequest(UserMediaRequest& request) 80 { 81 Document* document = request.document(); 82 Frame* frame = document ? document->frame() : nullptr; 83 63 84 if (!frame) { 64 85 request.deny(UserMediaRequest::OtherFailure, emptyString()); … … 84 105 return; 85 106 m_idToUserMediaRequestMap.remove(requestID); 107 removeMediaRequestFromMaps(request); 108 } 109 110 void UserMediaPermissionRequestManager::mediaCanStart(Document& document) 111 { 112 auto pendingRequests = m_blockedRequests.take(&document); 113 while (!pendingRequests.isEmpty()) { 114 if (!document.page()->canStartMedia()) { 115 m_blockedRequests.add(&document, pendingRequests); 116 document.addMediaCanStartListener(this); 117 break; 118 } 119 120 sendUserMediaRequest(*pendingRequests.takeLast()); 121 } 122 } 123 124 void UserMediaPermissionRequestManager::removeMediaRequestFromMaps(UserMediaRequest& request) 125 { 126 auto pendingRequests = m_blockedRequests.take(request.document()); 127 for (auto& pendingRequest : pendingRequests) { 128 if (&request != pendingRequest.get()) 129 continue; 130 131 if (pendingRequests.isEmpty()) 132 request.document()->removeMediaCanStartListener(this); 133 else 134 m_blockedRequests.add(request.document(), pendingRequests); 135 break; 136 } 137 138 m_userMediaRequestToIDMap.remove(&request); 86 139 } 87 140 … … 91 144 if (!request) 92 145 return; 93 m_userMediaRequestToIDMap.remove(request);146 removeMediaRequestFromMaps(*request); 94 147 95 148 request->allow(audioDeviceUID, videoDeviceUID); … … 101 154 if (!request) 102 155 return; 103 m_userMediaRequestToIDMap.remove(request);156 removeMediaRequestFromMaps(*request); 104 157 105 158 request->deny(reason, invalidConstraint); … … 151 204 152 205 for (size_t i = 0; i < sandboxExtensionHandles.size(); i++) { 153 if ( RefPtr<SandboxExtension>extension = SandboxExtension::create(sandboxExtensionHandles[i])) {206 if (auto extension = SandboxExtension::create(sandboxExtensionHandles[i])) { 154 207 extension->consume(); 155 208 m_userMediaDeviceSandboxExtensions.append(extension.release()); -
trunk/Source/WebKit2/WebProcess/MediaStream/UserMediaPermissionRequestManager.h
r207704 r208606 24 24 25 25 #include "SandboxExtension.h" 26 #include <WebCore/MediaCanStartListener.h> 26 27 #include <WebCore/MediaConstraints.h> 27 28 #include <WebCore/MediaDevicesEnumerationRequest.h> … … 36 37 class WebPage; 37 38 38 class UserMediaPermissionRequestManager { 39 class UserMediaPermissionRequestManager 40 : private WebCore::MediaCanStartListener { 39 41 public: 40 42 explicit UserMediaPermissionRequestManager(WebPage&); … … 53 55 54 56 private: 57 void sendUserMediaRequest(WebCore::UserMediaRequest&); 58 59 // WebCore::MediaCanStartListener 60 void mediaCanStart(WebCore::Document&) override; 61 62 void removeMediaRequestFromMaps(WebCore::UserMediaRequest&); 63 55 64 WebPage& m_page; 56 65 … … 62 71 63 72 Vector<RefPtr<SandboxExtension>> m_userMediaDeviceSandboxExtensions; 73 74 HashMap<RefPtr<WebCore::Document>, Vector<RefPtr<WebCore::UserMediaRequest>>> m_blockedRequests; 64 75 }; 65 76 -
trunk/Source/WebKit2/WebProcess/Plugins/PluginView.cpp
r208329 r208606 1372 1372 } 1373 1373 1374 void PluginView::mediaCanStart( )1374 void PluginView::mediaCanStart(WebCore::Document&) 1375 1375 { 1376 1376 ASSERT(m_isWaitingUntilMediaCanStart); -
trunk/Source/WebKit2/WebProcess/Plugins/PluginView.h
r208329 r208606 185 185 186 186 // WebCore::MediaCanStartListener 187 void mediaCanStart( ) override;187 void mediaCanStart(WebCore::Document&) override; 188 188 189 189 // WebCore::MediaProducer
Note:
See TracChangeset
for help on using the changeset viewer.