[chromecast] MediaBlock: Added cast renderer initialization block.

Allowed a new type of media block that blocks cast_renderer
initialization instead of webmediaplayer loading.

Test: Manual test blocking is happening at the renderer by inspecting
device logs
Bug: b/134961542

Change-Id: I97b0e59a6752c43d14b8e96327079aa8669b1c00
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1673829
Reviewed-by: Sean Topping <[email protected]>
Reviewed-by: Yuchen Liu <[email protected]>
Auto-Submit: Andres Medina <[email protected]>
Commit-Queue: Andres Medina <[email protected]>
Cr-Commit-Position: refs/heads/master@{#672687}
diff --git a/chromecast/browser/cast_renderer_block_data.cc b/chromecast/browser/cast_renderer_block_data.cc
new file mode 100644
index 0000000..62d77db
--- /dev/null
+++ b/chromecast/browser/cast_renderer_block_data.cc
@@ -0,0 +1,70 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chromecast/browser/cast_renderer_block_data.h"
+
+#include "chromecast/browser/application_media_info_manager.h"
+#include "chromecast/browser/cast_session_id_map.h"
+#include "content/public/browser/web_contents.h"
+
+namespace chromecast {
+namespace shell {
+namespace {
+
+const char kUserDataKey[] = "chromecast.shell.RenderBlockUserData.key";
+
+CastRendererBlockData* GetOrCreateCastRendererBlockData(
+    content::WebContents* web_contents) {
+  CastRendererBlockData* data = static_cast<CastRendererBlockData*>(
+      web_contents->GetUserData(kUserDataKey));
+  if (!data) {
+    auto cast_renderer_block_data = std::make_unique<CastRendererBlockData>();
+    data = cast_renderer_block_data.get();
+    web_contents->SetUserData(kUserDataKey,
+                              std::move(cast_renderer_block_data));
+  }
+  return data;
+}
+
+}  // namespace
+
+// static
+void CastRendererBlockData::SetRendererBlockForWebContents(
+    content::WebContents* web_contents,
+    bool blocked) {
+  DCHECK(web_contents);
+  CastRendererBlockData* data = GetOrCreateCastRendererBlockData(web_contents);
+  data->SetBlocked(blocked);
+}
+
+// static
+void CastRendererBlockData::SetApplicationMediaInfoManagerForWebContents(
+    content::WebContents* web_contents,
+    media::ApplicationMediaInfoManager* application_media_info_manager) {
+  DCHECK(web_contents);
+  CastRendererBlockData* data = GetOrCreateCastRendererBlockData(web_contents);
+  data->SetApplicationMediaInfoManager(application_media_info_manager);
+}
+
+CastRendererBlockData::CastRendererBlockData() : blocked_(false) {}
+CastRendererBlockData::~CastRendererBlockData() = default;
+
+void CastRendererBlockData::SetBlocked(bool blocked) {
+  LOG(INFO) << "Setting blocked to: " << blocked << " from " << blocked_;
+  blocked_ = blocked;
+  if (application_media_info_manager_) {
+    application_media_info_manager_->SetRendererBlock(blocked);
+  }
+}
+
+void CastRendererBlockData::SetApplicationMediaInfoManager(
+    media::ApplicationMediaInfoManager* application_media_info_manager) {
+  DCHECK(application_media_info_manager);
+  application_media_info_manager_ =
+      base::AsWeakPtr(application_media_info_manager);
+  application_media_info_manager_->SetRendererBlock(blocked_);
+}
+
+}  // namespace shell
+}  // namespace chromecast