Index: content/browser/android/web_contents_observer_android.cc |
diff --git a/content/browser/android/web_contents_observer_android.cc b/content/browser/android/web_contents_observer_android.cc |
index 72b22417d1185a9a1cb1c4a81ede0904333410fb..19a622a3829ab564abdefb4e2e8bfe5f70975ccc 100644 |
--- a/content/browser/android/web_contents_observer_android.cc |
+++ b/content/browser/android/web_contents_observer_android.cc |
@@ -129,12 +129,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; |
+ 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(), in_page_navigation); |
+ details.is_navigation_to_different_page(), is_fragment_navigation); |
} |
void WebContentsObserverAndroid::DidNavigateAnyFrame( |