Source/WebCore/ChangeLog

 12015-07-21 Jer Noble <jer.noble@apple.com>
 2
 3 [iOS] Add an explicit API to allow media documents to (temporarily) play inline
 4 https://bugs.webkit.org/show_bug.cgi?id=147181
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 Add listeners for the new allowsMediaDocumentInlinePlayback API. When this value becomes
 9 NO, force any playing MediaDocuments to enter fullscreen mode.
 10
 11 * dom/Document.cpp:
 12 (WebCore::Document::registerForAllowsMediaDocumentInlinePlaybackChangedCallbacks): Added registration method.
 13 (WebCore::Document::unregisterForAllowsMediaDocumentInlinePlaybackChangedCallbacks): Added deregistration method.
 14 (WebCore::Document::allowsMediaDocumentInlinePlaybackChanged): Notify all listeners.
 15 * dom/Document.h:
 16 * html/HTMLMediaElement.cpp:
 17 (WebCore::HTMLMediaElement::registerWithDocument): Listen for allowsMediaDocumentInlinePlayback changes.
 18 (WebCore::HTMLMediaElement::unregisterWithDocument): Stop listening to same.
 19 (WebCore::HTMLMediaElement::allowsMediaDocumentInlinePlaybackChanged): Enter fullscreen mode if the value
 20 changes to false during playback.
 21 * html/HTMLMediaElement.h:
 22 * html/MediaElementSession.cpp:
 23 (WebCore::MediaElementSession::requiresFullscreenForVideoPlayback): Early true if the override value is set.
 24 * page/Page.cpp:
 25 (WebCore::Page::setAllowsMediaDocumentInlinePlayback): Notify all documents of the changed value.
 26 * page/Page.h:
 27 (WebCore::Page::allowsMediaDocumentInlinePlayback): Simple getter.
 28
1292015-07-20 Mark Lam <mark.lam@apple.com>
230
331 Rollout r187020 and r187021: breaks JSC API tests on debug builds.

Source/WebKit2/ChangeLog

 12015-07-21 Jer Noble <jer.noble@apple.com>
 2
 3 [iOS] Add an explicit API to allow media documents to (temporarily) play inline
 4 https://bugs.webkit.org/show_bug.cgi?id=147181
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 Add a WKWebView(Private) API which allows MediaDocuments loaded by the view to play their contents inline, regardless
 9 of whether inline playback is restricted on the current device.
 10
 11 * UIProcess/API/Cocoa/WKWebView.mm:
 12 (-[WKWebView _setRequiresUserActionForMediaPlayback:]): Added. Pass through to WebPageProxy.
 13 (-[WKWebView _allowsMediaDocumentInlinePlayback]): Ditto.
 14 * UIProcess/API/Cocoa/WKWebViewPrivate.h:
 15 * UIProcess/WebPageProxy.cpp:
 16 (WebKit::WebPageProxy::allowsMediaDocumentInlinePlayback): Simple getter.
 17 (WebKit::WebPageProxy::setAllowsMediaDocumentInlinePlayback): Set, and conditionally pass the new value to WebPage.
 18 * UIProcess/WebPageProxy.h:
 19 * WebProcess/WebPage/WebPage.cpp:
 20 (WebKit::WebPage::setAllowsMediaDocumentInlinePlayback): Set, and conditionally notify WebCore page of the change.
 21 * WebProcess/WebPage/WebPage.h:
 22 (WebKit::WebPage::allowsMediaDocumentInlinePlayback): Simple getter.
 23 * WebProcess/WebPage/WebPage.messages.in: Add new messages.
 24
1252015-07-20 Tomas Popela <tpopela@redhat.com>
226
327 [GTK] Add selection-changed signal to the WebKit2 API

Source/WebCore/dom/Document.cpp

@@bool Document::hidden() const
16141614 return pageVisibilityState() != PageVisibilityStateVisible;
16151615}
16161616
 1617
 1618#if ENABLE(VIDEO)
 1619void Document::registerForAllowsMediaDocumentInlinePlaybackChangedCallbacks(HTMLMediaElement& element)
 1620{
 1621 m_allowsMediaDocumentInlinePlaybackElements.add(&element);
 1622}
 1623
 1624void Document::unregisterForAllowsMediaDocumentInlinePlaybackChangedCallbacks(HTMLMediaElement& element)
 1625{
 1626 m_allowsMediaDocumentInlinePlaybackElements.remove(&element);
 1627}
 1628
 1629void Document::allowsMediaDocumentInlinePlaybackChanged()
 1630{
 1631 for (auto* element : m_allowsMediaDocumentInlinePlaybackElements)
 1632 element->allowsMediaDocumentInlinePlaybackChanged();
 1633}
 1634#endif
 1635
16171636#if ENABLE(CSP_NEXT)
16181637DOMSecurityPolicy& Document::securityPolicy()
16191638{

Source/WebCore/dom/Document.h

@@public:
10141014 void registerForVisibilityStateChangedCallbacks(Element*);
10151015 void unregisterForVisibilityStateChangedCallbacks(Element*);
10161016
 1017#if ENABLE(VIDEO)
 1018 void registerForAllowsMediaDocumentInlinePlaybackChangedCallbacks(HTMLMediaElement&);
 1019 void unregisterForAllowsMediaDocumentInlinePlaybackChangedCallbacks(HTMLMediaElement&);
 1020 void allowsMediaDocumentInlinePlaybackChanged();
 1021#endif
 1022
10171023 WEBCORE_EXPORT void setShouldCreateRenderers(bool);
10181024 bool shouldCreateRenderers();
10191025

@@private:
15501556#endif
15511557
15521558 HashSet<Element*> m_visibilityStateCallbackElements;
 1559#if ENABLE(VIDEO)
 1560 HashSet<HTMLMediaElement*> m_allowsMediaDocumentInlinePlaybackElements;
 1561#endif
15531562
15541563 HashMap<StringImpl*, Element*, CaseFoldingHash> m_elementsByAccessKey;
15551564 bool m_accessKeyMapValid;

Source/WebCore/html/HTMLMediaElement.cpp

@@void HTMLMediaElement::registerWithDocument(Document& document)
518518 document.registerForPageCacheSuspensionCallbacks(this);
519519#endif
520520
 521 document.registerForAllowsMediaDocumentInlinePlaybackChangedCallbacks(*this);
 522
521523 document.addAudioProducer(this);
522524 addElementToDocumentMap(*this, document);
523525}

@@void HTMLMediaElement::unregisterWithDocument(Document& document)
550552 document.unregisterForPageCacheSuspensionCallbacks(this);
551553#endif
552554
 555 document.unregisterForAllowsMediaDocumentInlinePlaybackChangedCallbacks(*this);
 556
553557 document.removeAudioProducer(this);
554558 removeElementFromDocumentMap(*this, document);
555559}

@@void HTMLMediaElement::layoutSizeChanged()
38823886 m_resizeTaskQueue.enqueueTask(task);
38833887#endif
38843888}
3885 
 3889
38863890void HTMLMediaElement::setSelectedTextTrack(TextTrack* trackToSelect)
38873891{
38883892 TextTrackList* trackList = textTracks();

@@void HTMLMediaElement::setSessionInternal(MediaSession& session)
65236527
65246528#endif
65256529
 6530void HTMLMediaElement::allowsMediaDocumentInlinePlaybackChanged()
 6531{
 6532 if (potentiallyPlaying() && m_mediaSession->requiresFullscreenForVideoPlayback(*this) && !isFullscreen())
 6533 enterFullscreen();
 6534}
 6535
65266536}
65276537
65286538#endif

Source/WebCore/html/HTMLMediaElement.h

@@public:
448448
449449 void layoutSizeChanged();
450450
 451 void allowsMediaDocumentInlinePlaybackChanged();
 452
451453protected:
452454 HTMLMediaElement(const QualifiedName&, Document&, bool);
453455 virtual ~HTMLMediaElement();

Source/WebCore/html/MediaElementSession.cpp

@@MediaPlayer::Preload MediaElementSession::effectivePreloadForElement(const HTMLM
344344
345345bool MediaElementSession::requiresFullscreenForVideoPlayback(const HTMLMediaElement& element) const
346346{
 347 Page* page = element.document().page();
 348 if (element.document().isMediaDocument() && !element.document().ownerElement() && page && page->allowsMediaDocumentInlinePlayback())
 349 return false;
 350
347351 if (!PlatformMediaSessionManager::sharedManager().sessionRestrictsInlineVideoPlayback(*this))
348352 return false;
349353

Source/WebCore/page/Page.cpp

@@WheelEventTestTrigger& Page::ensureTestTrigger()
17361736 return *m_testTrigger;
17371737}
17381738
 1739#if ENABLE(VIDEO)
 1740void Page::setAllowsMediaDocumentInlinePlayback(bool flag)
 1741{
 1742 if (m_allowsMediaDocumentInlinePlayback == flag)
 1743 return;
 1744 m_allowsMediaDocumentInlinePlayback = flag;
 1745
 1746 Vector<Ref<Document>> documents;
 1747 for (Frame* frame = m_mainFrame.get(); frame; frame = frame->tree().traverseNext())
 1748 documents.append(*frame->document());
 1749
 1750 for (auto& document : documents)
 1751 document->allowsMediaDocumentInlinePlaybackChanged();
 1752}
 1753#endif
 1754
17391755} // namespace WebCore

Source/WebCore/page/Page.h

@@public:
460460 void clearTrigger() { m_testTrigger = nullptr; }
461461 bool expectsWheelEventTriggers() const { return !!m_testTrigger; }
462462
 463#if ENABLE(VIDEO)
 464 WEBCORE_EXPORT bool allowsMediaDocumentInlinePlayback() const { return m_allowsMediaDocumentInlinePlayback; }
 465 WEBCORE_EXPORT void setAllowsMediaDocumentInlinePlayback(bool);
 466#endif
 467
463468private:
464469 WEBCORE_EXPORT void initGroup();
465470

@@private:
619624 MediaProducer::MediaStateFlags m_mediaState { MediaProducer::IsNotPlaying };
620625
621626 bool m_userContentExtensionsEnabled { true };
 627 bool m_allowsMediaDocumentInlinePlayback { false };
622628};
623629
624630inline PageGroup& Page::group()

Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm

@@static inline WebKit::FindOptions toFindOptions(_WKFindOptions wkFindOptions)
25692569 return nil;
25702570}
25712571
 2572#pragma mark media playback restrictions
 2573
 2574- (BOOL)_allowsMediaDocumentInlinePlayback
 2575{
 2576#if PLATFORM(IOS)
 2577 return _page->allowsMediaDocumentInlinePlayback();
 2578#else
 2579 return NO;
 2580#endif
 2581}
 2582
 2583- (void)_setAllowsMediaDocumentInlinePlayback:(BOOL)flag
 2584{
 2585#if PLATFORM(IOS)
 2586 _page->setAllowsMediaDocumentInlinePlayback(flag);
 2587#endif
 2588}
 2589
25722590#pragma mark iOS-specific methods
25732591
25742592#if PLATFORM(IOS)

Source/WebKit2/UIProcess/API/Cocoa/WKWebViewPrivate.h

@@WK_EXTERN NSString * const _WKShouldOpenExternalURLsKey WK_AVAILABLE(WK_MAC_TBA,
208208@property (nonatomic, readonly) NSArray *_scrollPerformanceData WK_AVAILABLE(WK_MAC_TBA, WK_IOS_TBA);
209209
210210- (void)_saveBackForwardSnapshotForItem:(WKBackForwardListItem *)item WK_AVAILABLE(WK_MAC_TBA, WK_IOS_TBA);
 211
 212@property (nonatomic, getter=_allowsMediaDocumentInlinePlayback, setter=_setAllowsMediaDocumentInlinePlayback:) BOOL _allowsMediaDocumentInlinePlayback;
 213
211214@end
212215
213216#endif

Source/WebKit2/UIProcess/WebPageProxy.cpp

@@RefPtr<WebVideoFullscreenManagerProxy> WebPageProxy::videoFullscreenManager()
39823982{
39833983 return m_videoFullscreenManager;
39843984}
 3985
 3986bool WebPageProxy::allowsMediaDocumentInlinePlayback() const
 3987{
 3988 return m_allowsMediaDocumentInlinePlayback;
 3989}
 3990
 3991void WebPageProxy::setAllowsMediaDocumentInlinePlayback(bool flag)
 3992{
 3993 if (m_allowsMediaDocumentInlinePlayback == flag)
 3994 return;
 3995 m_allowsMediaDocumentInlinePlayback = flag;
 3996
 3997 m_process->send(Messages::WebPage::SetAllowsMediaDocumentInlinePlayback(flag), m_pageID);
 3998}
39853999#endif
39864000
39874001// BackForwardList

Source/WebKit2/UIProcess/WebPageProxy.h

@@public:
333333#endif
334334#if PLATFORM(IOS)
335335 RefPtr<WebVideoFullscreenManagerProxy> videoFullscreenManager();
 336
 337 bool allowsMediaDocumentInlinePlayback() const;
 338 void setAllowsMediaDocumentInlinePlayback(bool);
336339#endif
337340
338341#if ENABLE(CONTEXT_MENUS)

@@private:
15741577 WebCore::ViewState::Flags m_viewState;
15751578 bool m_viewWasEverInWindow;
15761579#if PLATFORM(IOS)
 1580 bool m_allowsMediaDocumentInlinePlayback { false };
15771581 bool m_alwaysRunsAtForegroundPriority;
15781582 ProcessThrottler::ForegroundActivityToken m_activityToken;
15791583#endif

Source/WebKit2/WebProcess/WebPage/WebPage.cpp

@@WebVideoFullscreenManager* WebPage::videoFullscreenManager()
30073007 m_videoFullscreenManager = WebVideoFullscreenManager::create(this);
30083008 return m_videoFullscreenManager.get();
30093009}
 3010
 3011void WebPage::setAllowsMediaDocumentInlinePlayback(bool flag)
 3012{
 3013 m_page->setAllowsMediaDocumentInlinePlayback(flag);
 3014}
30103015#endif
30113016
30123017#if ENABLE(FULLSCREEN_API)

Source/WebKit2/WebProcess/WebPage/WebPage.h

@@public:
236236
237237#if PLATFORM(IOS)
238238 WebVideoFullscreenManager* videoFullscreenManager();
 239 void setAllowsMediaDocumentInlinePlayback(bool);
 240 bool allowsMediaDocumentInlinePlayback() const { return m_allowsMediaDocumentInlinePlayback; }
239241#endif
240242
241243#if ENABLE(FULLSCREEN_API)

@@private:
12581260 RefPtr<WebInspectorUI> m_inspectorUI;
12591261#if PLATFORM(IOS)
12601262 RefPtr<WebVideoFullscreenManager> m_videoFullscreenManager;
 1263 bool m_allowsMediaDocumentInlinePlayback { false };
12611264#endif
12621265#if ENABLE(FULLSCREEN_API)
12631266 RefPtr<WebFullScreenManager> m_fullScreenManager;

Source/WebKit2/WebProcess/WebPage/WebPage.messages.in

@@messages -> WebPage LegacyReceiver {
9595 ContentSizeCategoryDidChange(String contentSizeCategory)
9696 ExecuteEditCommandWithCallback(String name, uint64_t callbackID)
9797 GetLookupContextAtPoint(WebCore::IntPoint point, uint64_t callbackID)
 98 SetAllowsMediaDocumentInlinePlayback(bool flag)
9899#endif
99100
100101#if ENABLE(REMOTE_INSPECTOR)