Chromium Code Reviews| 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(); |
| +} |