media_playback_options.cc 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. // Copyright 2018 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/media_control/renderer/media_playback_options.h"
  5. #include <string>
  6. #include <vector>
  7. #include "base/bind.h"
  8. #include "base/callback.h"
  9. #include "base/logging.h"
  10. #include "components/media_control/renderer/media_control_buildflags.h"
  11. #include "content/public/renderer/render_frame.h"
  12. #include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h"
  13. #if BUILDFLAG(ENABLE_MEDIA_CONTROL_LOGGING_OVERRIDE)
  14. #if !defined(DVLOG)
  15. #error This file must be included after base/logging.h.
  16. #endif
  17. #undef DVLOG
  18. #define DVLOG(verboselevel) LOG(INFO)
  19. #endif // BUILDFLAG(ENABLE_MEDIA_CONTROL_LOGGING_OVERRIDE)
  20. namespace media_control {
  21. MediaPlaybackOptions::MediaPlaybackOptions(content::RenderFrame* render_frame)
  22. : content::RenderFrameObserver(render_frame),
  23. content::RenderFrameObserverTracker<MediaPlaybackOptions>(render_frame),
  24. render_frame_action_blocked_(false) {
  25. // TODO(https://crbug.com/1057860): Extract to callers and remove
  26. // renderer_media_playback_options_.
  27. // Override default content MediaPlaybackOptions
  28. renderer_media_playback_options_
  29. .is_background_video_track_optimization_supported = false;
  30. render_frame->SetRenderFrameMediaPlaybackOptions(
  31. renderer_media_playback_options_);
  32. render_frame->GetAssociatedInterfaceRegistry()
  33. ->AddInterface<components::media_control::mojom::MediaPlaybackOptions>(
  34. base::BindRepeating(
  35. &MediaPlaybackOptions::OnMediaPlaybackOptionsAssociatedReceiver,
  36. base::Unretained(this)));
  37. }
  38. MediaPlaybackOptions::~MediaPlaybackOptions() {
  39. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  40. }
  41. void MediaPlaybackOptions::OnDestruct() {
  42. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  43. delete this;
  44. }
  45. bool MediaPlaybackOptions::RunWhenInForeground(base::OnceClosure closure) {
  46. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  47. if (!render_frame_action_blocked_) {
  48. std::move(closure).Run();
  49. return false;
  50. }
  51. DVLOG(1) << "A render frame action is being blocked.";
  52. pending_closures_.push_back(std::move(closure));
  53. return true;
  54. }
  55. void MediaPlaybackOptions::SetMediaLoadingBlocked(bool blocked) {
  56. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  57. render_frame_action_blocked_ = blocked;
  58. if (blocked) {
  59. DVLOG(1) << "Render frame actions are blocked.";
  60. return;
  61. }
  62. // Move callbacks in case OnBlockMediaLoading() is called somehow
  63. // during iteration.
  64. std::vector<base::OnceClosure> callbacks;
  65. callbacks.swap(pending_closures_);
  66. for (auto& cb : callbacks) {
  67. std::move(cb).Run();
  68. }
  69. DVLOG(1) << "Render frame actions are unblocked.";
  70. }
  71. void MediaPlaybackOptions::SetBackgroundVideoPlaybackEnabled(bool enabled) {
  72. renderer_media_playback_options_.is_background_video_playback_enabled =
  73. enabled;
  74. render_frame()->SetRenderFrameMediaPlaybackOptions(
  75. renderer_media_playback_options_);
  76. }
  77. void MediaPlaybackOptions::SetRendererType(content::mojom::RendererType type) {
  78. renderer_media_playback_options_.renderer_type = type;
  79. render_frame()->SetRenderFrameMediaPlaybackOptions(
  80. renderer_media_playback_options_);
  81. }
  82. void MediaPlaybackOptions::OnMediaPlaybackOptionsAssociatedReceiver(
  83. mojo::PendingAssociatedReceiver<
  84. components::media_control::mojom::MediaPlaybackOptions> receiver) {
  85. receivers_.Add(this, std::move(receiver));
  86. }
  87. } // namespace media_control