OLD | NEW |
---|---|
(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_in_product_help_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 blink::mojom::MediaInProductHelpDelegatePtr delegate_service; | |
20 render_frame_host->GetRemoteInterfaces()->GetInterface(&delegate_service); | |
21 delegate_service->WidgetDismissed(); | |
22 } | |
23 | |
24 } // namespace | |
25 | |
26 class MediaInProductHelpManager::MediaInProductHelp | |
27 : public blink::mojom::MediaInProductHelp { | |
28 public: | |
29 MediaInProductHelp(content::RenderFrameHost* render_frame_host, | |
30 MediaInProductHelpManager* manager) | |
31 : render_frame_host_(render_frame_host), manager_(manager) { | |
32 DCHECK(render_frame_host_); | |
33 DCHECK(manager_); | |
34 } | |
35 ~MediaInProductHelp() override = default; | |
36 | |
37 // blink::mojom::MediaPromoUI implementation. | |
38 void ShowInProductHelpWidget(const gfx::Rect& rect) override { | |
39 manager_->ShowInProductHelpWidget(render_frame_host_, rect); | |
40 } | |
41 | |
42 void HideInProductHelpWidget() override { | |
43 manager_->HideInProductHelpWidget(render_frame_host_); | |
44 } | |
45 | |
46 private: | |
47 content::RenderFrameHost* render_frame_host_; | |
48 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.
| |
49 }; | |
50 | |
51 MediaInProductHelpManager::MediaInProductHelpManager( | |
52 content::WebContents* web_contents, | |
53 MediaInProductHelpManagerClient* client) | |
54 : WebContentsObserver(web_contents), client_(client), weak_factory_(this) { | |
55 DCHECK(client_); | |
56 } | |
57 | |
58 MediaInProductHelpManager::~MediaInProductHelpManager() { | |
59 if (active_render_frame_host_) { | |
60 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
| |
61 } | |
62 } | |
63 | |
64 void MediaInProductHelpManager::WidgetDismissed() { | |
65 DCHECK(active_render_frame_host_); | |
66 | |
67 SendDismissUIToRenderer(active_render_frame_host_); | |
68 active_render_frame_host_ = nullptr; | |
69 } | |
70 | |
71 void MediaInProductHelpManager::RenderFrameCreated( | |
72 content::RenderFrameHost* render_frame_host) { | |
73 // Register the bridge service for the renderer to request showing the UI. | |
74 render_frame_host->GetInterfaceRegistry()->AddInterface( | |
75 base::Bind(&MediaInProductHelpManager::CreateInProductHelpService, | |
76 weak_factory_.GetWeakPtr(), render_frame_host)); | |
77 } | |
78 | |
79 void MediaInProductHelpManager::RenderFrameDeleted( | |
80 content::RenderFrameHost* render_frame_host) { | |
81 if (active_render_frame_host_ != render_frame_host) | |
82 return; | |
83 client_->DismissMediaDownloadInProductHelp(); | |
84 } | |
85 | |
86 void MediaInProductHelpManager::CreateInProductHelpService( | |
87 content::RenderFrameHost* render_frame_host, | |
88 const service_manager::BindSourceInfo& source_info, | |
89 blink::mojom::MediaInProductHelpRequest request) { | |
90 mojo::MakeStrongBinding( | |
91 base::MakeUnique<MediaInProductHelp>(render_frame_host, this), | |
92 std::move(request)); | |
93 } | |
94 | |
95 void MediaInProductHelpManager::ShowInProductHelpWidget( | |
96 content::RenderFrameHost* render_frame_host, | |
97 const gfx::Rect& rect_in_main_frame) { | |
98 if (active_render_frame_host_ && | |
99 active_render_frame_host_ != render_frame_host) { | |
100 // If we are currently showing the UI for another frame, inform the | |
101 // requesting frame that the widget can not be shown. | |
102 SendDismissUIToRenderer(render_frame_host); | |
103 return; | |
104 } | |
105 | |
106 active_render_frame_host_ = render_frame_host; | |
107 client_->ShowMediaDownloadInProductHelp(rect_in_main_frame); | |
108 } | |
109 | |
110 void MediaInProductHelpManager::HideInProductHelpWidget( | |
111 content::RenderFrameHost* render_frame_host) { | |
112 // We might have dismissed the widget for this frame already. | |
113 if (active_render_frame_host_ != render_frame_host) | |
114 return; | |
115 client_->DismissMediaDownloadInProductHelp(); | |
116 } | |
OLD | NEW |