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)
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)jlong Init(JNIEnv* env, jobject obj, jlong 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());
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return reinterpret_cast<intptr_t>(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)
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void WebContentsObserverAndroid::RenderProcessGone(
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::TerminationStatus termination_status) {
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (obj.is_null())
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  jboolean was_oom_protected =
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      termination_status == base::TERMINATION_STATUS_OOM_PROTECTED;
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  Java_WebContentsObserverAndroid_renderProcessGone(
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      env, obj.obj(), was_oom_protected);
73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsObserverAndroid::DidStartLoading(
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;
813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ScopedJavaLocalRef<jstring> jstring_url(ConvertUTF8ToJavaString(
823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      env, web_contents()->GetVisibleURL().spec()));
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Java_WebContentsObserverAndroid_didStartLoading(
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      env, obj.obj(), jstring_url.obj());
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsObserverAndroid::DidStopLoading(
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* render_view_host) {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj.is_null())
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ScopedJavaLocalRef<jstring> jstring_url(ConvertUTF8ToJavaString(
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      env, web_contents()->GetLastCommittedURL().spec()));
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Java_WebContentsObserverAndroid_didStopLoading(
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      env, obj.obj(), jstring_url.obj());
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsObserverAndroid::DidFailProvisionalLoad(
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 frame_id,
101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& frame_unique_name,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_main_frame,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& validated_url,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int error_code,
105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& error_description,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* render_view_host) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DidFailLoadInternal(
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        true, is_main_frame, error_code, error_description, validated_url);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsObserverAndroid::DidFailLoad(
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 frame_id,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& validated_url,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_main_frame,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int error_code,
116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& error_description,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* render_view_host) {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DidFailLoadInternal(
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        false, is_main_frame, error_code, error_description, validated_url);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsObserverAndroid::DidNavigateMainFrame(
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const LoadCommittedDetails& details,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FrameNavigateParams& params) {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj.is_null())
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jstring> jstring_url(
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ConvertUTF8ToJavaString(env, params.url.spec()));
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jstring> jstring_base_url(
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ConvertUTF8ToJavaString(env, params.base_url.spec()));
13381d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch  // See http://crbug.com/251330 for why it's determined this way.
13481d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch  bool in_page_navigation =
13581d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch      details.type == NAVIGATION_TYPE_IN_PAGE || details.is_in_page;
13681d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch  // TODO(mkosiba): delete once downstream rolls.
13781d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch  Java_WebContentsObserverAndroid_didNavigateMainFrameV_JLS_JLS_Z(
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      env, obj.obj(), jstring_url.obj(), jstring_base_url.obj(),
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      details.is_navigation_to_different_page());
14081d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch  Java_WebContentsObserverAndroid_didNavigateMainFrameV_JLS_JLS_Z_Z(
14181d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch      env, obj.obj(), jstring_url.obj(), jstring_base_url.obj(),
14281d04fa4ca6b8e7c49e7a3401149aa77d5b4f381Ben Murdoch      details.is_navigation_to_different_page(), in_page_navigation);
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsObserverAndroid::DidNavigateAnyFrame(
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const LoadCommittedDetails& details,
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const FrameNavigateParams& params) {
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (obj.is_null())
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jstring> jstring_url(
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ConvertUTF8ToJavaString(env, params.url.spec()));
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jstring> jstring_base_url(
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ConvertUTF8ToJavaString(env, params.base_url.spec()));
1567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  jboolean jboolean_is_reload =
1577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      PageTransitionCoreTypeIs(params.transition, PAGE_TRANSITION_RELOAD);
1587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Java_WebContentsObserverAndroid_didNavigateAnyFrame(
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      env, obj.obj(), jstring_url.obj(), jstring_base_url.obj(),
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      jboolean_is_reload);
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsObserverAndroid::DidStartProvisionalLoadForFrame(
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int64 frame_id,
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int64 parent_frame_id,
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool is_main_frame,
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const GURL& validated_url,
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool is_error_page,
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool is_iframe_srcdoc,
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RenderViewHost* render_view_host) {
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (obj.is_null())
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jstring> jstring_url(
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ConvertUTF8ToJavaString(env, validated_url.spec()));
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Java_WebContentsObserverAndroid_didStartProvisionalLoadForFrame(
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      env, obj.obj(), frame_id, parent_frame_id, is_main_frame,
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      jstring_url.obj(), is_error_page, is_iframe_srcdoc);
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsObserverAndroid::DidCommitProvisionalLoadForFrame(
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int64 frame_id,
185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const base::string16& frame_unique_name,
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool is_main_frame,
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const GURL& url,
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PageTransition transition_type,
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RenderViewHost* render_view_host) {
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (obj.is_null())
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jstring> jstring_url(
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ConvertUTF8ToJavaString(env, url.spec()));
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Java_WebContentsObserverAndroid_didCommitProvisionalLoadForFrame(
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      env, obj.obj(), frame_id, is_main_frame, jstring_url.obj(),
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      transition_type);
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsObserverAndroid::DidFinishLoad(
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int64 frame_id,
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GURL& validated_url,
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool is_main_frame,
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RenderViewHost* render_view_host) {
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (obj.is_null())
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::string url_string = validated_url.spec();
212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  NavigationEntry* entry =
213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    web_contents()->GetController().GetLastCommittedEntry();
214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Note that GetBaseURLForDataURL is only used by the Android WebView.
215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (entry && !entry->GetBaseURLForDataURL().is_empty())
216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    url_string = entry->GetBaseURLForDataURL().possibly_invalid_spec();
217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jstring> jstring_url(
219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ConvertUTF8ToJavaString(env, url_string));
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Java_WebContentsObserverAndroid_didFinishLoad(
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      env, obj.obj(), frame_id, jstring_url.obj(), is_main_frame);
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void WebContentsObserverAndroid::NavigationEntryCommitted(
2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const LoadCommittedDetails& load_details) {
2264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
2274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
2284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (obj.is_null())
2294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
2304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Java_WebContentsObserverAndroid_navigationEntryCommitted(env, obj.obj());
2314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsObserverAndroid::DidChangeVisibleSSLState() {
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (obj.is_null())
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Java_WebContentsObserverAndroid_didChangeVisibleSSLState(env, obj.obj());
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
241d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void WebContentsObserverAndroid::DidAttachInterstitialPage() {
242d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
243d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
244d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (obj.is_null())
245d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return;
246d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  Java_WebContentsObserverAndroid_didAttachInterstitialPage(env, obj.obj());
247d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
248d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
249d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void WebContentsObserverAndroid::DidDetachInterstitialPage() {
250d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
251d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
252d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (obj.is_null())
253d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return;
254d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  Java_WebContentsObserverAndroid_didDetachInterstitialPage(env, obj.obj());
255d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
256d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsObserverAndroid::DidFailLoadInternal(
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_provisional_load,
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_main_frame,
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int error_code,
261a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& description,
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url) {
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj.is_null())
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jstring> jstring_error_description(
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ConvertUTF16ToJavaString(env, description));
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jstring> jstring_url(
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ConvertUTF8ToJavaString(env, url.spec()));
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Java_WebContentsObserverAndroid_didFailLoad(
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      env, obj.obj(),
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_provisional_load,
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_main_frame,
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      error_code,
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      jstring_error_description.obj(), jstring_url.obj());
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RegisterWebContentsObserverAndroid(JNIEnv* env) {
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return RegisterNativesImpl(env);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
284