15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/web_contents_delegate_android/web_contents_delegate_android.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <android/keycodes.h> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/jni_android.h" 10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/android/jni_array.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/jni_string.h" 1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "components/web_contents_delegate_android/color_chooser_android.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/web_contents_delegate_android/validation_message_bubble_android.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/android/content_view_core.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/color_chooser.h" 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/global_request_id.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/invalidate_type.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/native_web_keyboard_event.h" 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/navigation_controller.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/page_navigator.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_widget_host_view.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/referrer.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jni/WebContentsDelegateAndroid_jni.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/window_open_disposition.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h" 277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::AttachCurrentThread; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ConvertUTF8ToJavaString; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ConvertUTF16ToJavaString; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ScopedJavaLocalRef; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::ColorChooser; 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using content::RenderWidgetHostView; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::WebContentsDelegate; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace web_contents_delegate_android { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsDelegateAndroid::WebContentsDelegateAndroid(JNIEnv* env, jobject obj) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : weak_java_delegate_(env, obj) { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsDelegateAndroid::~WebContentsDelegateAndroid() { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScopedJavaLocalRef<jobject> 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsDelegateAndroid::GetJavaDelegate(JNIEnv* env) const { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return weak_java_delegate_.get(env); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ---------------------------------------------------------------------------- 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsDelegate methods 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ---------------------------------------------------------------------------- 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)ColorChooser* WebContentsDelegateAndroid::OpenColorChooser( 57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) WebContents* source, 58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SkColor color, 59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::vector<content::ColorSuggestion>& suggestions) { 60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return new ColorChooserAndroid(source, color, suggestions); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OpenURLFromTab() will be called when we're performing a browser-intiated 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// navigation. The most common scenario for this is opening new tabs (see 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RenderViewImpl::decidePolicyForNavigation for more details). 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* WebContentsDelegateAndroid::OpenURLFromTab( 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* source, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::OpenURLParams& params) { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url = params.url; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowOpenDisposition disposition = params.disposition; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!source || (disposition != CURRENT_TAB && 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disposition != NEW_FOREGROUND_TAB && 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disposition != NEW_BACKGROUND_TAB && 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disposition != OFF_THE_RECORD)) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JNIEnv* env = AttachCurrentThread(); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (obj.is_null()) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebContentsDelegate::OpenURLFromTab(source, params); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (disposition == NEW_FOREGROUND_TAB || 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disposition == NEW_BACKGROUND_TAB || 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disposition == OFF_THE_RECORD) { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JNIEnv* env = AttachCurrentThread(); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedJavaLocalRef<jstring> java_url = 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConvertUTF8ToJavaString(env, url.spec()); 91a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ScopedJavaLocalRef<jstring> extra_headers = 92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ConvertUTF8ToJavaString(env, params.extra_headers); 93a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ScopedJavaLocalRef<jbyteArray> post_data; 94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (params.uses_post && 95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) params.browser_initiated_post_data.get() && 96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) params.browser_initiated_post_data.get()->size()) { 97a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) post_data = base::android::ToJavaByteArray( 98a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) env, 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) params.browser_initiated_post_data.get()->front_as<uint8>(), 100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) params.browser_initiated_post_data.get()->size()); 101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Java_WebContentsDelegateAndroid_openNewTab(env, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) obj.obj(), 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) java_url.obj(), 105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) extra_headers.obj(), 106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) post_data.obj(), 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) disposition, 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) params.is_renderer_initiated); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // content::OpenURLParams -> content::NavigationController::LoadURLParams 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content::NavigationController::LoadURLParams load_params(url); 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) load_params.referrer = params.referrer; 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) load_params.frame_tree_node_id = params.frame_tree_node_id; 116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) load_params.redirect_chain = params.redirect_chain; 117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) load_params.transition_type = params.transition; 118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) load_params.extra_headers = params.extra_headers; 119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) load_params.should_replace_current_entry = 120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) params.should_replace_current_entry; 121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) load_params.is_renderer_initiated = params.is_renderer_initiated; 122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (params.transferred_global_request_id != content::GlobalRequestID()) { 124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) load_params.transferred_global_request_id = 125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) params.transferred_global_request_id; 126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Only allows the browser-initiated navigation to use POST. 129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (params.uses_post && !params.is_renderer_initiated) { 130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) load_params.load_type = 131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content::NavigationController::LOAD_TYPE_BROWSER_INITIATED_HTTP_POST; 132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) load_params.browser_initiated_post_data = 133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) params.browser_initiated_post_data; 134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) source->GetController().LoadURLWithParams(load_params); 137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return source; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsDelegateAndroid::NavigationStateChanged( 1426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const WebContents* source, content::InvalidateTypes changed_flags) { 1437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) JNIEnv* env = AttachCurrentThread(); 1447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env); 1457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (obj.is_null()) 1467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 1477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Java_WebContentsDelegateAndroid_navigationStateChanged( 1487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) env, 1497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) obj.obj(), 1507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) changed_flags); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void WebContentsDelegateAndroid::VisibleSSLStateChanged( 15446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const WebContents* source) { 15546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) JNIEnv* env = AttachCurrentThread(); 15646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env); 15746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (obj.is_null()) 15846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return; 15946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) Java_WebContentsDelegateAndroid_visibleSSLStateChanged( 16046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) env, 16146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) obj.obj()); 16246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 16346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsDelegateAndroid::ActivateContents(WebContents* contents) { 165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch JNIEnv* env = AttachCurrentThread(); 166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env); 167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (obj.is_null()) 168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Java_WebContentsDelegateAndroid_activateContents(env, obj.obj()); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsDelegateAndroid::DeactivateContents(WebContents* contents) { 173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // On desktop the current window is deactivated here, bringing the next window 174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // to focus. Not implemented on Android. 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 177effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid WebContentsDelegateAndroid::LoadingStateChanged(WebContents* source, 178effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool to_different_document) { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JNIEnv* env = AttachCurrentThread(); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (obj.is_null()) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_stopped = source == NULL || !source->IsLoading(); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (has_stopped) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Java_WebContentsDelegateAndroid_onLoadStopped(env, obj.obj()); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Java_WebContentsDelegateAndroid_onLoadStarted(env, obj.obj()); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsDelegateAndroid::LoadProgressChanged(WebContents* source, 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double progress) { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JNIEnv* env = AttachCurrentThread(); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (obj.is_null()) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Java_WebContentsDelegateAndroid_notifyLoadProgressChanged( 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) env, 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) obj.obj(), 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) progress); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsDelegateAndroid::RendererUnresponsive(WebContents* source) { 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) JNIEnv* env = AttachCurrentThread(); 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env); 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (obj.is_null()) 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Java_WebContentsDelegateAndroid_rendererUnresponsive(env, obj.obj()); 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsDelegateAndroid::RendererResponsive(WebContents* source) { 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) JNIEnv* env = AttachCurrentThread(); 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env); 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (obj.is_null()) 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Java_WebContentsDelegateAndroid_rendererResponsive(env, obj.obj()); 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsDelegateAndroid::CloseContents(WebContents* source) { 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JNIEnv* env = AttachCurrentThread(); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (obj.is_null()) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Java_WebContentsDelegateAndroid_closeContents(env, obj.obj()); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsDelegateAndroid::MoveContents(WebContents* source, 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& pos) { 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do nothing. 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsDelegateAndroid::AddMessageToConsole( 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* source, 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 level, 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& message, 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 line_no, 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& source_id) { 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JNIEnv* env = AttachCurrentThread(); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (obj.is_null()) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebContentsDelegate::AddMessageToConsole(source, level, message, 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) line_no, source_id); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedJavaLocalRef<jstring> jmessage(ConvertUTF16ToJavaString(env, message)); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedJavaLocalRef<jstring> jsource_id( 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConvertUTF16ToJavaString(env, source_id)); 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int jlevel = WEB_CONTENTS_DELEGATE_LOG_LEVEL_DEBUG; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (level) { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case logging::LOG_VERBOSE: 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) jlevel = WEB_CONTENTS_DELEGATE_LOG_LEVEL_DEBUG; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case logging::LOG_INFO: 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jlevel = WEB_CONTENTS_DELEGATE_LOG_LEVEL_LOG; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case logging::LOG_WARNING: 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jlevel = WEB_CONTENTS_DELEGATE_LOG_LEVEL_WARNING; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case logging::LOG_ERROR: 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jlevel = WEB_CONTENTS_DELEGATE_LOG_LEVEL_ERROR; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Java_WebContentsDelegateAndroid_addMessageToConsole( 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) env, 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetJavaDelegate(env).obj(), 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jlevel, 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jmessage.obj(), 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) line_no, 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jsource_id.obj()); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is either called from TabContents::DidNavigateMainFramePostCommit() with 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// an empty GURL or responding to RenderViewHost::OnMsgUpateTargetURL(). In 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Chrome, the latter is not always called, especially not during history 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// navigation. So we only handle the first case and pass the source TabContents' 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// url to Java to update the UI. 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsDelegateAndroid::UpdateTargetURL(WebContents* source, 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url) { 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url.is_empty()) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JNIEnv* env = AttachCurrentThread(); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (obj.is_null()) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedJavaLocalRef<jstring> java_url = 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConvertUTF8ToJavaString(env, source->GetURL().spec()); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Java_WebContentsDelegateAndroid_onUpdateUrl(env, 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) obj.obj(), 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) java_url.obj()); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsDelegateAndroid::HandleKeyboardEvent( 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* source, 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NativeWebKeyboardEvent& event) { 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jobject key_event = event.os_event; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (key_event) { 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JNIEnv* env = AttachCurrentThread(); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (obj.is_null()) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Java_WebContentsDelegateAndroid_handleKeyboardEvent( 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) env, obj.obj(), key_event); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsDelegateAndroid::TakeFocus(WebContents* source, bool reverse) { 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JNIEnv* env = AttachCurrentThread(); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (obj.is_null()) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebContentsDelegate::TakeFocus(source, reverse); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Java_WebContentsDelegateAndroid_takeFocus( 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) env, obj.obj(), reverse); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsDelegateAndroid::ShowRepostFormWarningDialog( 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* source) { 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JNIEnv* env = AttachCurrentThread(); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (obj.is_null()) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedJavaLocalRef<jobject> content_view_core = 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ContentViewCore::FromWebContents(source)->GetJavaObject(); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content_view_core.is_null()) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Java_WebContentsDelegateAndroid_showRepostFormWarningDialog(env, obj.obj(), 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_view_core.obj()); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsDelegateAndroid::ToggleFullscreenModeForTab( 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents, 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool enter_fullscreen) { 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) JNIEnv* env = AttachCurrentThread(); 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env); 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (obj.is_null()) 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Java_WebContentsDelegateAndroid_toggleFullscreenModeForTab( 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) env, obj.obj(), enter_fullscreen); 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WebContentsDelegateAndroid::IsFullscreenForTabOrPending( 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebContents* web_contents) const { 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) JNIEnv* env = AttachCurrentThread(); 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env); 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (obj.is_null()) 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return Java_WebContentsDelegateAndroid_isFullscreenForTabOrPending( 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) env, obj.obj()); 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsDelegateAndroid::ShowValidationMessage( 3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* web_contents, 3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& anchor_in_root_view, 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& main_text, 3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& sub_text) { 3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderWidgetHostView* rwhv = web_contents->GetRenderWidgetHostView(); 3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (rwhv) { 3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) validation_message_bubble_.reset( 3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new ValidationMessageBubbleAndroid(rwhv->GetRenderWidgetHost(), 3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) anchor_in_root_view, 3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) main_text, 3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) sub_text)); 3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsDelegateAndroid::HideValidationMessage( 3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* web_contents) { 3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) validation_message_bubble_.reset(); 3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsDelegateAndroid::MoveValidationMessage( 3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContents* web_contents, 3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& anchor_in_root_view) { 3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!validation_message_bubble_) 3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderWidgetHostView* rwhv = web_contents->GetRenderWidgetHostView(); 3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (rwhv) { 3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) validation_message_bubble_->SetPositionRelativeToAnchor( 3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rwhv->GetRenderWidgetHost(), anchor_in_root_view); 3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ---------------------------------------------------------------------------- 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Native JNI methods 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ---------------------------------------------------------------------------- 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Register native methods 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RegisterWebContentsDelegateAndroid(JNIEnv* env) { 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RegisterNativesImpl(env); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 391868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} // namespace web_contents_delegate_android 392