Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/browser/android/content_view_core_impl.h" | 5 #include "content/browser/android/content_view_core_impl.h" |
| 6 | 6 |
| 7 #include "base/android/jni_android.h" | 7 #include "base/android/jni_android.h" |
| 8 #include "base/android/jni_array.h" | 8 #include "base/android/jni_array.h" |
| 9 #include "base/android/jni_string.h" | 9 #include "base/android/jni_string.h" |
| 10 #include "base/android/scoped_java_ref.h" | 10 #include "base/android/scoped_java_ref.h" |
| 11 #include "content/browser/android/content_view_client.h" | 11 #include "content/browser/android/content_view_client.h" |
| 12 #include "content/browser/renderer_host/java/java_bound_object.h" | |
| 13 #include "content/browser/renderer_host/java/java_bridge_dispatcher_host_manager .h" | |
| 12 #include "content/browser/renderer_host/render_view_host_impl.h" | 14 #include "content/browser/renderer_host/render_view_host_impl.h" |
| 13 #include "content/browser/web_contents/navigation_controller_impl.h" | 15 #include "content/browser/web_contents/navigation_controller_impl.h" |
| 14 #include "content/public/browser/browser_context.h" | 16 #include "content/public/browser/browser_context.h" |
| 15 #include "content/public/browser/web_contents.h" | 17 #include "content/public/browser/web_contents.h" |
| 16 #include "jni/ContentViewCore_jni.h" | 18 #include "jni/ContentViewCore_jni.h" |
| 19 #include "third_party/WebKit/Source/WebKit/chromium/public/WebBindings.h" | |
| 17 #include "webkit/glue/webmenuitem.h" | 20 #include "webkit/glue/webmenuitem.h" |
| 18 | 21 |
| 19 using base::android::AttachCurrentThread; | 22 using base::android::AttachCurrentThread; |
| 20 using base::android::ConvertUTF16ToJavaString; | 23 using base::android::ConvertUTF16ToJavaString; |
| 21 using base::android::ConvertUTF8ToJavaString; | 24 using base::android::ConvertUTF8ToJavaString; |
| 22 using base::android::GetClass; | 25 using base::android::GetClass; |
| 26 using base::android::ConvertJavaStringToUTF16; | |
|
Ted C
2012/07/27 18:09:04
move under AttachCurrentThread
Steve Block
2012/07/30 11:45:14
Done.
| |
| 23 using base::android::HasField; | 27 using base::android::HasField; |
| 24 using base::android::ScopedJavaGlobalRef; | 28 using base::android::ScopedJavaGlobalRef; |
| 25 using base::android::ScopedJavaLocalRef; | 29 using base::android::ScopedJavaLocalRef; |
| 26 | 30 |
| 27 // Describes the type and enabled state of a select popup item. | 31 // Describes the type and enabled state of a select popup item. |
| 28 // Keep in sync with the value defined in SelectPopupDialog.java | 32 // Keep in sync with the value defined in SelectPopupDialog.java |
| 29 enum PopupItemType { | 33 enum PopupItemType { |
| 30 POPUP_ITEM_TYPE_GROUP = 0, | 34 POPUP_ITEM_TYPE_GROUP = 0, |
| 31 POPUP_ITEM_TYPE_DISABLED, | 35 POPUP_ITEM_TYPE_DISABLED, |
| 32 POPUP_ITEM_TYPE_ENABLED | 36 POPUP_ITEM_TYPE_ENABLED |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 57 ContentViewCore* ContentViewCore::GetNativeContentViewCore(JNIEnv* env, | 61 ContentViewCore* ContentViewCore::GetNativeContentViewCore(JNIEnv* env, |
| 58 jobject obj) { | 62 jobject obj) { |
| 59 return reinterpret_cast<ContentViewCore*>( | 63 return reinterpret_cast<ContentViewCore*>( |
| 60 env->GetIntField(obj, g_native_content_view)); | 64 env->GetIntField(obj, g_native_content_view)); |
| 61 } | 65 } |
| 62 | 66 |
| 63 // ---------------------------------------------------------------------------- | 67 // ---------------------------------------------------------------------------- |
| 64 | 68 |
| 65 ContentViewCoreImpl::ContentViewCoreImpl(JNIEnv* env, jobject obj, | 69 ContentViewCoreImpl::ContentViewCoreImpl(JNIEnv* env, jobject obj, |
| 66 WebContents* web_contents) | 70 WebContents* web_contents) |
| 67 : web_contents_(web_contents), | 71 : web_contents_impl_(static_cast<WebContentsImpl*>(web_contents)), |
|
jam
2012/07/27 23:29:57
nit: just keep it web_contents_, even if it is a W
Steve Block
2012/07/30 11:45:14
Done.
| |
| 68 tab_crashed_(false) { | 72 tab_crashed_(false) { |
| 69 DCHECK(web_contents) << | 73 DCHECK(web_contents) << |
| 70 "A ContentViewCoreImpl should be created with a valid WebContents."; | 74 "A ContentViewCoreImpl should be created with a valid WebContents."; |
| 71 | 75 |
| 72 InitJNI(env, obj); | 76 InitJNI(env, obj); |
| 73 } | 77 } |
| 74 | 78 |
| 75 ContentViewCoreImpl::~ContentViewCoreImpl() { | 79 ContentViewCoreImpl::~ContentViewCoreImpl() { |
| 76 if (java_object_) { | 80 if (java_object_) { |
| 77 JNIEnv* env = AttachCurrentThread(); | 81 JNIEnv* env = AttachCurrentThread(); |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 139 if (web_contents()->GetURL().is_empty() || !content_view_client_.get()) | 143 if (web_contents()->GetURL().is_empty() || !content_view_client_.get()) |
| 140 return static_cast<jdouble>(1.0); | 144 return static_cast<jdouble>(1.0); |
| 141 return static_cast<jdouble>(content_view_client_->GetLoadProgress()); | 145 return static_cast<jdouble>(content_view_client_->GetLoadProgress()); |
| 142 } | 146 } |
| 143 | 147 |
| 144 jboolean ContentViewCoreImpl::IsIncognito(JNIEnv* env, jobject obj) { | 148 jboolean ContentViewCoreImpl::IsIncognito(JNIEnv* env, jobject obj) { |
| 145 return web_contents()->GetBrowserContext()->IsOffTheRecord(); | 149 return web_contents()->GetBrowserContext()->IsOffTheRecord(); |
| 146 } | 150 } |
| 147 | 151 |
| 148 jboolean ContentViewCoreImpl::CanGoBack(JNIEnv* env, jobject obj) { | 152 jboolean ContentViewCoreImpl::CanGoBack(JNIEnv* env, jobject obj) { |
| 149 return web_contents_->GetController().CanGoBack(); | 153 return web_contents_impl_->GetController().CanGoBack(); |
| 150 } | 154 } |
| 151 | 155 |
| 152 jboolean ContentViewCoreImpl::CanGoForward(JNIEnv* env, jobject obj) { | 156 jboolean ContentViewCoreImpl::CanGoForward(JNIEnv* env, jobject obj) { |
| 153 return web_contents_->GetController().CanGoForward(); | 157 return web_contents_impl_->GetController().CanGoForward(); |
| 154 } | 158 } |
| 155 | 159 |
| 156 jboolean ContentViewCoreImpl::CanGoToOffset(JNIEnv* env, jobject obj, | 160 jboolean ContentViewCoreImpl::CanGoToOffset(JNIEnv* env, jobject obj, |
| 157 jint offset) { | 161 jint offset) { |
| 158 return web_contents_->GetController().CanGoToOffset(offset); | 162 return web_contents_impl_->GetController().CanGoToOffset(offset); |
| 159 } | 163 } |
| 160 | 164 |
| 161 void ContentViewCoreImpl::GoBack(JNIEnv* env, jobject obj) { | 165 void ContentViewCoreImpl::GoBack(JNIEnv* env, jobject obj) { |
| 162 web_contents_->GetController().GoBack(); | 166 web_contents_impl_->GetController().GoBack(); |
| 163 tab_crashed_ = false; | 167 tab_crashed_ = false; |
| 164 } | 168 } |
| 165 | 169 |
| 166 void ContentViewCoreImpl::GoForward(JNIEnv* env, jobject obj) { | 170 void ContentViewCoreImpl::GoForward(JNIEnv* env, jobject obj) { |
| 167 web_contents_->GetController().GoForward(); | 171 web_contents_impl_->GetController().GoForward(); |
| 168 tab_crashed_ = false; | 172 tab_crashed_ = false; |
| 169 } | 173 } |
| 170 | 174 |
| 171 void ContentViewCoreImpl::GoToOffset(JNIEnv* env, jobject obj, jint offset) { | 175 void ContentViewCoreImpl::GoToOffset(JNIEnv* env, jobject obj, jint offset) { |
| 172 web_contents_->GetController().GoToOffset(offset); | 176 web_contents_impl_->GetController().GoToOffset(offset); |
| 173 } | 177 } |
| 174 | 178 |
| 175 void ContentViewCoreImpl::StopLoading(JNIEnv* env, jobject obj) { | 179 void ContentViewCoreImpl::StopLoading(JNIEnv* env, jobject obj) { |
| 176 web_contents_->Stop(); | 180 web_contents_impl_->Stop(); |
| 177 } | 181 } |
| 178 | 182 |
| 179 void ContentViewCoreImpl::Reload(JNIEnv* env, jobject obj) { | 183 void ContentViewCoreImpl::Reload(JNIEnv* env, jobject obj) { |
| 180 // Set check_for_repost parameter to false as we have no repost confirmation | 184 // Set check_for_repost parameter to false as we have no repost confirmation |
| 181 // dialog ("confirm form resubmission" screen will still appear, however). | 185 // dialog ("confirm form resubmission" screen will still appear, however). |
| 182 web_contents_->GetController().Reload(false); | 186 web_contents_impl_->GetController().Reload(false); |
| 183 tab_crashed_ = false; | 187 tab_crashed_ = false; |
| 184 } | 188 } |
| 185 | 189 |
| 186 void ContentViewCoreImpl::ClearHistory(JNIEnv* env, jobject obj) { | 190 void ContentViewCoreImpl::ClearHistory(JNIEnv* env, jobject obj) { |
| 187 web_contents_->GetController().PruneAllButActive(); | 191 web_contents_impl_->GetController().PruneAllButActive(); |
| 188 } | 192 } |
| 189 | 193 |
| 190 jboolean ContentViewCoreImpl::NeedsReload(JNIEnv* env, jobject obj) { | 194 jboolean ContentViewCoreImpl::NeedsReload(JNIEnv* env, jobject obj) { |
| 191 return web_contents_->GetController().NeedsReload(); | 195 return web_contents_impl_->GetController().NeedsReload(); |
| 192 } | 196 } |
| 193 | 197 |
| 194 void ContentViewCoreImpl::SetClient(JNIEnv* env, jobject obj, jobject jclient) { | 198 void ContentViewCoreImpl::SetClient(JNIEnv* env, jobject obj, jobject jclient) { |
| 195 scoped_ptr<ContentViewClient> client( | 199 scoped_ptr<ContentViewClient> client( |
| 196 ContentViewClient::CreateNativeContentViewClient(env, jclient)); | 200 ContentViewClient::CreateNativeContentViewClient(env, jclient)); |
| 197 | 201 |
| 198 web_contents_->SetDelegate(client.get()); | 202 web_contents_impl_->SetDelegate(client.get()); |
| 199 | 203 |
| 200 content_view_client_.swap(client); | 204 content_view_client_.swap(client); |
| 201 } | 205 } |
| 202 | 206 |
| 203 // -------------------------------------------------------------------------- | 207 // -------------------------------------------------------------------------- |
| 204 // Methods called from native code | 208 // Methods called from native code |
| 205 // -------------------------------------------------------------------------- | 209 // -------------------------------------------------------------------------- |
| 206 | 210 |
| 207 void ContentViewCoreImpl::LoadUrl(const GURL& url, int page_transition) { | 211 void ContentViewCoreImpl::LoadUrl(const GURL& url, int page_transition) { |
| 208 content::Referrer referer; | 212 content::Referrer referer; |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 336 jcontent_url.obj()); | 340 jcontent_url.obj()); |
| 337 } | 341 } |
| 338 | 342 |
| 339 // -------------------------------------------------------------------------- | 343 // -------------------------------------------------------------------------- |
| 340 // Methods called from Java via JNI | 344 // Methods called from Java via JNI |
| 341 // -------------------------------------------------------------------------- | 345 // -------------------------------------------------------------------------- |
| 342 | 346 |
| 343 void ContentViewCoreImpl::SelectPopupMenuItems(JNIEnv* env, jobject obj, | 347 void ContentViewCoreImpl::SelectPopupMenuItems(JNIEnv* env, jobject obj, |
| 344 jintArray indices) { | 348 jintArray indices) { |
| 345 RenderViewHostImpl* rvhi = static_cast<RenderViewHostImpl*>( | 349 RenderViewHostImpl* rvhi = static_cast<RenderViewHostImpl*>( |
| 346 web_contents_->GetRenderViewHost()); | 350 web_contents_impl_->GetRenderViewHost()); |
| 347 DCHECK(rvhi); | 351 DCHECK(rvhi); |
| 348 if (indices == NULL) { | 352 if (indices == NULL) { |
| 349 rvhi->DidCancelPopupMenu(); | 353 rvhi->DidCancelPopupMenu(); |
| 350 return; | 354 return; |
| 351 } | 355 } |
| 352 | 356 |
| 353 int selected_count = env->GetArrayLength(indices); | 357 int selected_count = env->GetArrayLength(indices); |
| 354 std::vector<int> selected_indices; | 358 std::vector<int> selected_indices; |
| 355 jint* indices_ptr = env->GetIntArrayElements(indices, NULL); | 359 jint* indices_ptr = env->GetIntArrayElements(indices, NULL); |
| 356 for (int i = 0; i < selected_count; ++i) | 360 for (int i = 0; i < selected_count; ++i) |
| 357 selected_indices.push_back(indices_ptr[i]); | 361 selected_indices.push_back(indices_ptr[i]); |
| 358 env->ReleaseIntArrayElements(indices, indices_ptr, JNI_ABORT); | 362 env->ReleaseIntArrayElements(indices, indices_ptr, JNI_ABORT); |
| 359 rvhi->DidSelectPopupMenuItems(selected_indices); | 363 rvhi->DidSelectPopupMenuItems(selected_indices); |
| 360 } | 364 } |
| 361 | 365 |
| 366 void ContentViewCoreImpl::AddJavascriptInterface( | |
| 367 JNIEnv* env, | |
| 368 jobject /* obj */, | |
| 369 jobject object, | |
| 370 jstring name, | |
| 371 jboolean allow_inherited_methods) { | |
| 372 ScopedJavaLocalRef<jobject> scoped_object(env, object); | |
| 373 // JavaBoundObject creates the NPObject with a ref count of 1, and | |
| 374 // JavaBridgeDispatcherHostManager takes its own ref. | |
| 375 NPObject* bound_object = JavaBoundObject::Create(scoped_object, | |
| 376 allow_inherited_methods); | |
| 377 web_contents_impl_->java_bridge_dispatcher_host_manager()->AddNamedObject( | |
| 378 ConvertJavaStringToUTF16(env, name), bound_object); | |
| 379 WebKit::WebBindings::releaseObject(bound_object); | |
| 380 } | |
| 381 | |
| 382 void ContentViewCoreImpl::RemoveJavascriptInterface(JNIEnv* env, | |
| 383 jobject /* obj */, | |
| 384 jstring name) { | |
| 385 web_contents_impl_->java_bridge_dispatcher_host_manager()->RemoveNamedObject( | |
| 386 ConvertJavaStringToUTF16(env, name)); | |
| 387 } | |
| 388 | |
| 362 // -------------------------------------------------------------------------- | 389 // -------------------------------------------------------------------------- |
| 363 // Methods called from native code | 390 // Methods called from native code |
| 364 // -------------------------------------------------------------------------- | 391 // -------------------------------------------------------------------------- |
| 365 | 392 |
| 366 gfx::Rect ContentViewCoreImpl::GetBounds() const { | 393 gfx::Rect ContentViewCoreImpl::GetBounds() const { |
| 367 NOTIMPLEMENTED() << "not upstreamed yet"; | 394 NOTIMPLEMENTED() << "not upstreamed yet"; |
| 368 return gfx::Rect(); | 395 return gfx::Rect(); |
| 369 } | 396 } |
| 370 | 397 |
| 371 // ---------------------------------------------------------------------------- | 398 // ---------------------------------------------------------------------------- |
| 372 | 399 |
| 373 bool RegisterContentViewCore(JNIEnv* env) { | 400 bool RegisterContentViewCore(JNIEnv* env) { |
| 374 if (!base::android::HasClass(env, kContentViewCoreClassPath)) { | 401 if (!base::android::HasClass(env, kContentViewCoreClassPath)) { |
| 375 DLOG(ERROR) << "Unable to find class ContentViewCore!"; | 402 DLOG(ERROR) << "Unable to find class ContentViewCore!"; |
| 376 return false; | 403 return false; |
| 377 } | 404 } |
| 378 ScopedJavaLocalRef<jclass> clazz = GetClass(env, kContentViewCoreClassPath); | 405 ScopedJavaLocalRef<jclass> clazz = GetClass(env, kContentViewCoreClassPath); |
| 379 if (!HasField(env, clazz, "mNativeContentViewCore", "I")) { | 406 if (!HasField(env, clazz, "mNativeContentViewCore", "I")) { |
| 380 DLOG(ERROR) << "Unable to find ContentView.mNativeContentViewCore!"; | 407 DLOG(ERROR) << "Unable to find ContentView.mNativeContentViewCore!"; |
| 381 return false; | 408 return false; |
| 382 } | 409 } |
| 383 g_native_content_view = GetFieldID(env, clazz, "mNativeContentViewCore", "I"); | 410 g_native_content_view = GetFieldID(env, clazz, "mNativeContentViewCore", "I"); |
| 384 | 411 |
| 385 return RegisterNativesImpl(env) >= 0; | 412 return RegisterNativesImpl(env) >= 0; |
| 386 } | 413 } |
| 387 | 414 |
| 388 } // namespace content | 415 } // namespace content |
| OLD | NEW |