Chromium Code Reviews| 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" | 12 #include "base/android/jni_array.h" |
| 13 #include "base/android/jni_string.h" | 13 #include "base/android/jni_string.h" |
| 14 #include "base/bind_helpers.h" | 14 #include "base/bind_helpers.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" | 27 #include "ui/android/window_android.h" |
| 28 #include "ui/gfx/geometry/point.h" | 28 #include "ui/gfx/geometry/point.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 |
| 43 ContextMenuHelper::ContextMenuHelper(content::WebContents* web_contents) | 40 ContextMenuHelper::ContextMenuHelper(content::WebContents* web_contents) |
| 44 : web_contents_(web_contents), weak_factory_(this) { | 41 : web_contents_(web_contents), weak_factory_(this) { |
| 45 JNIEnv* env = base::android::AttachCurrentThread(); | 42 JNIEnv* env = base::android::AttachCurrentThread(); |
| 46 java_obj_.Reset( | 43 java_obj_.Reset( |
| 47 env, | 44 env, |
| 48 Java_ContextMenuHelper_create(env, reinterpret_cast<long>(this)).obj()); | 45 Java_ContextMenuHelper_create(env, reinterpret_cast<long>(this)).obj()); |
| 49 DCHECK(!java_obj_.is_null()); | 46 DCHECK(!java_obj_.is_null()); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 113 ConvertUTF8ToJavaString(env, params.unfiltered_link_url.spec()), | 110 ConvertUTF8ToJavaString(env, params.unfiltered_link_url.spec()), |
| 114 ConvertUTF8ToJavaString(env, params.src_url.spec()), | 111 ConvertUTF8ToJavaString(env, params.src_url.spec()), |
| 115 ConvertUTF16ToJavaString(env, params.title_text), | 112 ConvertUTF16ToJavaString(env, params.title_text), |
| 116 image_was_fetched_lo_fi, | 113 image_was_fetched_lo_fi, |
| 117 ConvertUTF8ToJavaString(env, sanitizedReferrer.spec()), | 114 ConvertUTF8ToJavaString(env, sanitizedReferrer.spec()), |
| 118 params.referrer_policy, can_save); | 115 params.referrer_policy, can_save); |
| 119 | 116 |
| 120 return jmenu_info; | 117 return jmenu_info; |
| 121 } | 118 } |
| 122 | 119 |
| 120 base::android::ScopedJavaLocalRef<jobject> | |
| 121 ContextMenuHelper::GetJavaWebContents(JNIEnv* env, | |
| 122 const JavaParamRef<jobject>& obj) { | |
| 123 return web_contents_->GetJavaWebContents(); | |
| 124 } | |
| 125 | |
| 123 void ContextMenuHelper::OnStartDownload( | 126 void ContextMenuHelper::OnStartDownload( |
| 124 JNIEnv* env, | 127 JNIEnv* env, |
| 125 const JavaParamRef<jobject>& obj, | 128 const JavaParamRef<jobject>& obj, |
| 126 jboolean jis_link, | 129 jboolean jis_link, |
| 127 jboolean jis_data_reduction_proxy_enabled) { | 130 jboolean jis_data_reduction_proxy_enabled) { |
| 128 std::string headers; | 131 std::string headers; |
| 129 if (jis_data_reduction_proxy_enabled) | 132 if (jis_data_reduction_proxy_enabled) |
| 130 headers = kDataReductionProxyPassthroughHeader; | 133 headers = kDataReductionProxyPassthroughHeader; |
| 131 | 134 |
| 132 DownloadControllerBase::Get()->StartContextMenuDownload( | 135 DownloadControllerBase::Get()->StartContextMenuDownload( |
| 133 context_menu_params_, | 136 context_menu_params_, |
| 134 web_contents_, | 137 web_contents_, |
| 135 jis_link, | 138 jis_link, |
| 136 headers); | 139 headers); |
| 137 } | 140 } |
| 138 | 141 |
| 139 void ContextMenuHelper::SearchForImage(JNIEnv* env, | 142 void ContextMenuHelper::SearchForImage(JNIEnv* env, |
| 140 const JavaParamRef<jobject>& obj) { | 143 const JavaParamRef<jobject>& obj) { |
| 141 content::RenderFrameHost* render_frame_host = | 144 content::RenderFrameHost* render_frame_host = |
| 142 content::RenderFrameHost::FromID(render_process_id_, render_frame_id_); | 145 content::RenderFrameHost::FromID(render_process_id_, render_frame_id_); |
| 143 if (!render_frame_host) | 146 if (!render_frame_host) |
| 144 return; | 147 return; |
| 145 | 148 |
| 146 CoreTabHelper::FromWebContents(web_contents_)->SearchByImageInNewTab( | 149 CoreTabHelper::FromWebContents(web_contents_)->SearchByImageInNewTab( |
| 147 render_frame_host, context_menu_params_.src_url); | 150 render_frame_host, context_menu_params_.src_url); |
| 148 } | 151 } |
| 149 | 152 |
| 150 void ContextMenuHelper::ShareImage(JNIEnv* env, | 153 void ContextMenuHelper::RetrieveImage(JNIEnv* env, |
| 151 const JavaParamRef<jobject>& obj) { | 154 const JavaParamRef<jobject>& obj, |
| 155 const JavaParamRef<jobject>& jcallback, | |
| 156 jint max_dimen_px) { | |
| 152 content::RenderFrameHost* render_frame_host = | 157 content::RenderFrameHost* render_frame_host = |
| 153 content::RenderFrameHost::FromID(render_process_id_, render_frame_id_); | 158 content::RenderFrameHost::FromID(render_process_id_, render_frame_id_); |
| 154 if (!render_frame_host) | 159 if (!render_frame_host) |
| 155 return; | 160 return; |
| 156 | 161 |
| 157 chrome::mojom::ThumbnailCapturerPtr thumbnail_capturer; | 162 chrome::mojom::ThumbnailCapturerPtr thumbnail_capturer; |
| 158 render_frame_host->GetRemoteInterfaces()->GetInterface(&thumbnail_capturer); | 163 render_frame_host->GetRemoteInterfaces()->GetInterface(&thumbnail_capturer); |
| 159 // Bind the InterfacePtr into the callback so that it's kept alive until | 164 // Bind the InterfacePtr into the callback so that it's kept alive until |
| 160 // there's either a connection error or a response. | 165 // there's either a connection error or a response. |
| 161 auto* thumbnail_capturer_proxy = thumbnail_capturer.get(); | 166 auto* thumbnail_capturer_proxy = thumbnail_capturer.get(); |
| 162 thumbnail_capturer_proxy->RequestThumbnailForContextNode( | 167 thumbnail_capturer_proxy->RequestThumbnailForContextNode( |
| 163 0, gfx::Size(kShareImageMaxWidth, kShareImageMaxHeight), | 168 0, gfx::Size(max_dimen_px, max_dimen_px), |
| 164 base::Bind(&ContextMenuHelper::OnShareImage, weak_factory_.GetWeakPtr(), | 169 base::Bind(&ContextMenuHelper::OnRetrieveImage, |
| 165 base::Passed(&thumbnail_capturer))); | 170 weak_factory_.GetWeakPtr(), base::Passed(&thumbnail_capturer), |
| 171 base::android::ScopedJavaGlobalRef<jobject>(env, jcallback))); | |
| 166 } | 172 } |
| 167 | 173 |
| 168 void ContextMenuHelper::OnShareImage( | 174 void ContextMenuHelper::OnRetrieveImage( |
|
David Trainor- moved to gerrit
2017/04/06 21:53:57
Can this just be an anonymous namespace helper met
Ted C
2017/04/07 17:09:37
Done.
| |
| 169 chrome::mojom::ThumbnailCapturerPtr thumbnail_capturer, | 175 chrome::mojom::ThumbnailCapturerPtr thumbnail_capturer, |
| 176 const base::android::JavaRef<jobject>& jcallback, | |
| 170 const std::vector<uint8_t>& thumbnail_data, | 177 const std::vector<uint8_t>& thumbnail_data, |
| 171 const gfx::Size& original_size) { | 178 const gfx::Size& original_size) { |
| 172 content::ContentViewCore* content_view_core = | 179 base::android::RunCallbackAndroid(jcallback, thumbnail_data); |
| 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; | |
| 203 render_frame_host->GetRemoteInterfaces()->GetInterface(&thumbnail_capturer); | |
| 204 // Bind the InterfacePtr into the callback so that it's kept alive until | |
| 205 // there's either a connection error or a response. | |
| 206 auto* thumbnail_capturer_proxy = thumbnail_capturer.get(); | |
| 207 thumbnail_capturer_proxy->RequestThumbnailForContextNode( | |
| 208 0, gfx::Size(j_max_size_px, j_max_size_px), | |
| 209 base::Bind(&ContextMenuHelper::OnHeaderThumbnailReceived, | |
| 210 weak_factory_.GetWeakPtr(), | |
| 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 } | 180 } |
| 236 | 181 |
| 237 bool RegisterContextMenuHelper(JNIEnv* env) { | 182 bool RegisterContextMenuHelper(JNIEnv* env) { |
| 238 return RegisterNativesImpl(env); | 183 return RegisterNativesImpl(env); |
| 239 } | 184 } |
| OLD | NEW |