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