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..8445c4fdc7cbff10522af3adb3363a44c4a22f20 |
| --- /dev/null |
| +++ b/chrome/browser/android/media_in_product_help_manager.cc |
| @@ -0,0 +1,105 @@ |
| +// 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" |
| + |
| +// This class is created and owned by the MediaInProductHelpManager. |
| +class MediaInProductHelpManager::MediaInProductHelp |
| + : public blink::mojom::MediaInProductHelp { |
| + public: |
| + MediaInProductHelp(content::RenderFrameHost* render_frame_host, |
| + MediaInProductHelpManager* manager, |
| + blink::mojom::MediaInProductHelpRequest request) |
| + : render_frame_host_(render_frame_host), |
| + manager_(manager), |
| + binding_(this, std::move(request)) { |
| + DCHECK(render_frame_host_); |
| + DCHECK(manager_); |
| + |
| + binding_.set_connection_error_handler( |
| + base::BindOnce(&MediaInProductHelpManager::OnConnectionError, |
| + base::Unretained(manager_))); |
| + } |
| + ~MediaInProductHelp() override = default; |
| + |
| + // blink::mojom::MediaPromoUI implementation. |
| + void ShowInProductHelpWidget(const gfx::Rect& rect) override { |
| + manager_->ShowInProductHelpWidget(rect); |
| + } |
| + |
| + content::RenderFrameHost* render_frame_host() const { |
| + return render_frame_host_; |
| + } |
| + |
| + private: |
| + // The |manager_| and |render_frame_host_| outlive this class. |
| + content::RenderFrameHost* render_frame_host_; |
| + MediaInProductHelpManager* manager_; |
| + mojo::Binding<blink::mojom::MediaInProductHelp> binding_; |
| +}; |
|
Sam McNally
2017/07/07 05:22:58
DISALLOW_COPY_AND_ASSIGN
|
| + |
| +MediaInProductHelpManager::MediaInProductHelpManager( |
| + content::WebContents* web_contents, |
| + MediaInProductHelpManagerClient* client) |
| + : WebContentsObserver(web_contents), client_(client), weak_factory_(this) { |
| + DCHECK(client_); |
| +} |
| + |
| +MediaInProductHelpManager::~MediaInProductHelpManager() { |
| + if (media_in_product_help_) { |
| + client_->DismissMediaDownloadInProductHelp(); |
| + } |
| +} |
| + |
| +void MediaInProductHelpManager::WidgetDismissed() { |
| + DCHECK(media_in_product_help_); |
| + media_in_product_help_.reset(); |
| +} |
| + |
| +void MediaInProductHelpManager::RenderFrameCreated( |
| + content::RenderFrameHost* render_frame_host) { |
| + // Register the 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 (media_in_product_help_ && |
| + media_in_product_help_->render_frame_host() == render_frame_host) { |
| + client_->DismissMediaDownloadInProductHelp(); |
| + } |
| +} |
| + |
| +void MediaInProductHelpManager::CreateInProductHelpService( |
| + content::RenderFrameHost* render_frame_host, |
| + const service_manager::BindSourceInfo& source_info, |
| + blink::mojom::MediaInProductHelpRequest request) { |
| + // If we are showing the UI already, ignore the request. |
| + if (media_in_product_help_) |
|
Khushal
2017/07/07 04:18:14
sammc@, is this the correct way to ignore requests
Sam McNally
2017/07/07 05:22:58
Yes. There will be a race between an existing conn
|
| + return; |
| + |
| + media_in_product_help_ = base::MakeUnique<MediaInProductHelp>( |
| + render_frame_host, this, std::move(request)); |
| +} |
| + |
| +void MediaInProductHelpManager::ShowInProductHelpWidget( |
| + const gfx::Rect& rect_in_main_frame) { |
| + client_->ShowMediaDownloadInProductHelp(rect_in_main_frame); |
| +} |
| + |
| +void MediaInProductHelpManager::OnConnectionError() { |
| + DCHECK(media_in_product_help_); |
| + client_->DismissMediaDownloadInProductHelp(); |
| +} |