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