Index: chrome/browser/android/media_in_product_help_manager.cc |
diff --git a/chrome/browser/android/media_in_product_help_manager.cc b/chrome/browser/android/media_in_product_help_manager.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4ef0c5a63c28f5e5c7ceb770af38cb5401a78754 |
--- /dev/null |
+++ b/chrome/browser/android/media_in_product_help_manager.cc |
@@ -0,0 +1,116 @@ |
+// Copyright 2017 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 "chrome/browser/android/media_in_product_help_manager.h" |
+ |
+#include "base/memory/ptr_util.h" |
+#include "base/optional.h" |
+#include "content/public/browser/navigation_handle.h" |
+#include "content/public/browser/render_frame_host.h" |
+#include "content/public/browser/render_widget_host_view.h" |
+#include "mojo/public/cpp/bindings/strong_binding.h" |
+#include "services/service_manager/public/cpp/bind_source_info.h" |
+#include "services/service_manager/public/cpp/interface_provider.h" |
+ |
+namespace { |
+ |
+void SendDismissUIToRenderer(content::RenderFrameHost* render_frame_host) { |
+ blink::mojom::MediaInProductHelpDelegatePtr delegate_service; |
+ render_frame_host->GetRemoteInterfaces()->GetInterface(&delegate_service); |
+ delegate_service->WidgetDismissed(); |
+} |
+ |
+} // namespace |
+ |
+class MediaInProductHelpManager::MediaInProductHelp |
+ : public blink::mojom::MediaInProductHelp { |
+ public: |
+ MediaInProductHelp(content::RenderFrameHost* render_frame_host, |
+ MediaInProductHelpManager* manager) |
+ : render_frame_host_(render_frame_host), manager_(manager) { |
+ DCHECK(render_frame_host_); |
+ DCHECK(manager_); |
+ } |
+ ~MediaInProductHelp() override = default; |
+ |
+ // blink::mojom::MediaPromoUI implementation. |
+ void ShowInProductHelpWidget(const gfx::Rect& rect) override { |
+ manager_->ShowInProductHelpWidget(render_frame_host_, rect); |
+ } |
+ |
+ void HideInProductHelpWidget() override { |
+ manager_->HideInProductHelpWidget(render_frame_host_); |
+ } |
+ |
+ private: |
+ content::RenderFrameHost* render_frame_host_; |
+ MediaInProductHelpManager* manager_; |
nyquist
2017/06/29 02:10:23
Nit: Could you write a comment about lifetime / ow
Khushal
2017/07/07 04:18:14
Done.
|
+}; |
+ |
+MediaInProductHelpManager::MediaInProductHelpManager( |
+ content::WebContents* web_contents, |
+ MediaInProductHelpManagerClient* client) |
+ : WebContentsObserver(web_contents), client_(client), weak_factory_(this) { |
+ DCHECK(client_); |
+} |
+ |
+MediaInProductHelpManager::~MediaInProductHelpManager() { |
+ if (active_render_frame_host_) { |
+ client_->DismissMediaDownloadInProductHelp(); |
nyquist
2017/06/29 02:10:23
In the API description, it's stated that a call to
Khushal
2017/07/07 04:18:14
It should happen in the same call stack. The call
|
+ } |
+} |
+ |
+void MediaInProductHelpManager::WidgetDismissed() { |
+ DCHECK(active_render_frame_host_); |
+ |
+ SendDismissUIToRenderer(active_render_frame_host_); |
+ active_render_frame_host_ = nullptr; |
+} |
+ |
+void MediaInProductHelpManager::RenderFrameCreated( |
+ content::RenderFrameHost* render_frame_host) { |
+ // Register the bridge service for the renderer to request showing the UI. |
+ render_frame_host->GetInterfaceRegistry()->AddInterface( |
+ base::Bind(&MediaInProductHelpManager::CreateInProductHelpService, |
+ weak_factory_.GetWeakPtr(), render_frame_host)); |
+} |
+ |
+void MediaInProductHelpManager::RenderFrameDeleted( |
+ content::RenderFrameHost* render_frame_host) { |
+ if (active_render_frame_host_ != render_frame_host) |
+ return; |
+ client_->DismissMediaDownloadInProductHelp(); |
+} |
+ |
+void MediaInProductHelpManager::CreateInProductHelpService( |
+ content::RenderFrameHost* render_frame_host, |
+ const service_manager::BindSourceInfo& source_info, |
+ blink::mojom::MediaInProductHelpRequest request) { |
+ mojo::MakeStrongBinding( |
+ base::MakeUnique<MediaInProductHelp>(render_frame_host, this), |
+ std::move(request)); |
+} |
+ |
+void MediaInProductHelpManager::ShowInProductHelpWidget( |
+ content::RenderFrameHost* render_frame_host, |
+ const gfx::Rect& rect_in_main_frame) { |
+ if (active_render_frame_host_ && |
+ active_render_frame_host_ != render_frame_host) { |
+ // If we are currently showing the UI for another frame, inform the |
+ // requesting frame that the widget can not be shown. |
+ SendDismissUIToRenderer(render_frame_host); |
+ return; |
+ } |
+ |
+ active_render_frame_host_ = render_frame_host; |
+ client_->ShowMediaDownloadInProductHelp(rect_in_main_frame); |
+} |
+ |
+void MediaInProductHelpManager::HideInProductHelpWidget( |
+ content::RenderFrameHost* render_frame_host) { |
+ // We might have dismissed the widget for this frame already. |
+ if (active_render_frame_host_ != render_frame_host) |
+ return; |
+ client_->DismissMediaDownloadInProductHelp(); |
+} |