Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / content / browser / android / web_contents_observer_android.cc
index 9ab3284..708e7bf 100644 (file)
@@ -11,7 +11,6 @@
 #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"
@@ -25,6 +24,9 @@ using base::android::ConvertUTF16ToJavaString;
 
 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,
@@ -36,11 +38,13 @@ WebContentsObserverAndroid::WebContentsObserverAndroid(
 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);
 }
 
@@ -48,8 +52,7 @@ void WebContentsObserverAndroid::Destroy(JNIEnv* env, jobject obj) {
   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()) {
@@ -97,26 +100,27 @@ void WebContentsObserverAndroid::DidStopLoading(
 }
 
 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(
@@ -130,16 +134,23 @@ 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(
@@ -162,31 +173,35 @@ 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())
@@ -194,15 +209,17 @@ void WebContentsObserverAndroid::DidCommitProvisionalLoadForFrame(
   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())
@@ -218,24 +235,30 @@ void WebContentsObserverAndroid::DidFinishLoad(
   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() {
@@ -254,6 +277,14 @@ void WebContentsObserverAndroid::DidDetachInterstitialPage() {
   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,
@@ -277,13 +308,13 @@ void WebContentsObserverAndroid::DidFailLoadInternal(
       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) {