summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormegjablon <megjablon@chromium.org>2016-03-01 00:17:21 -0800
committerCommit bot <commit-bot@chromium.org>2016-03-01 08:18:32 +0000
commit30814b95ba3406d644debb4391cfe1b289d29aa4 (patch)
treee02fc6b1e2c1e4be4915f7f757de9ac619a188f1
parent75f25d949020b8518c1df83fc25f732958a0f9a7 (diff)
downloadchromium_src-30814b95ba3406d644debb4391cfe1b289d29aa4.zip
chromium_src-30814b95ba3406d644debb4391cfe1b289d29aa4.tar.gz
chromium_src-30814b95ba3406d644debb4391cfe1b289d29aa4.tar.bz2
AGSA-initiated weblite intents should be rewritten if Chrome can use weblite
When Chrome receives a navigation intent for a page on googleweblight.com, Chrome should instead navigate to the url specified in the lite_url query parameter if all of the following are true: 1) The URL specifies a lite_url parameter 2) Data-Saver is enabled in Chrome 3) the LoFi weblite experiment is enabled 4) the scheme of the url in the lite_url param is HTTP BUG=584085 Review URL: https://codereview.chromium.org/1688603004 Cr-Commit-Position: refs/heads/master@{#378414}
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java2
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java22
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java11
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/document/DocumentActivity.java11
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/net/spdyproxy/DataReductionProxySettings.java42
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreator.java8
-rw-r--r--chrome/android/javatests/src/org/chromium/chrome/browser/TabsOpenedFromExternalAppTest.java49
-rw-r--r--chrome/android/javatests/src/org/chromium/chrome/browser/document/DocumentModeTest.java52
-rw-r--r--chrome/android/javatests/src/org/chromium/chrome/browser/document/DocumentModeTestBase.java9
-rw-r--r--chrome/browser/net/spdyproxy/data_reduction_proxy_settings_android.cc9
-rw-r--r--chrome/browser/net/spdyproxy/data_reduction_proxy_settings_android.h5
11 files changed, 202 insertions, 18 deletions
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 0de17a9..74534b8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java
@@ -129,13 +129,13 @@ public class IntentHandler {
private static Pair<Integer, String> sPendingReferrer;
private static int sReferrerId;
+ public static final String PACKAGE_GSA = "com.google.android.googlequicksearchbox";
private static final String PACKAGE_GMAIL = "com.google.android.gm";
private static final String PACKAGE_PLUS = "com.google.android.apps.plus";
private static final String PACKAGE_HANGOUTS = "com.google.android.talk";
private static final String PACKAGE_MESSENGER = "com.google.android.apps.messaging";
private static final String PACKAGE_LINE = "jp.naver.line.android";
private static final String PACKAGE_WHATSAPP = "com.whatsapp";
- private static final String PACKAGE_GSA = "com.google.android.googlequicksearchbox";
private static final String FACEBOOK_LINK_PREFIX = "http://m.facebook.com/l.php?";
private static final String TWITTER_LINK_PREFIX = "http://t.co/";
private static final String NEWS_LINK_PREFIX = "http://news.google.com/news/url?";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
index e331b7e..22a3e5b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
@@ -231,7 +231,7 @@ public class CustomTabActivity extends ChromeActivity {
@Override
public void finishNativeInitialization() {
- CustomTabsConnection connection = CustomTabsConnection.getInstance(getApplication());
+ final CustomTabsConnection connection = CustomTabsConnection.getInstance(getApplication());
// If extra headers have been passed, cancel any current prerender, as
// prerendering doesn't support extra headers.
if (IntentHandler.getExtraHeadersFromIntent(getIntent()) != null) {
@@ -274,6 +274,9 @@ public class CustomTabActivity extends ChromeActivity {
mCustomTabContentHandler = new CustomTabContentHandler() {
@Override
public void loadUrlAndTrackFromTimestamp(LoadUrlParams params, long timestamp) {
+ if (params.getUrl() != null) {
+ params.setUrl(connection.overrideUrlIfNecessary(params.getUrl(), mSession));
+ }
loadUrlInTab(getActivityTab(), params, timestamp);
}
@@ -317,34 +320,35 @@ public class CustomTabActivity extends ChromeActivity {
return true;
}
};
- DataUseTabUIManager.onCustomTabInitialNavigation(mMainTab,
- connection.getClientPackageNameForSession(mSession),
- IntentHandler.getUrlFromIntent(getIntent()));
+ String url = IntentHandler.getUrlFromIntent(getIntent());
+ if (url != null) url = connection.overrideUrlIfNecessary(url, mSession);
+ DataUseTabUIManager.onCustomTabInitialNavigation(
+ mMainTab, connection.getClientPackageNameForSession(mSession), url);
recordClientPackageName();
connection.showSignInToastIfNecessary(mSession, getIntent());
if (mHasCreatedTabEarly) {
if (!mMainTab.isLoading()) postDeferredStartupIfNeeded();
} else {
- loadUrlInTab(mMainTab, new LoadUrlParams(IntentHandler.getUrlFromIntent(getIntent())),
+ loadUrlInTab(mMainTab, new LoadUrlParams(url),
IntentHandler.getTimestampFromIntent(getIntent()));
}
super.finishNativeInitialization();
}
private Tab createMainTab() {
+ CustomTabsConnection customTabsConnection =
+ CustomTabsConnection.getInstance(getApplication());
String url = IntentHandler.getUrlFromIntent(getIntent());
+ if (url != null) url = customTabsConnection.overrideUrlIfNecessary(url, mSession);
// Get any referrer that has been explicitly set by the app.
String referrerUrl = IntentHandler.getReferrerUrlIncludingExtraHeaders(getIntent(), this);
if (referrerUrl == null) {
- Referrer referrer = CustomTabsConnection.getInstance(getApplication())
- .getReferrerForSession(mSession);
+ Referrer referrer = customTabsConnection.getReferrerForSession(mSession);
if (referrer != null) referrerUrl = referrer.getUrl();
}
Tab tab = new Tab(TabIdManager.getInstance().generateValidId(Tab.INVALID_TAB_ID),
Tab.INVALID_TAB_ID, false, this, getWindowAndroid(),
TabLaunchType.FROM_EXTERNAL_APP, null, null);
- CustomTabsConnection customTabsConnection =
- CustomTabsConnection.getInstance(getApplication());
tab.setAppAssociatedWith(customTabsConnection.getClientPackageNameForSession(mSession));
WebContents webContents =
customTabsConnection.takePrerenderedUrl(mSession, url, referrerUrl);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java
index 0b4e14d..5019973 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java
@@ -373,6 +373,17 @@ public class CustomTabsConnection extends ICustomTabsService.Stub {
}
/**
+ * Returns the url to which the custom tab should navigate.
+ *
+ * @param url The original url.
+ * @param session The Binder object identifying a session.
+ * @return The url to be used. May be overriden.
+ */
+ public String overrideUrlIfNecessary(String url, IBinder session) {
+ return url;
+ }
+
+ /**
* @return a spare WebContents, or null.
*
* This WebContents has already navigated to "about:blank". You have to call
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 d928530..c11a722 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
@@ -41,6 +41,7 @@ import org.chromium.chrome.browser.firstrun.FirstRunSignInProcessor;
import org.chromium.chrome.browser.firstrun.FirstRunStatus;
import org.chromium.chrome.browser.metrics.StartupMetrics;
import org.chromium.chrome.browser.metrics.UmaUtils;
+import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings;
import org.chromium.chrome.browser.ntp.NewTabPage;
import org.chromium.chrome.browser.preferences.ChromePreferenceManager;
import org.chromium.chrome.browser.preferences.PrefServiceBridge;
@@ -585,6 +586,16 @@ public class DocumentActivity extends ChromeActivity {
mTab = createActivityTab(asyncParams);
}
+ if (!isIncognito() && asyncParams != null) {
+ LoadUrlParams loadUrlParams = asyncParams.getLoadUrlParams();
+ if (loadUrlParams != null && loadUrlParams.getUrl() != null) {
+ loadUrlParams.setUrl(DataReductionProxySettings.getInstance()
+ .maybeRewriteWebliteUrl(loadUrlParams.getUrl()));
+ }
+ }
+
+ mTab = createActivityTab(asyncParams);
+
if (asyncParams != null && asyncParams.getWebContents() != null) {
Intent parentIntent = IntentUtils.safeGetParcelableExtra(getIntent(),
IntentHandler.EXTRA_PARENT_INTENT);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/net/spdyproxy/DataReductionProxySettings.java b/chrome/android/java/src/org/chromium/chrome/browser/net/spdyproxy/DataReductionProxySettings.java
index 569eb7c..5ffe3fd9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/net/spdyproxy/DataReductionProxySettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/net/spdyproxy/DataReductionProxySettings.java
@@ -5,7 +5,10 @@
package org.chromium.chrome.browser.net.spdyproxy;
import android.content.Context;
+import android.net.Uri;
import android.preference.PreferenceManager;
+import android.text.TextUtils;
+import android.webkit.URLUtil;
import org.chromium.base.ThreadUtils;
import org.chromium.base.VisibleForTesting;
@@ -55,6 +58,10 @@ public class DataReductionProxySettings {
private static final String DATA_REDUCTION_ENABLED_PREF = "BANDWIDTH_REDUCTION_PROXY_ENABLED";
+ private static final String WEBLITE_HOSTNAME = "googleweblight.com";
+
+ private static final String WEBLITE_QUERY_PARAM = "lite_url";
+
/**
* Returns whether the data reduction proxy is enabled.
*
@@ -269,6 +276,39 @@ public class DataReductionProxySettings {
return map;
}
+ /**
+ * If the given URL is a WebLite URL and should be overridden because the Data
+ * Reduction Proxy is on, the user is in the Lo-Fi previews experiment, and the scheme of the
+ * lite_url param is HTTP, returns the URL contained in the lite_url param. Otherwise returns
+ * the given URL.
+ *
+ * @param url The URL to evaluate.
+ * @return The URL to be used. Returns null if the URL param is null.
+ */
+ public String maybeRewriteWebliteUrl(String url) {
+ if (url == null || !URLUtil.isValidUrl(url) || !areLoFiPreviewsEnabled()
+ || !isDataReductionProxyEnabled()) {
+ return url;
+ }
+ String rewritten = extractUrlFromWebliteQueryParams(url);
+ if (rewritten == null
+ || !TextUtils.equals(Uri.parse(rewritten).getScheme(), "http")) {
+ return url;
+ }
+
+ return rewritten;
+ }
+
+ private String extractUrlFromWebliteQueryParams(String url) {
+ Uri uri = Uri.parse(url);
+ if (!TextUtils.equals(uri.getHost(), WEBLITE_HOSTNAME)) return null;
+ return uri.getQueryParameter(WEBLITE_QUERY_PARAM);
+ }
+
+ private boolean areLoFiPreviewsEnabled() {
+ return nativeAreLoFiPreviewsEnabled(mNativeDataReductionProxySettings);
+ }
+
private native long nativeInit();
private native boolean nativeIsDataReductionProxyAllowed(
long nativeDataReductionProxySettingsAndroid);
@@ -304,6 +344,8 @@ public class DataReductionProxySettings {
long nativeDataReductionProxySettingsAndroid);
private native boolean nativeIsDataReductionProxyUnreachable(
long nativeDataReductionProxySettingsAndroid);
+ private native boolean nativeAreLoFiPreviewsEnabled(
+ long nativeDataReductionProxySettingsAndroid);
private native String nativeGetHttpProxyList(long nativeDataReductionProxySettingsAndroid);
private native String nativeGetHttpsProxyList(long nativeDataReductionProxySettingsAndroid);
private native String nativeGetLastBypassEvent(long nativeDataReductionProxySettingsAndroid);
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 2acbb9e..d476c3c 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
@@ -13,6 +13,7 @@ import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.IntentHandler;
import org.chromium.chrome.browser.TabState;
import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
+import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabDelegateFactory;
import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType;
@@ -233,6 +234,13 @@ public class ChromeTabCreator extends TabCreatorManager.TabCreator {
String appId, boolean forceNewTab, Intent intent, long intentTimestamp) {
assert !mIncognito;
boolean isLaunchedFromChrome = TextUtils.equals(appId, mActivity.getPackageName());
+
+ // If an external app sends an intent for a Weblite URL and the Data Reduction Proxy is
+ // using Weblite mode, then use the URL in the lite_url parameter if its scheme is HTTP.
+ // This is used by ChromeTabbedActvity intents so that the user does not receive Weblite
+ // pages when he or she could be served a Data Reduction Proxy preview page.
+ if (url != null) url = DataReductionProxySettings.getInstance().maybeRewriteWebliteUrl(url);
+
if (forceNewTab && !isLaunchedFromChrome) {
// We don't associate the tab with that app ID, as it is assumed that if the
// application wanted to open this tab as a new tab, it probably does not want it
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/TabsOpenedFromExternalAppTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/TabsOpenedFromExternalAppTest.java
index 8e0ccfe..32cfec2 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/TabsOpenedFromExternalAppTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/TabsOpenedFromExternalAppTest.java
@@ -177,8 +177,8 @@ public class TabsOpenedFromExternalAppTest extends ChromeTabbedActivityTestBase
* Returns when the URL has been navigated to.
* @throws InterruptedException
*/
- private void launchUrlFromExternalApp(String url, String appId, boolean createNewTab,
- Bundle extras) throws InterruptedException {
+ private void launchUrlFromExternalApp(String url, String expectedUrl, String appId,
+ boolean createNewTab, Bundle extras) throws InterruptedException {
final Intent intent = new Intent(Intent.ACTION_VIEW);
if (appId != null) {
intent.putExtra(Browser.EXTRA_APPLICATION_ID, appId);
@@ -204,12 +204,12 @@ public class TabsOpenedFromExternalAppTest extends ChromeTabbedActivityTestBase
}
});
}
- ChromeTabUtils.waitForTabPageLoaded(getActivity().getActivityTab(), url);
+ ChromeTabUtils.waitForTabPageLoaded(getActivity().getActivityTab(), expectedUrl);
}
private void launchUrlFromExternalApp(String url, String appId, boolean createNewTab)
throws InterruptedException {
- launchUrlFromExternalApp(url, appId, createNewTab, null);
+ launchUrlFromExternalApp(url, url, appId, createNewTab, null);
}
/**
@@ -223,7 +223,7 @@ public class TabsOpenedFromExternalAppTest extends ChromeTabbedActivityTestBase
startMainActivityFromLauncher();
Bundle extras = new Bundle();
extras.putParcelable(Intent.EXTRA_REFERRER, Uri.parse(ANDROID_APP_REFERRER));
- launchUrlFromExternalApp(url, EXTERNAL_APP_1_ID, true, extras);
+ launchUrlFromExternalApp(url, url, EXTERNAL_APP_1_ID, true, extras);
CriteriaHelper.pollForCriteria(
new ReferrerCriteria(getActivity().getActivityTab(), ANDROID_APP_REFERRER), 2000,
200);
@@ -241,7 +241,7 @@ public class TabsOpenedFromExternalAppTest extends ChromeTabbedActivityTestBase
String referrer = "foobar://totally.legit.referrer";
Bundle extras = new Bundle();
extras.putParcelable(Intent.EXTRA_REFERRER, Uri.parse(referrer));
- launchUrlFromExternalApp(url, EXTERNAL_APP_1_ID, true, extras);
+ launchUrlFromExternalApp(url, url, EXTERNAL_APP_1_ID, true, extras);
CriteriaHelper.pollForCriteria(
new ReferrerCriteria(getActivity().getActivityTab(), ""), 2000, 200);
}
@@ -632,4 +632,41 @@ public class TabsOpenedFromExternalAppTest extends ChromeTabbedActivityTestBase
}
});
}
+
+ /**
+ * Tests that a Weblite url from an external app uses the lite_url param when Data Reduction
+ * Proxy previews are being used.
+ */
+ @MediumTest
+ @CommandLineFlags.Add({"enable-spdy-proxy-auth", "data-reduction-proxy-lo-fi=always-on",
+ "enable-data-reduction-proxy-lo-fi-preview"})
+ public void testLaunchWebLiteURL() throws InterruptedException {
+ startMainActivityFromLauncher();
+
+ String url = mTestServer.getURL("/chrome/test/data/android/about.html");
+
+ // Launch a first URL from an app.
+ launchUrlFromExternalApp("http://googleweblight.com/?lite_url=" + url, url,
+ EXTERNAL_APP_1_ID, false, null);
+
+ assertEquals("Selected tab is not on the right URL.",
+ url, getActivity().getActivityTab().getUrl());
+ }
+
+ /**
+ * Tests that a Weblite url from an external app does not use the lite_url param when Data
+ * Reduction Proxy previews are not being used.
+ */
+ @MediumTest
+ public void testLaunchWebLiteURLNoPreviews() throws InterruptedException {
+ startMainActivityFromLauncher();
+
+ String url = "http://googleweblight.com/?lite_url=chrome/test/data/android/about.html";
+
+ // Launch a first URL from an app.
+ launchUrlFromExternalApp(url, url, EXTERNAL_APP_1_ID, false, null);
+
+ assertEquals("Selected tab is not on the right URL.",
+ url, getActivity().getActivityTab().getUrl());
+ }
}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/document/DocumentModeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/document/DocumentModeTest.java
index 67b96e3..1cee057 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/document/DocumentModeTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/document/DocumentModeTest.java
@@ -10,6 +10,7 @@ import android.app.PendingIntent;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
+import android.os.Environment;
import android.test.FlakyTest;
import android.test.suitebuilder.annotation.MediumTest;
import android.text.TextUtils;
@@ -17,6 +18,7 @@ import android.view.View;
import org.chromium.base.ApplicationStatus;
import org.chromium.base.ThreadUtils;
+import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.base.test.util.MinAndroidSdkLevel;
import org.chromium.base.test.util.UrlUtils;
import org.chromium.chrome.browser.ChromeActivity;
@@ -26,16 +28,19 @@ import org.chromium.chrome.browser.IntentHandler;
import org.chromium.chrome.browser.ShortcutHelper;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tabmodel.TabModel;
+import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.tabmodel.TabModelUtils;
import org.chromium.chrome.browser.tabmodel.document.DocumentTabModelSelector;
import org.chromium.chrome.browser.tabmodel.document.OffTheRecordDocumentTabModel;
import org.chromium.chrome.test.util.ActivityUtils;
import org.chromium.chrome.test.util.ApplicationTestUtils;
+import org.chromium.chrome.test.util.ChromeTabUtils;
import org.chromium.chrome.test.util.DisableInTabbedMode;
import org.chromium.content.browser.test.util.Criteria;
import org.chromium.content.browser.test.util.CriteriaHelper;
import org.chromium.content.browser.test.util.TouchCommon;
import org.chromium.content_public.browser.LoadUrlParams;
+import org.chromium.net.test.EmbeddedTestServer;
import java.lang.ref.WeakReference;
import java.util.List;
@@ -650,6 +655,53 @@ public class DocumentModeTest extends DocumentModeTestBase {
"about:blank", IntentHandler.getUrlFromIntent(lastIntent));
}
+ /**
+ * Tests that a Weblite url from an external app uses the lite_url param when Data Reduction
+ * Proxy previews are being used.
+ */
+ @MediumTest
+ @CommandLineFlags.Add({"enable-spdy-proxy-auth", "data-reduction-proxy-lo-fi=always-on",
+ "enable-data-reduction-proxy-lo-fi-preview"})
+ public void testLaunchWebLiteURL() throws Exception {
+ EmbeddedTestServer testServer;
+ testServer = EmbeddedTestServer.createAndStartFileServer(
+ getInstrumentation().getContext(), Environment.getExternalStorageDirectory());
+
+ String url = testServer.getURL("/chrome/test/data/android/about.html");
+ Runnable viewIntentRunnable = getViewIntentRunnable(false,
+ "http://googleweblight.com/?lite_url=" + url);
+
+ // Wait for the Activity to start up.
+ final DocumentActivity newActivity = ActivityUtils.waitForActivity(
+ getInstrumentation(), DocumentActivity.class, viewIntentRunnable);
+ ChromeTabUtils.waitForTabPageLoaded(newActivity.getActivityTab(), (String) null);
+
+ TabModelSelector selector = ChromeApplication.getDocumentTabModelSelector();
+ assertEquals(1, selector.getTotalTabCount());
+ assertEquals(url, selector.getModel(false).getTabAt(0).getUrl());
+
+ testServer.stopAndDestroyServer();
+ }
+
+ /**
+ * Tests that a Weblite url from an external app does not use the lite_url param when Data
+ * Reduction Proxy previews are not being used.
+ */
+ @MediumTest
+ public void testLaunchWebLiteURLNoPreviews() throws Exception {
+ String url = "http://googleweblight.com/?lite_url=chrome/test/data/android/about.html";
+ Runnable viewIntentRunnable = getViewIntentRunnable(false, url);
+
+ // Wait for the Activity to start up.
+ final DocumentActivity newActivity = ActivityUtils.waitForActivity(
+ getInstrumentation(), DocumentActivity.class, viewIntentRunnable);
+ ChromeTabUtils.waitForTabPageLoaded(newActivity.getActivityTab(), (String) null);
+
+ TabModelSelector selector = ChromeApplication.getDocumentTabModelSelector();
+ assertEquals(1, selector.getTotalTabCount());
+ assertEquals(url, selector.getModel(false).getTabAt(0).getUrl());
+ }
+
private Intent performNewWindowTest(String url, String title, boolean checkWindowOpenSuccess,
String openTitle, boolean waitLongerForOpenedPage) throws Exception {
launchViaLaunchDocumentInstance(false, url, title);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/document/DocumentModeTestBase.java b/chrome/android/javatests/src/org/chromium/chrome/browser/document/DocumentModeTestBase.java
index 4187a70..db64de4 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/document/DocumentModeTestBase.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/document/DocumentModeTestBase.java
@@ -83,7 +83,13 @@ public class DocumentModeTestBase extends MultiActivityTestBase {
protected int launchViaViewIntent(final boolean incognito, final String url,
final String expectedTitle) throws Exception {
// Fire the Intent and wait until Chrome is in the foreground.
- Runnable runnable = new Runnable() {
+ return launchUrlViaRunnable(
+ incognito, getViewIntentRunnable(incognito, url), expectedTitle, false);
+ }
+
+ /** Creates a runnable that starts a DocumentActivity by using firing a VIEW Intent. */
+ protected Runnable getViewIntentRunnable(final boolean incognito, final String url) {
+ return new Runnable() {
@Override
public void run() {
Runnable runnable = new Runnable() {
@@ -105,7 +111,6 @@ public class DocumentModeTestBase extends MultiActivityTestBase {
runnable);
}
};
- return launchUrlViaRunnable(incognito, runnable, expectedTitle, false);
}
/** Starts a DocumentActivity using {@ref ChromeLauncherActivity.launchDocumentInstance().} */
diff --git a/chrome/browser/net/spdyproxy/data_reduction_proxy_settings_android.cc b/chrome/browser/net/spdyproxy/data_reduction_proxy_settings_android.cc
index 47940ae..514575c 100644
--- a/chrome/browser/net/spdyproxy/data_reduction_proxy_settings_android.cc
+++ b/chrome/browser/net/spdyproxy/data_reduction_proxy_settings_android.cc
@@ -17,6 +17,7 @@
#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_metrics.h"
#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h"
#include "components/data_reduction_proxy/core/common/data_reduction_proxy_event_store.h"
+#include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h"
#include "components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h"
#include "jni/DataReductionProxySettings_jni.h"
#include "net/proxy/proxy_server.h"
@@ -154,6 +155,14 @@ jboolean DataReductionProxySettingsAndroid::IsDataReductionProxyUnreachable(
return Settings()->IsDataReductionProxyUnreachable();
}
+jboolean DataReductionProxySettingsAndroid::AreLoFiPreviewsEnabled(
+ JNIEnv* env,
+ const JavaParamRef<jobject>& obj) {
+ return data_reduction_proxy::params::IsIncludedInLoFiPreviewFieldTrial() ||
+ (data_reduction_proxy::params::IsLoFiOnViaFlags() &&
+ data_reduction_proxy::params::AreLoFiPreviewsEnabledViaFlags());
+}
+
// static
bool DataReductionProxySettingsAndroid::Register(JNIEnv* env) {
return RegisterNativesImpl(env);
diff --git a/chrome/browser/net/spdyproxy/data_reduction_proxy_settings_android.h b/chrome/browser/net/spdyproxy/data_reduction_proxy_settings_android.h
index e4a6c6e..d351093 100644
--- a/chrome/browser/net/spdyproxy/data_reduction_proxy_settings_android.h
+++ b/chrome/browser/net/spdyproxy/data_reduction_proxy_settings_android.h
@@ -96,6 +96,11 @@ class DataReductionProxySettingsAndroid {
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
+ // Return if Lo-Fi previews are enabled via a field trial or the command line.
+ jboolean AreLoFiPreviewsEnabled(
+ JNIEnv* env,
+ const base::android::JavaParamRef<jobject>& obj);
+
ScopedJavaLocalRef<jstring> GetTokenForAuthChallenge(JNIEnv* env,
jobject obj,
jstring host,