Track whether a created WebContents has a resume pending.
On Android, it's possible that a WebContents is created and
cannot be loaded immediately, which occurs when Chrome needs
to start an Activity asynchronously. There's currently no
good way to know when the WebContents is in this state, though.
* Start storing whether the WebContents has needs to resume loading
in the WebContentsImpl, which can then be checked when the
WebContentsImpl may begin accepting requests from the renderer.
* Clean up Android code that heuristically tracks whether the
WebContents could be in this state.
* Existing Java and Chromium tests catch regressions.
BUG=508186
Review URL: https://codereview.chromium.org/1214723012
Cr-Commit-Position: refs/heads/master@{#338323}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java
index 74316ce..10bec26 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java
@@ -74,11 +74,6 @@
public static final String EXTRA_WEB_CONTENTS = "com.android.chrome.web_contents";
/**
- * Indicates whether a WebContents passed via the Intent has been paused.
- */
- public static final String EXTRA_WEB_CONTENTS_PAUSED = "com.android.chrome.web_contents_paused";
-
- /**
* The tab id of the parent tab, if any.
*/
public static final String EXTRA_PARENT_TAB_ID = "com.android.chrome.parent_tab_id";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/document/DocumentActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/document/DocumentActivity.java
index aa244ea3..fff514b4 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/document/DocumentActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/document/DocumentActivity.java
@@ -464,8 +464,7 @@
TabState tabState = mTabModel.getTabStateForDocument(tabId);
mDocumentTab = DocumentTab.create(DocumentActivity.this, isIncognito(),
getWindowAndroid(), determineLastKnownUrl(),
- pendingData != null ? pendingData.webContents : null,
- pendingData != null ? pendingData.webContentsPaused : false, tabState);
+ pendingData != null ? pendingData.webContents : null, tabState);
if (pendingData != null && pendingData.webContents != null) {
Intent parentIntent = IntentUtils.safeGetParcelableExtra(getIntent(),
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/document/DocumentTab.java b/chrome/android/java/src/org/chromium/chrome/browser/document/DocumentTab.java
index eaf3fd6..a85bc2f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/document/DocumentTab.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/document/DocumentTab.java
@@ -200,13 +200,13 @@
* @return The created {@link DocumentTab}.
*/
static DocumentTab create(DocumentActivity activity, boolean incognito, WindowAndroid window,
- String url, WebContents webContents, boolean webContentsPaused, TabState tabState) {
+ String url, WebContents webContents, TabState tabState) {
int parentTabId = activity.getIntent().getIntExtra(
IntentHandler.EXTRA_PARENT_TAB_ID, Tab.INVALID_TAB_ID);
if (webContents != null) {
DocumentTab tab = new DocumentTab(
activity, incognito, window, url, parentTabId, webContents);
- if (webContentsPaused) webContents.resumeLoadingCreatedWebContents();
+ webContents.resumeLoadingCreatedWebContents();
return tab;
}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/document/PendingDocumentData.java b/chrome/android/java/src/org/chromium/chrome/browser/document/PendingDocumentData.java
index f3908c0..29c2542 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/document/PendingDocumentData.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/document/PendingDocumentData.java
@@ -19,9 +19,6 @@
/** Pending native web contents object to initialize with. */
public WebContents webContents;
- /** Whether renderer events have been paused for webContents. */
- public boolean webContentsPaused;
-
/** The url to load in the current tab. */
public String url;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java
index 854e783..206f9a2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java
@@ -114,15 +114,12 @@
TraceEvent.begin("ChromeTabCreator.createNewTab");
int parentId = parent != null ? parent.getId() : Tab.INVALID_TAB_ID;
WebContents webContents = IntentHandler.getWebContentsFromIntent(intent);
- boolean isWebContentsPaused = false;
Intent parentIntent = null;
if (webContents != null) {
// The WebContents comes with additional data, but it shouldn't be used if the
// WebContents itself couldn't be parsed out.
parentId = IntentUtils.safeGetIntExtra(
intent, IntentHandler.EXTRA_PARENT_TAB_ID, Tab.INVALID_TAB_ID);
- isWebContentsPaused = IntentUtils.safeGetBooleanExtra(
- intent, IntentHandler.EXTRA_WEB_CONTENTS_PAUSED, false);
parentIntent = IntentUtils.safeGetParcelableExtra(
intent, IntentHandler.EXTRA_PARENT_INTENT);
}
@@ -140,8 +137,7 @@
tab.initialize(webContents, mTabContentManager, !openInForeground);
tab.getTabRedirectHandler().updateIntent(intent);
tab.setParentIntent(parentIntent);
-
- if (isWebContentsPaused) webContents.resumeLoadingCreatedWebContents();
+ webContents.resumeLoadingCreatedWebContents();
} else if (!openInForeground && SysUtils.isLowEndDevice()) {
// On low memory devices the tabs opened in background are not loaded automatically
// to preserve resources (cpu, memory, strong renderer binding) for the foreground
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/document/TabDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/document/TabDelegate.java
index 72ff21d..22b2936 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/document/TabDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/document/TabDelegate.java
@@ -107,16 +107,12 @@
Context context = ApplicationStatus.getApplicationContext();
int pageTransition = startedBy == DocumentMetricIds.STARTED_BY_CHROME_HOME_RECENT_TABS
? PageTransition.RELOAD : PageTransition.AUTO_TOPLEVEL;
- // TODO(dfalcantara): Pipe information about paused WebContents from native.
- boolean isWebContentsPaused =
- startedBy != DocumentMetricIds.STARTED_BY_CHROME_HOME_RECENT_TABS;
Activity parentActivity = getActivityForTabId(parentId);
if (FeatureUtilities.isDocumentMode(context)) {
PendingDocumentData data = new PendingDocumentData();
data.webContents = webContents;
- data.webContentsPaused = isWebContentsPaused;
ChromeLauncherActivity.launchDocumentInstance(parentActivity, mIsIncognito,
ChromeLauncherActivity.LAUNCH_MODE_FOREGROUND, url, startedBy, pageTransition,
@@ -128,7 +124,6 @@
tabbedIntent.setClass(context, ChromeLauncherActivity.class);
tabbedIntent.putExtra(IntentHandler.EXTRA_OPEN_NEW_INCOGNITO_TAB, mIsIncognito);
tabbedIntent.putExtra(IntentHandler.EXTRA_WEB_CONTENTS, webContents);
- tabbedIntent.putExtra(IntentHandler.EXTRA_WEB_CONTENTS_PAUSED, isWebContentsPaused);
tabbedIntent.putExtra(IntentHandler.EXTRA_PAGE_TRANSITION_TYPE, pageTransition);
tabbedIntent.putExtra(IntentHandler.EXTRA_PARENT_TAB_ID, parentId);
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 4bc516b..260969e 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -360,6 +360,7 @@
load_state_(net::LOAD_STATE_IDLE, base::string16()),
upload_size_(0),
upload_position_(0),
+ is_resume_pending_(false),
displayed_insecure_content_(false),
has_accessed_initial_document_(false),
theme_color_(SK_ColorTRANSPARENT),
@@ -1817,6 +1818,7 @@
WebContentsImpl* contents = GetCreatedWindow(route_id);
if (contents) {
WebContentsDelegate* delegate = GetDelegate();
+ contents->is_resume_pending_ = true;
if (!delegate || delegate->ShouldResumeRequestsForCreatedWindow())
contents->ResumeLoadingCreatedWebContents();
@@ -2667,8 +2669,11 @@
void WebContentsImpl::ResumeLoadingCreatedWebContents() {
// Resume blocked requests for both the RenderViewHost and RenderFrameHost.
// TODO(brettw): It seems bogus to reach into here and initialize the host.
- GetRenderViewHost()->Init();
- GetMainFrame()->Init();
+ if (is_resume_pending_) {
+ is_resume_pending_ = false;
+ GetRenderViewHost()->Init();
+ GetMainFrame()->Init();
+ }
}
bool WebContentsImpl::FocusLocationBarByDefault() {
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h
index 3ef5847e..f7c68c5 100644
--- a/content/browser/web_contents/web_contents_impl.h
+++ b/content/browser/web_contents/web_contents_impl.h
@@ -1093,6 +1093,10 @@
uint64 upload_size_;
uint64 upload_position_;
+ // Tracks that this WebContents needs to unblock requests to the renderer.
+ // See ResumeLoadingCreatedWebContents.
+ bool is_resume_pending_;
+
// Data for current page -----------------------------------------------------
// When a title cannot be taken from any entry, this title will be used.