Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(741)

Unified Diff: third_party/WebKit/Source/modules/media_controls/MediaControlsImpl.cpp

Issue 2782373002: Remove MediaControls methods needed for the Cast button (Closed)
Patch Set: Fixed MediaControlsImplTest Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/modules/media_controls/MediaControlsImpl.cpp
diff --git a/third_party/WebKit/Source/modules/media_controls/MediaControlsImpl.cpp b/third_party/WebKit/Source/modules/media_controls/MediaControlsImpl.cpp
index a6289dbe9e516d390c539aa9ccc507d119752c04..58d85af640fea295d259f51ca5dfe4993fbcb5a8 100644
--- a/third_party/WebKit/Source/modules/media_controls/MediaControlsImpl.cpp
+++ b/third_party/WebKit/Source/modules/media_controls/MediaControlsImpl.cpp
@@ -29,6 +29,10 @@
#include "bindings/core/v8/ExceptionState.h"
#include "core/dom/ClientRect.h"
#include "core/dom/Fullscreen.h"
+#include "core/dom/MutationCallback.h"
+#include "core/dom/MutationObserver.h"
+#include "core/dom/MutationObserverInit.h"
+#include "core/dom/MutationRecord.h"
#include "core/dom/ResizeObserver.h"
#include "core/dom/ResizeObserverCallback.h"
#include "core/dom/ResizeObserverEntry.h"
@@ -63,6 +67,8 @@
#include "modules/media_controls/elements/MediaControlTimelineElement.h"
#include "modules/media_controls/elements/MediaControlToggleClosedCaptionsButtonElement.h"
#include "modules/media_controls/elements/MediaControlVolumeSliderElement.h"
+#include "modules/remoteplayback/HTMLMediaElementRemotePlayback.h"
+#include "modules/remoteplayback/RemotePlayback.h"
#include "platform/EventDispatchForbiddenScope.h"
namespace blink {
@@ -132,7 +138,9 @@ bool ShouldShowCastButton(HTMLMediaElement& media_element) {
return false;
}
- return media_element.HasRemoteRoutes();
+ RemotePlayback* remote =
+ HTMLMediaElementRemotePlayback::remote(media_element);
+ return remote && remote->RemotePlaybackAvailable();
}
bool PreferHiddenVolumeControls(const Document& document) {
@@ -193,6 +201,57 @@ class MediaControlsImpl::MediaControlsResizeObserverCallback final
Member<MediaControlsImpl> controls_;
};
+// Observes changes to the HTMLMediaElement attributes that affect controls.
+// Currently only observes the disableRemotePlayback attribute.
+class MediaControlsImpl::MediaElementMutationCallback
+ : public MutationCallback {
+ public:
+ explicit MediaElementMutationCallback(MediaControlsImpl* controls)
+ : controls_(controls) {
+ observer_ = MutationObserver::Create(this);
+ Vector<String> filter;
+ filter.push_back(HTMLNames::disableremoteplaybackAttr.ToString());
+ MutationObserverInit init;
+ init.setAttributeOldValue(true);
+ init.setAttributes(true);
+ init.setAttributeFilter(filter);
+ observer_->observe(&controls_->MediaElement(), init, ASSERT_NO_EXCEPTION);
+ }
+
+ DEFINE_INLINE_VIRTUAL_TRACE() {
+ visitor->Trace(controls_);
+ visitor->Trace(observer_);
+ MutationCallback::Trace(visitor);
+ }
+
+ void Disconnect() { observer_->disconnect(); }
+
+ private:
+ void Call(const HeapVector<Member<MutationRecord>>& records,
+ MutationObserver*) override {
+ for (const auto& record : records) {
+ if (record->type() != "attributes")
+ continue;
+
+ const Element& element = *ToElement(record->target());
+ if (record->oldValue() == element.getAttribute(record->attributeName()))
+ continue;
+
+ DCHECK_EQ(HTMLNames::disableremoteplaybackAttr.ToString(),
+ record->attributeName());
+ controls_->RefreshCastButtonVisibility();
+ return;
+ }
+ }
+
+ ExecutionContext* GetExecutionContext() const override {
+ return &controls_->GetDocument();
+ }
+
+ Member<MediaControlsImpl> controls_;
+ Member<MutationObserver> observer_;
+};
+
MediaControls* MediaControlsImpl::Factory::Create(
HTMLMediaElement& media_element,
ShadowRoot& shadow_root) {
@@ -417,6 +476,9 @@ Node::InsertionNotificationRequest MediaControlsImpl::InsertedInto(
resize_observer_->observe(&html_media_element);
}
+ if (!element_mutation_callback_)
+ element_mutation_callback_ = new MediaElementMutationCallback(this);
+
return HTMLDivElement::InsertedInto(root);
}
@@ -432,6 +494,11 @@ void MediaControlsImpl::RemovedFrom(ContainerNode*) {
orientation_lock_delegate_->Detach();
resize_observer_.Clear();
+
+ if (element_mutation_callback_) {
+ element_mutation_callback_->Disconnect();
+ element_mutation_callback_.Clear();
+ }
}
void MediaControlsImpl::Reset() {
@@ -517,12 +584,16 @@ void MediaControlsImpl::MakeTransparent() {
bool MediaControlsImpl::ShouldHideMediaControls(unsigned behavior_flags) const {
// Never hide for a media element without visual representation.
if (!MediaElement().IsHTMLVideoElement() || !MediaElement().HasVideo() ||
- MediaElement().IsPlayingRemotely() ||
toHTMLVideoElement(MediaElement()).GetMediaRemotingStatus() ==
HTMLVideoElement::MediaRemotingStatus::kStarted) {
return false;
}
+ RemotePlayback* remote =
+ HTMLMediaElementRemotePlayback::remote(MediaElement());
+ if (remote && remote->GetState() != WebRemotePlaybackState::kDisconnected)
+ return false;
+
// Keep the controls visible as long as the timer is running.
const bool ignore_wait_for_timer = behavior_flags & kIgnoreWaitForTimer;
if (!ignore_wait_for_timer && keep_showing_until_timer_fires_)
@@ -662,8 +733,9 @@ void MediaControlsImpl::RefreshCastButtonVisibilityWithoutUpdate() {
void MediaControlsImpl::ShowOverlayCastButtonIfNeeded() {
if (MediaElement().ShouldShowControls() ||
- !ShouldShowCastButton(MediaElement()))
+ !ShouldShowCastButton(MediaElement())) {
return;
+ }
overlay_cast_button_->TryShowOverlay();
ResetHideMediaControlsTimer();
@@ -677,14 +749,9 @@ void MediaControlsImpl::ExitFullscreen() {
Fullscreen::ExitFullscreen(GetDocument());
}
-void MediaControlsImpl::StartedCasting() {
- cast_button_->SetIsPlayingRemotely(true);
- overlay_cast_button_->SetIsPlayingRemotely(true);
-}
-
-void MediaControlsImpl::StoppedCasting() {
- cast_button_->SetIsPlayingRemotely(false);
- overlay_cast_button_->SetIsPlayingRemotely(false);
+void MediaControlsImpl::RemotePlaybackStateChanged() {
+ cast_button_->UpdateDisplayType();
+ overlay_cast_button_->UpdateDisplayType();
}
void MediaControlsImpl::DefaultEventHandler(Event* event) {
@@ -1108,6 +1175,7 @@ void MediaControlsImpl::HideAllMenus() {
}
DEFINE_TRACE(MediaControlsImpl) {
+ visitor->Trace(element_mutation_callback_);
visitor->Trace(resize_observer_);
visitor->Trace(panel_);
visitor->Trace(overlay_play_button_);

Powered by Google App Engine
This is Rietveld 408576698