#include "base/android/jni_android.h"
#include "base/android/jni_string.h"
#include "base/android/scoped_java_ref.h"
-#include "content/browser/android/content_view_core_impl.h"
#include "content/browser/renderer_host/render_widget_host_impl.h"
#include "content/browser/web_contents/web_contents_impl.h"
#include "content/public/browser/navigation_details.h"
namespace content {
+// TODO(dcheng): File a bug. This class incorrectly passes just a frame ID,
+// which is not sufficient to identify a frame (since frame IDs are scoped per
+// render process, and so may collide).
WebContentsObserverAndroid::WebContentsObserverAndroid(
JNIEnv* env,
jobject obj,
WebContentsObserverAndroid::~WebContentsObserverAndroid() {
}
-jlong Init(JNIEnv* env, jobject obj, jlong native_content_view_core) {
- ContentViewCore* content_view_core =
- reinterpret_cast<ContentViewCore*>(native_content_view_core);
+jlong Init(JNIEnv* env, jobject obj, jobject java_web_contents) {
+ WebContents* web_contents =
+ WebContents::FromJavaWebContents(java_web_contents);
+ CHECK(web_contents);
+
WebContentsObserverAndroid* native_observer = new WebContentsObserverAndroid(
- env, obj, content_view_core->GetWebContents());
+ env, obj, web_contents);
return reinterpret_cast<intptr_t>(native_observer);
}
delete this;
}
-void WebContentsObserverAndroid::WebContentsDestroyed(
- WebContents* web_contents) {
+void WebContentsObserverAndroid::WebContentsDestroyed() {
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
if (obj.is_null()) {
}
void WebContentsObserverAndroid::DidFailProvisionalLoad(
- int64 frame_id,
- const base::string16& frame_unique_name,
- bool is_main_frame,
+ RenderFrameHost* render_frame_host,
const GURL& validated_url,
int error_code,
- const base::string16& error_description,
- RenderViewHost* render_view_host) {
- DidFailLoadInternal(
- true, is_main_frame, error_code, error_description, validated_url);
+ const base::string16& error_description) {
+ DidFailLoadInternal(true,
+ !render_frame_host->GetParent(),
+ error_code,
+ error_description,
+ validated_url);
}
void WebContentsObserverAndroid::DidFailLoad(
- int64 frame_id,
+ RenderFrameHost* render_frame_host,
const GURL& validated_url,
- bool is_main_frame,
int error_code,
- const base::string16& error_description,
- RenderViewHost* render_view_host) {
- DidFailLoadInternal(
- false, is_main_frame, error_code, error_description, validated_url);
+ const base::string16& error_description) {
+ DidFailLoadInternal(false,
+ !render_frame_host->GetParent(),
+ error_code,
+ error_description,
+ validated_url);
}
void WebContentsObserverAndroid::DidNavigateMainFrame(
ConvertUTF8ToJavaString(env, params.url.spec()));
ScopedJavaLocalRef<jstring> jstring_base_url(
ConvertUTF8ToJavaString(env, params.base_url.spec()));
+
// See http://crbug.com/251330 for why it's determined this way.
- bool in_page_navigation =
- details.type == NAVIGATION_TYPE_IN_PAGE || details.is_in_page;
- // TODO(mkosiba): delete once downstream rolls.
- Java_WebContentsObserverAndroid_didNavigateMainFrameV_JLS_JLS_Z(
+ url::Replacements<char> replacements;
+ replacements.ClearRef();
+ bool urls_same_ignoring_fragment =
+ params.url.ReplaceComponents(replacements) ==
+ details.previous_url.ReplaceComponents(replacements);
+
+ // is_fragment_navigation is indicative of the intent of this variable.
+ // However, there isn't sufficient information here to determine whether this
+ // is actually a fragment navigation, or a history API navigation to a URL
+ // that would also be valid for a fragment navigation.
+ bool is_fragment_navigation = urls_same_ignoring_fragment &&
+ (details.type == NAVIGATION_TYPE_IN_PAGE || details.is_in_page);
+ Java_WebContentsObserverAndroid_didNavigateMainFrame(
env, obj.obj(), jstring_url.obj(), jstring_base_url.obj(),
- details.is_navigation_to_different_page());
- Java_WebContentsObserverAndroid_didNavigateMainFrameV_JLS_JLS_Z_Z(
- env, obj.obj(), jstring_url.obj(), jstring_base_url.obj(),
- details.is_navigation_to_different_page(), in_page_navigation);
+ details.is_navigation_to_different_page(), is_fragment_navigation);
}
void WebContentsObserverAndroid::DidNavigateAnyFrame(
}
void WebContentsObserverAndroid::DidStartProvisionalLoadForFrame(
- int64 frame_id,
- int64 parent_frame_id,
- bool is_main_frame,
- const GURL& validated_url,
- bool is_error_page,
- bool is_iframe_srcdoc,
- RenderViewHost* render_view_host) {
+ RenderFrameHost* render_frame_host,
+ const GURL& validated_url,
+ bool is_error_page,
+ bool is_iframe_srcdoc) {
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
if (obj.is_null())
return;
ScopedJavaLocalRef<jstring> jstring_url(
ConvertUTF8ToJavaString(env, validated_url.spec()));
+ // TODO(dcheng): Does Java really need the parent frame ID? It doesn't appear
+ // to be used at all, and it just adds complexity here.
Java_WebContentsObserverAndroid_didStartProvisionalLoadForFrame(
- env, obj.obj(), frame_id, parent_frame_id, is_main_frame,
- jstring_url.obj(), is_error_page, is_iframe_srcdoc);
+ env,
+ obj.obj(),
+ render_frame_host->GetRoutingID(),
+ render_frame_host->GetParent()
+ ? render_frame_host->GetParent()->GetRoutingID()
+ : -1,
+ !render_frame_host->GetParent(),
+ jstring_url.obj(),
+ is_error_page,
+ is_iframe_srcdoc);
}
void WebContentsObserverAndroid::DidCommitProvisionalLoadForFrame(
- int64 frame_id,
- const base::string16& frame_unique_name,
- bool is_main_frame,
- const GURL& url,
- PageTransition transition_type,
- RenderViewHost* render_view_host) {
+ RenderFrameHost* render_frame_host,
+ const GURL& url,
+ PageTransition transition_type) {
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
if (obj.is_null())
ScopedJavaLocalRef<jstring> jstring_url(
ConvertUTF8ToJavaString(env, url.spec()));
Java_WebContentsObserverAndroid_didCommitProvisionalLoadForFrame(
- env, obj.obj(), frame_id, is_main_frame, jstring_url.obj(),
+ env,
+ obj.obj(),
+ render_frame_host->GetRoutingID(),
+ !render_frame_host->GetParent(),
+ jstring_url.obj(),
transition_type);
}
void WebContentsObserverAndroid::DidFinishLoad(
- int64 frame_id,
- const GURL& validated_url,
- bool is_main_frame,
- RenderViewHost* render_view_host) {
+ RenderFrameHost* render_frame_host,
+ const GURL& validated_url) {
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
if (obj.is_null())
ScopedJavaLocalRef<jstring> jstring_url(
ConvertUTF8ToJavaString(env, url_string));
Java_WebContentsObserverAndroid_didFinishLoad(
- env, obj.obj(), frame_id, jstring_url.obj(), is_main_frame);
+ env,
+ obj.obj(),
+ render_frame_host->GetRoutingID(),
+ jstring_url.obj(),
+ !render_frame_host->GetParent());
}
-void WebContentsObserverAndroid::NavigationEntryCommitted(
- const LoadCommittedDetails& load_details) {
+void WebContentsObserverAndroid::DocumentLoadedInFrame(
+ RenderFrameHost* render_frame_host) {
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
if (obj.is_null())
return;
- Java_WebContentsObserverAndroid_navigationEntryCommitted(env, obj.obj());
+ Java_WebContentsObserverAndroid_documentLoadedInFrame(
+ env, obj.obj(), render_frame_host->GetRoutingID());
}
-void WebContentsObserverAndroid::DidChangeVisibleSSLState() {
+void WebContentsObserverAndroid::NavigationEntryCommitted(
+ const LoadCommittedDetails& load_details) {
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
if (obj.is_null())
return;
- Java_WebContentsObserverAndroid_didChangeVisibleSSLState(env, obj.obj());
+ Java_WebContentsObserverAndroid_navigationEntryCommitted(env, obj.obj());
}
void WebContentsObserverAndroid::DidAttachInterstitialPage() {
Java_WebContentsObserverAndroid_didDetachInterstitialPage(env, obj.obj());
}
+void WebContentsObserverAndroid::DidChangeThemeColor(SkColor color) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
+ if (obj.is_null())
+ return;
+ Java_WebContentsObserverAndroid_didChangeThemeColor(env, obj.obj(), color);
+}
+
void WebContentsObserverAndroid::DidFailLoadInternal(
bool is_provisional_load,
bool is_main_frame,
jstring_error_description.obj(), jstring_url.obj());
}
-void WebContentsObserverAndroid::DidFirstVisuallyNonEmptyPaint(int32 page_id) {
+void WebContentsObserverAndroid::DidFirstVisuallyNonEmptyPaint() {
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
if (obj.is_null())
return;
Java_WebContentsObserverAndroid_didFirstVisuallyNonEmptyPaint(
- env, obj.obj(), page_id);
+ env, obj.obj());
}
bool RegisterWebContentsObserverAndroid(JNIEnv* env) {