OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ui/android/context_menu_helper.h" | 5 #include "chrome/browser/ui/android/context_menu_helper.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
11 #include "base/android/jni_android.h" | 11 #include "base/android/callback_android.h" |
12 #include "base/android/jni_array.h" | |
13 #include "base/android/jni_string.h" | 12 #include "base/android/jni_string.h" |
14 #include "base/bind_helpers.h" | 13 #include "base/bind_helpers.h" |
| 14 #include "base/callback.h" |
15 #include "chrome/browser/android/download/download_controller_base.h" | 15 #include "chrome/browser/android/download/download_controller_base.h" |
16 #include "chrome/browser/ui/tab_contents/core_tab_helper.h" | 16 #include "chrome/browser/ui/tab_contents/core_tab_helper.h" |
17 #include "chrome/common/thumbnail_capturer.mojom.h" | 17 #include "chrome/common/thumbnail_capturer.mojom.h" |
18 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_heade
rs.h" | 18 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_heade
rs.h" |
19 #include "content/public/browser/android/content_view_core.h" | 19 #include "content/public/browser/android/content_view_core.h" |
20 #include "content/public/browser/render_frame_host.h" | 20 #include "content/public/browser/render_frame_host.h" |
21 #include "content/public/browser/render_process_host.h" | 21 #include "content/public/browser/render_process_host.h" |
22 #include "content/public/common/context_menu_params.h" | 22 #include "content/public/common/context_menu_params.h" |
23 #include "jni/ContextMenuHelper_jni.h" | 23 #include "jni/ContextMenuHelper_jni.h" |
24 #include "jni/ContextMenuParams_jni.h" | 24 #include "jni/ContextMenuParams_jni.h" |
25 #include "services/service_manager/public/cpp/interface_provider.h" | 25 #include "services/service_manager/public/cpp/interface_provider.h" |
26 #include "third_party/WebKit/public/web/WebContextMenuData.h" | 26 #include "third_party/WebKit/public/web/WebContextMenuData.h" |
27 #include "ui/android/window_android.h" | |
28 #include "ui/gfx/geometry/point.h" | 27 #include "ui/gfx/geometry/point.h" |
| 28 #include "ui/gfx/geometry/size.h" |
29 | 29 |
30 using base::android::ConvertJavaStringToUTF8; | 30 using base::android::ConvertJavaStringToUTF8; |
31 using base::android::ConvertUTF8ToJavaString; | 31 using base::android::ConvertUTF8ToJavaString; |
32 using base::android::ConvertUTF16ToJavaString; | 32 using base::android::ConvertUTF16ToJavaString; |
33 using base::android::JavaParamRef; | 33 using base::android::JavaParamRef; |
34 | 34 |
35 DEFINE_WEB_CONTENTS_USER_DATA_KEY(ContextMenuHelper); | 35 DEFINE_WEB_CONTENTS_USER_DATA_KEY(ContextMenuHelper); |
36 | 36 |
37 const int kShareImageMaxWidth = 2048; | |
38 const int kShareImageMaxHeight = 2048; | |
39 | |
40 const char kDataReductionProxyPassthroughHeader[] = | 37 const char kDataReductionProxyPassthroughHeader[] = |
41 "Chrome-Proxy: pass-through\r\n"; | 38 "Chrome-Proxy: pass-through\r\n"; |
42 | 39 |
| 40 namespace { |
| 41 |
| 42 void OnRetrieveImage(chrome::mojom::ThumbnailCapturerPtr thumbnail_capturer, |
| 43 const base::android::JavaRef<jobject>& jcallback, |
| 44 const std::vector<uint8_t>& thumbnail_data, |
| 45 const gfx::Size& original_size) { |
| 46 base::android::RunCallbackAndroid(jcallback, thumbnail_data); |
| 47 } |
| 48 |
| 49 } // namespace |
| 50 |
43 ContextMenuHelper::ContextMenuHelper(content::WebContents* web_contents) | 51 ContextMenuHelper::ContextMenuHelper(content::WebContents* web_contents) |
44 : web_contents_(web_contents), weak_factory_(this) { | 52 : web_contents_(web_contents) { |
45 JNIEnv* env = base::android::AttachCurrentThread(); | 53 JNIEnv* env = base::android::AttachCurrentThread(); |
46 java_obj_.Reset( | 54 java_obj_.Reset( |
47 env, | 55 env, |
48 Java_ContextMenuHelper_create(env, reinterpret_cast<long>(this)).obj()); | 56 Java_ContextMenuHelper_create(env, reinterpret_cast<long>(this)).obj()); |
49 DCHECK(!java_obj_.is_null()); | 57 DCHECK(!java_obj_.is_null()); |
50 } | 58 } |
51 | 59 |
52 ContextMenuHelper::~ContextMenuHelper() { | 60 ContextMenuHelper::~ContextMenuHelper() { |
53 JNIEnv* env = base::android::AttachCurrentThread(); | 61 JNIEnv* env = base::android::AttachCurrentThread(); |
54 Java_ContextMenuHelper_destroy(env, java_obj_); | 62 Java_ContextMenuHelper_destroy(env, java_obj_); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
113 ConvertUTF8ToJavaString(env, params.unfiltered_link_url.spec()), | 121 ConvertUTF8ToJavaString(env, params.unfiltered_link_url.spec()), |
114 ConvertUTF8ToJavaString(env, params.src_url.spec()), | 122 ConvertUTF8ToJavaString(env, params.src_url.spec()), |
115 ConvertUTF16ToJavaString(env, params.title_text), | 123 ConvertUTF16ToJavaString(env, params.title_text), |
116 image_was_fetched_lo_fi, | 124 image_was_fetched_lo_fi, |
117 ConvertUTF8ToJavaString(env, sanitizedReferrer.spec()), | 125 ConvertUTF8ToJavaString(env, sanitizedReferrer.spec()), |
118 params.referrer_policy, can_save); | 126 params.referrer_policy, can_save); |
119 | 127 |
120 return jmenu_info; | 128 return jmenu_info; |
121 } | 129 } |
122 | 130 |
| 131 base::android::ScopedJavaLocalRef<jobject> |
| 132 ContextMenuHelper::GetJavaWebContents(JNIEnv* env, |
| 133 const JavaParamRef<jobject>& obj) { |
| 134 return web_contents_->GetJavaWebContents(); |
| 135 } |
| 136 |
123 void ContextMenuHelper::OnStartDownload( | 137 void ContextMenuHelper::OnStartDownload( |
124 JNIEnv* env, | 138 JNIEnv* env, |
125 const JavaParamRef<jobject>& obj, | 139 const JavaParamRef<jobject>& obj, |
126 jboolean jis_link, | 140 jboolean jis_link, |
127 jboolean jis_data_reduction_proxy_enabled) { | 141 jboolean jis_data_reduction_proxy_enabled) { |
128 std::string headers; | 142 std::string headers; |
129 if (jis_data_reduction_proxy_enabled) | 143 if (jis_data_reduction_proxy_enabled) |
130 headers = kDataReductionProxyPassthroughHeader; | 144 headers = kDataReductionProxyPassthroughHeader; |
131 | 145 |
132 DownloadControllerBase::Get()->StartContextMenuDownload( | 146 DownloadControllerBase::Get()->StartContextMenuDownload( |
133 context_menu_params_, | 147 context_menu_params_, |
134 web_contents_, | 148 web_contents_, |
135 jis_link, | 149 jis_link, |
136 headers); | 150 headers); |
137 } | 151 } |
138 | 152 |
139 void ContextMenuHelper::SearchForImage(JNIEnv* env, | 153 void ContextMenuHelper::SearchForImage(JNIEnv* env, |
140 const JavaParamRef<jobject>& obj) { | 154 const JavaParamRef<jobject>& obj) { |
141 content::RenderFrameHost* render_frame_host = | 155 content::RenderFrameHost* render_frame_host = |
142 content::RenderFrameHost::FromID(render_process_id_, render_frame_id_); | 156 content::RenderFrameHost::FromID(render_process_id_, render_frame_id_); |
143 if (!render_frame_host) | 157 if (!render_frame_host) |
144 return; | 158 return; |
145 | 159 |
146 CoreTabHelper::FromWebContents(web_contents_)->SearchByImageInNewTab( | 160 CoreTabHelper::FromWebContents(web_contents_)->SearchByImageInNewTab( |
147 render_frame_host, context_menu_params_.src_url); | 161 render_frame_host, context_menu_params_.src_url); |
148 } | 162 } |
149 | 163 |
150 void ContextMenuHelper::ShareImage(JNIEnv* env, | 164 void ContextMenuHelper::RetrieveImage(JNIEnv* env, |
151 const JavaParamRef<jobject>& obj) { | 165 const JavaParamRef<jobject>& obj, |
| 166 const JavaParamRef<jobject>& jcallback, |
| 167 jint max_dimen_px) { |
152 content::RenderFrameHost* render_frame_host = | 168 content::RenderFrameHost* render_frame_host = |
153 content::RenderFrameHost::FromID(render_process_id_, render_frame_id_); | 169 content::RenderFrameHost::FromID(render_process_id_, render_frame_id_); |
154 if (!render_frame_host) | 170 if (!render_frame_host) |
155 return; | 171 return; |
156 | 172 |
157 chrome::mojom::ThumbnailCapturerPtr thumbnail_capturer; | |
158 render_frame_host->GetRemoteInterfaces()->GetInterface(&thumbnail_capturer); | |
159 // Bind the InterfacePtr into the callback so that it's kept alive until | |
160 // there's either a connection error or a response. | |
161 auto* thumbnail_capturer_proxy = thumbnail_capturer.get(); | |
162 thumbnail_capturer_proxy->RequestThumbnailForContextNode( | |
163 0, gfx::Size(kShareImageMaxWidth, kShareImageMaxHeight), | |
164 base::Bind(&ContextMenuHelper::OnShareImage, weak_factory_.GetWeakPtr(), | |
165 base::Passed(&thumbnail_capturer))); | |
166 } | |
167 | |
168 void ContextMenuHelper::OnShareImage( | |
169 chrome::mojom::ThumbnailCapturerPtr thumbnail_capturer, | |
170 const std::vector<uint8_t>& thumbnail_data, | |
171 const gfx::Size& original_size) { | |
172 content::ContentViewCore* content_view_core = | |
173 content::ContentViewCore::FromWebContents(web_contents_); | |
174 if (!content_view_core) | |
175 return; | |
176 | |
177 base::android::ScopedJavaLocalRef<jobject> jwindow_android( | |
178 content_view_core->GetWindowAndroid()->GetJavaObject()); | |
179 | |
180 if (jwindow_android.is_null()) | |
181 return; | |
182 | |
183 JNIEnv* env = base::android::AttachCurrentThread(); | |
184 base::android::ScopedJavaLocalRef<jbyteArray> j_bytes = | |
185 base::android::ToJavaByteArray(env, thumbnail_data); | |
186 | |
187 Java_ContextMenuHelper_onShareImageReceived(env, java_obj_, jwindow_android, | |
188 j_bytes); | |
189 } | |
190 | |
191 // TODO(tedchoc): Unify RetrieveHeaderThumbnail and ShareImage. | |
192 void ContextMenuHelper::RetrieveHeaderThumbnail( | |
193 JNIEnv* env, | |
194 const JavaParamRef<jobject>& obj, | |
195 jint j_max_size_px) { | |
196 content::RenderFrameHost* render_frame_host = | |
197 content::RenderFrameHost::FromID(render_process_id_, render_frame_id_); | |
198 | |
199 if (!render_frame_host) | |
200 return; | |
201 | |
202 chrome::mojom::ThumbnailCapturerPtr thumbnail_capturer; | 173 chrome::mojom::ThumbnailCapturerPtr thumbnail_capturer; |
203 render_frame_host->GetRemoteInterfaces()->GetInterface(&thumbnail_capturer); | 174 render_frame_host->GetRemoteInterfaces()->GetInterface(&thumbnail_capturer); |
204 // Bind the InterfacePtr into the callback so that it's kept alive until | 175 // Bind the InterfacePtr into the callback so that it's kept alive until |
205 // there's either a connection error or a response. | 176 // there's either a connection error or a response. |
206 auto* thumbnail_capturer_proxy = thumbnail_capturer.get(); | 177 auto* thumbnail_capturer_proxy = thumbnail_capturer.get(); |
207 thumbnail_capturer_proxy->RequestThumbnailForContextNode( | 178 thumbnail_capturer_proxy->RequestThumbnailForContextNode( |
208 0, gfx::Size(j_max_size_px, j_max_size_px), | 179 0, gfx::Size(max_dimen_px, max_dimen_px), |
209 base::Bind(&ContextMenuHelper::OnHeaderThumbnailReceived, | 180 base::Bind(&OnRetrieveImage, base::Passed(&thumbnail_capturer), |
210 weak_factory_.GetWeakPtr(), | 181 base::android::ScopedJavaGlobalRef<jobject>(env, jcallback))); |
211 base::Passed(&thumbnail_capturer))); | |
212 } | |
213 | |
214 void ContextMenuHelper::OnHeaderThumbnailReceived( | |
215 chrome::mojom::ThumbnailCapturerPtr thumbnail_capturer, | |
216 const std::vector<uint8_t>& thumbnail_data, | |
217 const gfx::Size& original_size) { | |
218 content::ContentViewCore* content_view_core = | |
219 content::ContentViewCore::FromWebContents(web_contents_); | |
220 if (!content_view_core) | |
221 return; | |
222 | |
223 base::android::ScopedJavaLocalRef<jobject> jwindow_android( | |
224 content_view_core->GetWindowAndroid()->GetJavaObject()); | |
225 | |
226 if (jwindow_android.is_null()) | |
227 return; | |
228 | |
229 JNIEnv* env = base::android::AttachCurrentThread(); | |
230 base::android::ScopedJavaLocalRef<jbyteArray> j_bytes = | |
231 base::android::ToJavaByteArray(env, thumbnail_data); | |
232 | |
233 Java_ContextMenuHelper_onHeaderThumbnailReceived(env, java_obj_, | |
234 jwindow_android, j_bytes); | |
235 } | 182 } |
236 | 183 |
237 bool RegisterContextMenuHelper(JNIEnv* env) { | 184 bool RegisterContextMenuHelper(JNIEnv* env) { |
238 return RegisterNativesImpl(env); | 185 return RegisterNativesImpl(env); |
239 } | 186 } |
OLD | NEW |