web_contents_observer_android.cc revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/android/web_contents_observer_android.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <jni.h>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/jni_android.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/jni_string.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/android/scoped_java_ref.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/android/content_view_core_impl.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_impl.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/web_contents/web_contents_impl.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/navigation_details.h"
18424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "content/public/browser/navigation_entry.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jni/WebContentsObserverAndroid_jni.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::AttachCurrentThread;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ScopedJavaLocalRef;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ConvertUTF8ToJavaString;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ConvertUTF16ToJavaString;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsObserverAndroid::WebContentsObserverAndroid(
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    JNIEnv* env,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jobject obj,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContents* web_contents)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : WebContentsObserver(web_contents),
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      weak_java_observer_(env, obj){
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsObserverAndroid::~WebContentsObserverAndroid() {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)jint Init(JNIEnv* env, jobject obj, jint native_content_view_core) {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentViewCore* content_view_core =
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<ContentViewCore*>(native_content_view_core);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContentsObserverAndroid* native_observer = new WebContentsObserverAndroid(
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      env, obj, content_view_core->GetWebContents());
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return reinterpret_cast<jint>(native_observer);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsObserverAndroid::Destroy(JNIEnv* env, jobject obj) {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete this;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsObserverAndroid::WebContentsDestroyed(
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContents* web_contents) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj.is_null()) {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete this;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The java side will destroy |this|
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Java_WebContentsObserverAndroid_detachFromWebContents(env, obj.obj());
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsObserverAndroid::DidStartLoading(
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* render_view_host) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj.is_null())
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ScopedJavaLocalRef<jstring> jstring_url(ConvertUTF8ToJavaString(
703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      env, web_contents()->GetVisibleURL().spec()));
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Java_WebContentsObserverAndroid_didStartLoading(
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      env, obj.obj(), jstring_url.obj());
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsObserverAndroid::DidStopLoading(
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* render_view_host) {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj.is_null())
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
81424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
82424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  std::string url_string;
83424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  NavigationEntry* entry =
84424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    web_contents()->GetController().GetLastCommittedEntry();
85424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Not that GetBaseURLForDataURL is only used by the Android WebView
86424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (entry && !entry->GetBaseURLForDataURL().is_empty()) {
87424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    url_string = entry->GetBaseURLForDataURL().possibly_invalid_spec();
88424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  } else {
89424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    url_string = web_contents()->GetLastCommittedURL().spec();
90424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
91424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
92424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ScopedJavaLocalRef<jstring> jstring_url(
93424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      ConvertUTF8ToJavaString(env, url_string));
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Java_WebContentsObserverAndroid_didStopLoading(
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      env, obj.obj(), jstring_url.obj());
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsObserverAndroid::DidFailProvisionalLoad(
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 frame_id,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_main_frame,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& validated_url,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int error_code,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string16& error_description,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* render_view_host) {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DidFailLoadInternal(
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        true, is_main_frame, error_code, error_description, validated_url);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsObserverAndroid::DidFailLoad(
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 frame_id,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& validated_url,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_main_frame,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int error_code,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string16& error_description,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* render_view_host) {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DidFailLoadInternal(
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        false, is_main_frame, error_code, error_description, validated_url);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsObserverAndroid::DidNavigateMainFrame(
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const LoadCommittedDetails& details,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FrameNavigateParams& params) {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj.is_null())
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jstring> jstring_url(
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ConvertUTF8ToJavaString(env, params.url.spec()));
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jstring> jstring_base_url(
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ConvertUTF8ToJavaString(env, params.base_url.spec()));
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Java_WebContentsObserverAndroid_didNavigateMainFrame(
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      env, obj.obj(), jstring_url.obj(), jstring_base_url.obj(),
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      details.is_navigation_to_different_page());
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsObserverAndroid::DidNavigateAnyFrame(
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const LoadCommittedDetails& details,
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const FrameNavigateParams& params) {
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (obj.is_null())
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jstring> jstring_url(
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ConvertUTF8ToJavaString(env, params.url.spec()));
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jstring> jstring_base_url(
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ConvertUTF8ToJavaString(env, params.base_url.spec()));
1477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  jboolean jboolean_is_reload =
1487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      PageTransitionCoreTypeIs(params.transition, PAGE_TRANSITION_RELOAD);
1497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Java_WebContentsObserverAndroid_didNavigateAnyFrame(
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      env, obj.obj(), jstring_url.obj(), jstring_base_url.obj(),
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      jboolean_is_reload);
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsObserverAndroid::DidStartProvisionalLoadForFrame(
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int64 frame_id,
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int64 parent_frame_id,
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool is_main_frame,
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const GURL& validated_url,
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool is_error_page,
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool is_iframe_srcdoc,
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RenderViewHost* render_view_host) {
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (obj.is_null())
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jstring> jstring_url(
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ConvertUTF8ToJavaString(env, validated_url.spec()));
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Java_WebContentsObserverAndroid_didStartProvisionalLoadForFrame(
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      env, obj.obj(), frame_id, parent_frame_id, is_main_frame,
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      jstring_url.obj(), is_error_page, is_iframe_srcdoc);
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsObserverAndroid::DidCommitProvisionalLoadForFrame(
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int64 frame_id,
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool is_main_frame,
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const GURL& url,
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PageTransition transition_type,
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RenderViewHost* render_view_host) {
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (obj.is_null())
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jstring> jstring_url(
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ConvertUTF8ToJavaString(env, url.spec()));
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Java_WebContentsObserverAndroid_didCommitProvisionalLoadForFrame(
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      env, obj.obj(), frame_id, is_main_frame, jstring_url.obj(),
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      transition_type);
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsObserverAndroid::DidFinishLoad(
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 frame_id,
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GURL& validated_url,
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool is_main_frame,
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RenderViewHost* render_view_host) {
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (obj.is_null())
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jstring> jstring_url(
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ConvertUTF8ToJavaString(env, validated_url.spec()));
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Java_WebContentsObserverAndroid_didFinishLoad(
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      env, obj.obj(), frame_id, jstring_url.obj(), is_main_frame);
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void WebContentsObserverAndroid::NavigationEntryCommitted(
2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const LoadCommittedDetails& load_details) {
2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (obj.is_null())
2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
2124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Java_WebContentsObserverAndroid_navigationEntryCommitted(env, obj.obj());
2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsObserverAndroid::DidChangeVisibleSSLState() {
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (obj.is_null())
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Java_WebContentsObserverAndroid_didChangeVisibleSSLState(env, obj.obj());
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
223d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void WebContentsObserverAndroid::DidAttachInterstitialPage() {
224d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
225d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
226d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (obj.is_null())
227d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return;
228d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  Java_WebContentsObserverAndroid_didAttachInterstitialPage(env, obj.obj());
229d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
230d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
231d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void WebContentsObserverAndroid::DidDetachInterstitialPage() {
232d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
233d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
234d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (obj.is_null())
235d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return;
236d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  Java_WebContentsObserverAndroid_didDetachInterstitialPage(env, obj.obj());
237d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
238d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsObserverAndroid::DidFailLoadInternal(
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_provisional_load,
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_main_frame,
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int error_code,
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string16& description,
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url) {
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj.is_null())
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jstring> jstring_error_description(
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ConvertUTF16ToJavaString(env, description));
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jstring> jstring_url(
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ConvertUTF8ToJavaString(env, url.spec()));
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Java_WebContentsObserverAndroid_didFailLoad(
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      env, obj.obj(),
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_provisional_load,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_main_frame,
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      error_code,
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      jstring_error_description.obj(), jstring_url.obj());
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RegisterWebContentsObserverAndroid(JNIEnv* env) {
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return RegisterNativesImpl(env);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
266