Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(244)

Side by Side Diff: chrome/browser/android/media_iph_manager.cc

Issue 2943983003: chrome/blink: Add functionality for in-product help for media elements. (Closed)
Patch Set: Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 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
5 #include "chrome/browser/android/media_iph_manager.h"
6
7 #include "base/memory/ptr_util.h"
8 #include "base/optional.h"
9 #include "content/public/browser/navigation_handle.h"
10 #include "content/public/browser/render_frame_host.h"
11 #include "content/public/browser/render_widget_host_view.h"
12 #include "mojo/public/cpp/bindings/strong_binding.h"
13 #include "services/service_manager/public/cpp/bind_source_info.h"
14 #include "services/service_manager/public/cpp/interface_provider.h"
15
16 namespace {
17
18 void SendDismissUIToRenderer(content::RenderFrameHost* render_frame_host) {
19 chrome::mojom::MediaIPHDelegateServicePtr delegate_service;
20 render_frame_host->GetRemoteInterfaces()->GetInterface(&delegate_service);
21 delegate_service->WidgetDismissed();
22 }
23
24 } // namespace
25
26 class MediaIPHManager::MediaIPHService : public chrome::mojom::MediaIPHService {
27 public:
28 MediaIPHService(content::RenderFrameHost* render_frame_host,
29 MediaIPHManager* manager)
30 : render_frame_host_(render_frame_host), manager_(manager) {
31 DCHECK(render_frame_host_);
32 DCHECK(manager_);
33 }
34 ~MediaIPHService() override = default;
35
36 // chrome::mojom::MediaPromoUI implementation.
37 void ShowIPHWidget(const gfx::Rect& button_rect, bool new_request) override {
38 manager_->ShowIPHWidget(render_frame_host_, button_rect, new_request);
39 }
40
41 void HideIPHWidget() override { manager_->HideIPHWidget(render_frame_host_); }
42
43 private:
44 content::RenderFrameHost* render_frame_host_;
45 MediaIPHManager* manager_;
46 };
47
48 MediaIPHManager::MediaIPHManager(content::WebContents* web_contents,
49 MediaIPHManagerClient* client)
50 : WebContentsObserver(web_contents), client_(client), weak_factory_(this) {
51 DCHECK(client_);
52 }
53
54 MediaIPHManager::~MediaIPHManager() {
55 if (active_render_frame_host_) {
56 client_->DismissMediaDownloadIPH();
57 }
58 }
59
60 void MediaIPHManager::WidgetDismissed() {
61 DCHECK(active_render_frame_host_);
62
63 SendDismissUIToRenderer(active_render_frame_host_);
64 active_render_frame_host_ = nullptr;
65 }
66
67 void MediaIPHManager::RenderFrameCreated(
68 content::RenderFrameHost* render_frame_host) {
69 // Register the bridge service for the renderer to request showing the UI.
70 render_frame_host->GetInterfaceRegistry()->AddInterface(
71 base::Bind(&MediaIPHManager::CreateIPHService, weak_factory_.GetWeakPtr(),
72 render_frame_host));
73 }
74
75 void MediaIPHManager::RenderFrameDeleted(
76 content::RenderFrameHost* render_frame_host) {
77 if (active_render_frame_host_ != render_frame_host)
78 return;
79 client_->DismissMediaDownloadIPH();
80 }
81
82 void MediaIPHManager::CreateIPHService(
83 content::RenderFrameHost* render_frame_host,
84 const service_manager::BindSourceInfo& source_info,
85 chrome::mojom::MediaIPHServiceRequest request) {
86 mojo::MakeStrongBinding(
87 base::MakeUnique<MediaIPHService>(render_frame_host, this),
88 std::move(request));
89 }
90
91 void MediaIPHManager::ShowIPHWidget(content::RenderFrameHost* render_frame_host,
92 const gfx::Rect& rect_in_main_frame,
93 bool new_request) {
94 if (active_render_frame_host_ &&
95 active_render_frame_host_ != render_frame_host) {
96 // If we are currently showing the UI for another frame, inform the
97 // requesting frame that the widget can not be shown.
98 SendDismissUIToRenderer(render_frame_host);
99 return;
100 }
101
102 if (!active_render_frame_host_) {
103 // We might have dismissed the widget while this update was in flight.
104 if (!new_request)
105 return;
106
107 // If we don't want to show the IPH for this button, inform the renderer.
108 if (!client_->ShowMediaDownloadIPH()) {
109 SendDismissUIToRenderer(render_frame_host);
110 return;
111 }
112
113 active_render_frame_host_ = render_frame_host;
114 }
115
116 client_->UpdateMediaDownloadIPHPosition(rect_in_main_frame);
117 }
118
119 void MediaIPHManager::HideIPHWidget(
120 content::RenderFrameHost* render_frame_host) {
121 // We might have dismissed the widget for this frame already.
122 if (active_render_frame_host_ != render_frame_host)
123 return;
124 client_->DismissMediaDownloadIPH();
125 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698