Commit 4c55f398 authored by mariakhomenko's avatar mariakhomenko Committed by Commit bot

Load web contents after tab is created.

In document mode, we used to start loading the web contents of a newly
opened tab before the chrome tab object is ready. This would result in
chrome intercept delegate not being initialized in time to figure out
whether the loaded URL needs to be sent as an intent instead.

This changes the order of operations to create the chrome tab first with
the given web contents and only then initiate the load.

BUG=432562

Review URL: https://codereview.chromium.org/883153002

Cr-Commit-Position: refs/heads/master@{#313966}
parent f6cba754
...@@ -5,3 +5,4 @@ M D UrF: Unread public/protected field: org.chromium.chrome.browser.document.Pen ...@@ -5,3 +5,4 @@ M D UrF: Unread public/protected field: org.chromium.chrome.browser.document.Pen
M D UuF: Unused public or protected field: org.chromium.chrome.browser.document.PendingDocumentData.webContents In PendingDocumentData.java M D UuF: Unused public or protected field: org.chromium.chrome.browser.document.PendingDocumentData.webContents In PendingDocumentData.java
M D UuF: Unused public or protected field: org.chromium.chrome.browser.document.PendingDocumentData.originalIntent In PendingDocumentData.java M D UuF: Unused public or protected field: org.chromium.chrome.browser.document.PendingDocumentData.originalIntent In PendingDocumentData.java
M D UuF: Unused public or protected field: org.chromium.chrome.browser.document.PendingDocumentData.url In PendingDocumentData.java M D UuF: Unused public or protected field: org.chromium.chrome.browser.document.PendingDocumentData.url In PendingDocumentData.java
M D UuF: Unused public or protected field: org.chromium.chrome.browser.document.PendingDocumentData.userGesture In PendingDocumentData.java
...@@ -116,6 +116,7 @@ android_library("chrome_java") { ...@@ -116,6 +116,7 @@ android_library("chrome_java") {
} }
# GYP: //chrome/chrome_browser.gypi:activity_type_ids_java # GYP: //chrome/chrome_browser.gypi:activity_type_ids_java
# GYP: //chrome/chrome_browser.gypi:add_web_contents_result_java
# GYP: //chrome/chrome_browser.gypi:profile_account_management_metrics_java # GYP: //chrome/chrome_browser.gypi:profile_account_management_metrics_java
# GYP: //chrome/chrome_browser.gypi:profile_sync_service_model_type_selection_java # GYP: //chrome/chrome_browser.gypi:profile_sync_service_model_type_selection_java
# GYP: //chrome/chrome_browser.gypi:tab_load_status_java # GYP: //chrome/chrome_browser.gypi:tab_load_status_java
...@@ -123,6 +124,7 @@ android_library("chrome_java") { ...@@ -123,6 +124,7 @@ android_library("chrome_java") {
java_cpp_enum("chrome_android_java_enums_srcjar") { java_cpp_enum("chrome_android_java_enums_srcjar") {
sources = [ sources = [
"//chrome/browser/android/activity_type_ids.h", "//chrome/browser/android/activity_type_ids.h",
"//chrome/browser/android/chrome_web_contents_delegate_android.h",
"//chrome/browser/android/tab_android.h", "//chrome/browser/android/tab_android.h",
"//chrome/browser/profiles/profile_metrics.h", "//chrome/browser/profiles/profile_metrics.h",
"//chrome/browser/sync/profile_sync_service_android.cc", "//chrome/browser/sync/profile_sync_service_android.cc",
...@@ -130,6 +132,7 @@ java_cpp_enum("chrome_android_java_enums_srcjar") { ...@@ -130,6 +132,7 @@ java_cpp_enum("chrome_android_java_enums_srcjar") {
] ]
outputs = [ outputs = [
"org/chromium/chrome/browser/ActivityTypeIds.java", "org/chromium/chrome/browser/ActivityTypeIds.java",
"org/chromium/chrome/browser/AddWebContentsResult.java",
"org/chromium/chrome/browser/TabLoadStatus.java", "org/chromium/chrome/browser/TabLoadStatus.java",
"org/chromium/chrome/browser/profiles/ProfileAccountManagementMetrics.java", "org/chromium/chrome/browser/profiles/ProfileAccountManagementMetrics.java",
"org/chromium/chrome/browser/sync/ModelTypeSelection.java", "org/chromium/chrome/browser/sync/ModelTypeSelection.java",
......
...@@ -28,9 +28,9 @@ public class ChromeWebContentsDelegateAndroid extends WebContentsDelegateAndroid ...@@ -28,9 +28,9 @@ public class ChromeWebContentsDelegateAndroid extends WebContentsDelegateAndroid
} }
@CalledByNative @CalledByNative
public boolean addNewContents(WebContents sourceWebContents, WebContents webContents, public int addNewContents(WebContents sourceWebContents, WebContents webContents,
int disposition, Rect initialPosition, boolean userGesture) { int disposition, Rect initialPosition, boolean userGesture) {
return false; return AddWebContentsResult.STOP_LOAD_AND_DELETE;
} }
@Override @Override
......
...@@ -29,6 +29,9 @@ public class PendingDocumentData { ...@@ -29,6 +29,9 @@ public class PendingDocumentData {
/** HTTP "referer". */ /** HTTP "referer". */
public Referrer referrer; public Referrer referrer;
/** The original intent */ /** The original intent. */
public Intent originalIntent; public Intent originalIntent;
/** Whether there was a user gesture during the navigation. */
public boolean userGesture;
} }
\ No newline at end of file
...@@ -320,7 +320,8 @@ void ChromeWebContentsDelegateAndroid::AddNewContents( ...@@ -320,7 +320,8 @@ void ChromeWebContentsDelegateAndroid::AddNewContents(
JNIEnv* env = AttachCurrentThread(); JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env); ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env);
bool handled = false; AddWebContentsResult add_result =
ADD_WEB_CONTENTS_RESULT_STOP_LOAD_AND_DELETE;
if (!obj.is_null()) { if (!obj.is_null()) {
ScopedJavaLocalRef<jobject> jsource; ScopedJavaLocalRef<jobject> jsource;
if (source) if (source)
...@@ -329,19 +330,21 @@ void ChromeWebContentsDelegateAndroid::AddNewContents( ...@@ -329,19 +330,21 @@ void ChromeWebContentsDelegateAndroid::AddNewContents(
if (new_contents) if (new_contents)
jnew_contents = new_contents->GetJavaWebContents(); jnew_contents = new_contents->GetJavaWebContents();
handled = Java_ChromeWebContentsDelegateAndroid_addNewContents( add_result = static_cast<AddWebContentsResult>(
env, Java_ChromeWebContentsDelegateAndroid_addNewContents(
obj.obj(), env,
jsource.obj(), obj.obj(),
jnew_contents.obj(), jsource.obj(),
static_cast<jint>(disposition), jnew_contents.obj(),
NULL, static_cast<jint>(disposition),
user_gesture); NULL,
user_gesture));
} }
if (was_blocked) if (was_blocked)
*was_blocked = !handled; *was_blocked = !(add_result == ADD_WEB_CONTENTS_RESULT_PROCEED);
if (!handled)
if (add_result == ADD_WEB_CONTENTS_RESULT_STOP_LOAD_AND_DELETE)
delete new_contents; delete new_contents;
} }
......
...@@ -27,6 +27,16 @@ class RectF; ...@@ -27,6 +27,16 @@ class RectF;
namespace chrome { namespace chrome {
namespace android { namespace android {
// An enum with the result of calling AddNewContents() in Java.
//
// A Java counterpart will be generated for this enum.
// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser
enum AddWebContentsResult {
ADD_WEB_CONTENTS_RESULT_PROCEED,
ADD_WEB_CONTENTS_RESULT_STOP_LOAD,
ADD_WEB_CONTENTS_RESULT_STOP_LOAD_AND_DELETE
};
// Chromium Android specific WebContentsDelegate. // Chromium Android specific WebContentsDelegate.
// Should contain any WebContentsDelegate implementations required by // Should contain any WebContentsDelegate implementations required by
// the Chromium Android port but not to be shared with WebView. // the Chromium Android port but not to be shared with WebView.
......
...@@ -604,6 +604,7 @@ ...@@ -604,6 +604,7 @@
'chrome_version_java', 'chrome_version_java',
'document_tab_model_info_proto_java', 'document_tab_model_info_proto_java',
'profile_account_management_metrics_java', 'profile_account_management_metrics_java',
'add_web_contents_result_java',
'content_setting_java', 'content_setting_java',
'content_settings_type_java', 'content_settings_type_java',
'page_info_connection_type_java', 'page_info_connection_type_java',
......
...@@ -3616,6 +3616,15 @@ ...@@ -3616,6 +3616,15 @@
}, },
'includes': [ '../build/android/java_cpp_enum.gypi' ], 'includes': [ '../build/android/java_cpp_enum.gypi' ],
}, },
{
# GN: //chrome/android:chrome_android_java_enums_srcjar
'target_name': 'add_web_contents_result_java',
'type': 'none',
'variables': {
'source_file': 'browser/android/chrome_web_contents_delegate_android.h',
},
'includes': [ '../build/android/java_cpp_enum.gypi' ],
},
{ {
# GN: //chrome/android:chrome_android_java_enums_srcjar # GN: //chrome/android:chrome_android_java_enums_srcjar
'target_name': 'profile_sync_service_model_type_selection_java', 'target_name': 'profile_sync_service_model_type_selection_java',
......
...@@ -480,4 +480,19 @@ void WebContentsAndroid::AddMessageToDevToolsConsole(JNIEnv* env, ...@@ -480,4 +480,19 @@ void WebContentsAndroid::AddMessageToDevToolsConsole(JNIEnv* env,
ConvertJavaStringToUTF8(env, message))); ConvertJavaStringToUTF8(env, message)));
} }
void WebContentsAndroid::OpenURL(JNIEnv* env,
jobject obj,
jstring url,
jboolean user_gesture,
jboolean is_renderer_initiated) {
GURL gurl(base::android::ConvertJavaStringToUTF8(env, url));
OpenURLParams open_params(gurl,
Referrer(),
CURRENT_TAB,
ui::PAGE_TRANSITION_LINK,
is_renderer_initiated);
open_params.user_gesture = user_gesture;
web_contents_->OpenURL(open_params);
}
} // namespace content } // namespace content
...@@ -109,6 +109,12 @@ class CONTENT_EXPORT WebContentsAndroid ...@@ -109,6 +109,12 @@ class CONTENT_EXPORT WebContentsAndroid
jint level, jint level,
jstring message); jstring message);
void OpenURL(JNIEnv* env,
jobject jobj,
jstring url,
jboolean user_gesture,
jboolean is_renderer_initiated);
private: private:
RenderWidgetHostViewAndroid* GetRenderWidgetHostViewAndroid(); RenderWidgetHostViewAndroid* GetRenderWidgetHostViewAndroid();
......
...@@ -296,6 +296,11 @@ import org.chromium.content_public.browser.WebContents; ...@@ -296,6 +296,11 @@ import org.chromium.content_public.browser.WebContents;
nativeAddMessageToDevToolsConsole(mNativeWebContentsAndroid, level, message); nativeAddMessageToDevToolsConsole(mNativeWebContentsAndroid, level, message);
} }
@Override
public void openUrl(String url, boolean userGesture, boolean isRendererInitiated) {
nativeOpenURL(mNativeWebContentsAndroid, url, userGesture, isRendererInitiated);
}
@CalledByNative @CalledByNative
private static void onEvaluateJavaScriptResult( private static void onEvaluateJavaScriptResult(
String jsonResult, JavaScriptCallback callback) { String jsonResult, JavaScriptCallback callback) {
...@@ -347,4 +352,6 @@ import org.chromium.content_public.browser.WebContents; ...@@ -347,4 +352,6 @@ import org.chromium.content_public.browser.WebContents;
String script, JavaScriptCallback callback); String script, JavaScriptCallback callback);
private native void nativeAddMessageToDevToolsConsole( private native void nativeAddMessageToDevToolsConsole(
long nativeWebContentsAndroid, int level, String message); long nativeWebContentsAndroid, int level, String message);
private native void nativeOpenURL(long nativeWebContentsAndroid, String url,
boolean userGesture, boolean isRendererInitiated);
} }
...@@ -213,4 +213,13 @@ public interface WebContents { ...@@ -213,4 +213,13 @@ public interface WebContents {
* org.chromium.content_public.common.ConsoleMessageLevel. * org.chromium.content_public.common.ConsoleMessageLevel.
*/ */
public void addMessageToDevToolsConsole(int level, String message); public void addMessageToDevToolsConsole(int level, String message);
/**
* Opens a URL on web contents.
* @param url The URL to open.
* @param userGesture Whether navigation is triggered during a user gesture.
* @param isRendererInitiated Whether the navigation was started in the renderer (e.g.
* clicking on a link).
*/
public void openUrl(String url, boolean userGesture, boolean isRendererInitiated);
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment