Commit 614ea918 authored by Scott Little's avatar Scott Little Committed by Commit Bot

Unwrap Weblite requests from GSA so that they use Data Saver previews.

The constants for recognizing Weblite URLs are now controlled by field
trial params, and the logic is handled in native code for easier unit
testing.

Bug: 717592
Change-Id: I4a853db2555d82ede32a95efd00ed3a224dc87ab
Reviewed-on: https://chromium-review.googlesource.com/786173Reviewed-by: default avatarSami Kyöstilä <skyostil@chromium.org>
Reviewed-by: default avatarBenoit L <lizeb@chromium.org>
Reviewed-by: default avatarBen Greenstein <bengr@chromium.org>
Commit-Queue: Scott Little <sclittle@chromium.org>
Cr-Commit-Position: refs/heads/master@{#519508}
parent 0245710f
......@@ -5,9 +5,6 @@
package org.chromium.chrome.browser.net.spdyproxy;
import android.content.Context;
import android.net.Uri;
import android.text.TextUtils;
import android.webkit.URLUtil;
import org.chromium.base.Callback;
import org.chromium.base.ContextUtils;
......@@ -74,10 +71,6 @@ public class DataReductionProxySettings {
private static final String PARAM_PERSISTENT_MENU_ITEM_ENABLED = "persistent_menu_item_enabled";
private static final String WEBLITE_HOSTNAME = "googleweblight.com";
private static final String WEBLITE_QUERY_PARAM = "lite_url";
private Callback<List<DataReductionDataUseItem>> mQueryDataUsageCallback;
/**
......@@ -352,28 +345,7 @@ public class DataReductionProxySettings {
* @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(),
UrlConstants.HTTP_SCHEME)) {
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);
return nativeMaybeRewriteWebliteUrl(mNativeDataReductionProxySettings, url);
}
/**
......@@ -432,8 +404,8 @@ public class DataReductionProxySettings {
long nativeDataReductionProxySettingsAndroid);
private native boolean nativeIsDataReductionProxyUnreachable(
long nativeDataReductionProxySettingsAndroid);
private native boolean nativeAreLoFiPreviewsEnabled(
long nativeDataReductionProxySettingsAndroid);
private native String nativeMaybeRewriteWebliteUrl(
long nativeDataReductionProxySettingsAndroid, String url);
private native String nativeGetHttpProxyList(long nativeDataReductionProxySettingsAndroid);
private native String nativeGetLastBypassEvent(long nativeDataReductionProxySettingsAndroid);
private native void nativeQueryDataUsage(long nativeDataReductionProxySettingsAndroid,
......
......@@ -791,16 +791,16 @@ public class TabsOpenedFromExternalAppTest {
*/
@Test
@MediumTest
@CommandLineFlags.Add({"enable-spdy-proxy-auth", "data-reduction-proxy-lo-fi=always-on",
"enable-data-reduction-proxy-lite-page"})
@CommandLineFlags.
Add({"enable-spdy-proxy-auth", "enable-features=DataReductionProxyDecidesTransform"})
public void testLaunchWebLiteURL() throws InterruptedException {
mActivityTestRule.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);
launchUrlFromExternalApp(
"http://googleweblight.com/i?u=" + url, url, EXTERNAL_APP_1_ID, false, null);
Assert.assertEquals("Selected tab is not on the right URL.", url,
mActivityTestRule.getActivity().getActivityTab().getUrl());
......@@ -812,10 +812,12 @@ public class TabsOpenedFromExternalAppTest {
*/
@Test
@MediumTest
@CommandLineFlags.
Add({"enable-spdy-proxy-auth", "disable-features=DataReductionProxyDecidesTransform"})
public void testLaunchWebLiteURLNoPreviews() throws InterruptedException {
mActivityTestRule.startMainActivityFromLauncher();
String url = "http://googleweblight.com/?lite_url=chrome/test/data/android/about.html";
String url = "http://googleweblight.com/i?u=chrome/test/data/android/about.html";
// Launch a first URL from an app.
launchUrlFromExternalApp(url, url, EXTERNAL_APP_1_ID, false, null);
......
......@@ -144,7 +144,7 @@ public class CustomTabActivityTest {
private static final String FRAGMENT_TEST_PAGE = "/chrome/test/data/android/fragment.html";
private static final String TEST_MENU_TITLE = "testMenuTitle";
private static final String PRIVATE_DATA_DIRECTORY_SUFFIX = "chrome";
private static final String WEBLITE_PREFIX = "http://googleweblight.com/?lite_url=";
private static final String WEBLITE_PREFIX = "http://googleweblight.com/i?u=";
private static final String JS_MESSAGE = "from_js";
private static final String TITLE_FROM_POSTMESSAGE_TO_CHANNEL =
"<!DOCTYPE html><html><body>"
......@@ -2575,8 +2575,8 @@ public class CustomTabActivityTest {
*/
@Test
@SmallTest
@CommandLineFlags.Add({"enable-spdy-proxy-auth", "data-reduction-proxy-lo-fi=always-on",
"enable-data-reduction-proxy-lite-page"})
@CommandLineFlags.
Add({"enable-spdy-proxy-auth", "enable-features=DataReductionProxyDecidesTransform"})
@RetryOnFailure
public void testLaunchWebLiteURL() throws Exception {
final String testUrl = WEBLITE_PREFIX + mTestPage;
......@@ -2593,9 +2593,8 @@ public class CustomTabActivityTest {
*/
@Test
@SmallTest
@CommandLineFlags.Add({"enable-spdy-proxy-auth",
"disable-features=DataReductionProxyDecidesTransform",
"data-reduction-proxy-lo-fi=always-on"})
@CommandLineFlags.
Add({"enable-spdy-proxy-auth", "disable-features=DataReductionProxyDecidesTransform"})
@RetryOnFailure
public void testLaunchWebLiteURLNoPreviews() throws Exception {
final String testUrl = WEBLITE_PREFIX + mTestPage;
......@@ -2606,32 +2605,13 @@ public class CustomTabActivityTest {
Assert.assertEquals(testUrl, tab.getUrl());
}
/**
* Tests that a Weblite URL from an external app does not use the lite_url param when Data
* Reduction Proxy is not using Lo-Fi.
*/
@Test
@SmallTest
@CommandLineFlags.Add({"enable-spdy-proxy-auth",
"disable-features=DataReductionProxyDecidesTransform"})
@RetryOnFailure
public void testLaunchWebLiteURLNoLoFi() throws Exception {
final String testUrl = WEBLITE_PREFIX + mTestPage;
mCustomTabActivityTestRule.startCustomTabActivityWithIntent(
CustomTabsTestUtils.createMinimalCustomTabIntent(
InstrumentationRegistry.getTargetContext(), testUrl));
Tab tab = mCustomTabActivityTestRule.getActivity().getActivityTab();
Assert.assertEquals(testUrl, tab.getUrl());
}
/**
* Tests that a Weblite URL from an external app does not use the lite_url param when Data
* Reduction Proxy is not being used.
*/
@Test
@SmallTest
@CommandLineFlags.Add({"data-reduction-proxy-lo-fi=always-on",
"enable-data-reduction-proxy-lite-page"})
@CommandLineFlags.Add({"enable-features=DataReductionProxyDecidesTransform"})
@RetryOnFailure
public void testLaunchWebLiteURLNoDataReductionProxy() throws Exception {
final String testUrl = WEBLITE_PREFIX + mTestPage;
......@@ -2648,8 +2628,8 @@ public class CustomTabActivityTest {
*/
@Test
@SmallTest
@CommandLineFlags.Add({"enable-spdy-proxy-auth", "data-reduction-proxy-lo-fi=always-on",
"enable-data-reduction-proxy-lite-page"})
@CommandLineFlags.
Add({"enable-spdy-proxy-auth", "enable-features=DataReductionProxyDecidesTransform"})
@RetryOnFailure
public void testLaunchHttpsWebLiteURL() throws Exception {
final String testUrl = WEBLITE_PREFIX + mTestPage.replaceFirst("http", "https");
......@@ -2666,8 +2646,8 @@ public class CustomTabActivityTest {
*/
@Test
@SmallTest
@CommandLineFlags.Add({"enable-spdy-proxy-auth", "data-reduction-proxy-lo-fi=always-on",
"enable-data-reduction-proxy-lite-page"})
@CommandLineFlags.
Add({"enable-spdy-proxy-auth", "enable-features=DataReductionProxyDecidesTransform"})
@RetryOnFailure
public void testLaunchNonWebLiteURL() throws Exception {
final String testUrl = mTestPage2 + "/?lite_url=" + mTestPage;
......
......@@ -10,6 +10,7 @@
#include <string>
#include "base/android/jni_string.h"
#include "base/metrics/field_trial_params.h"
#include "base/strings/string_piece.h"
#include "base/values.h"
#include "chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_settings.h"
......@@ -28,10 +29,10 @@
#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/base/url_util.h"
#include "net/proxy/proxy_server.h"
#include "url/gurl.h"
using base::android::ConvertUTF8ToJavaString;
using base::android::JavaParamRef;
using base::android::ScopedJavaLocalRef;
......@@ -58,7 +59,6 @@ DataReductionProxySettingsAndroid::DataReductionProxySettingsAndroid(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj)
: weak_factory_(this) {
j_settings_obj_ = JavaObjectWeakGlobalRef(env, obj);
}
DataReductionProxySettingsAndroid::~DataReductionProxySettingsAndroid() {
......@@ -161,14 +161,48 @@ jboolean DataReductionProxySettingsAndroid::IsDataReductionProxyUnreachable(
return Settings()->IsDataReductionProxyUnreachable();
}
jboolean DataReductionProxySettingsAndroid::AreLoFiPreviewsEnabled(
ScopedJavaLocalRef<jstring>
DataReductionProxySettingsAndroid::MaybeRewriteWebliteUrl(
JNIEnv* env,
const JavaParamRef<jobject>& obj) {
return base::FeatureList::IsEnabled(
data_reduction_proxy::features::
kDataReductionProxyDecidesTransform) ||
(data_reduction_proxy::params::IsLoFiOnViaFlags() &&
data_reduction_proxy::params::AreLitePagesEnabledViaFlags());
const base::android::JavaRef<jobject>& obj,
const base::android::JavaRef<jstring>& url) {
if (url.is_null() || !Settings()->IsDataReductionProxyEnabled() ||
!base::FeatureList::IsEnabled(data_reduction_proxy::features::
kDataReductionProxyDecidesTransform)) {
return ScopedJavaLocalRef<jstring>(url);
}
GURL gurl(base::android::ConvertJavaStringToUTF8(url));
if (!gurl.is_valid() || gurl.is_empty())
return ScopedJavaLocalRef<jstring>(url);
std::string weblite_host_and_path = base::GetFieldTrialParamValueByFeature(
data_reduction_proxy::features::kDataReductionProxyDecidesTransform,
"weblite_url_host_and_path");
if (weblite_host_and_path.empty())
weblite_host_and_path = "googleweblight.com/i";
if (gurl.host() + gurl.path() != weblite_host_and_path)
return ScopedJavaLocalRef<jstring>(url);
std::string weblite_query_param = base::GetFieldTrialParamValueByFeature(
data_reduction_proxy::features::kDataReductionProxyDecidesTransform,
"weblite_url_query_param");
if (weblite_query_param.empty())
weblite_query_param = "u";
std::string wrapped_url_str;
if (!net::GetValueForKeyInQuery(gurl, weblite_query_param, &wrapped_url_str))
return ScopedJavaLocalRef<jstring>(url);
GURL wrapped_gurl(wrapped_url_str);
if (!wrapped_gurl.is_valid() || wrapped_gurl.is_empty() ||
!wrapped_gurl.SchemeIs("http")) {
return ScopedJavaLocalRef<jstring>(url);
}
return base::android::ConvertUTF8ToJavaString(env, wrapped_gurl.spec());
}
ScopedJavaLocalRef<jlongArray>
......@@ -226,20 +260,22 @@ void DataReductionProxySettingsAndroid::QueryDataUsage(
const JavaParamRef<jobject>& j_result_obj,
jint num_days) {
DCHECK(num_days <= data_reduction_proxy::kDataUsageHistoryNumDays);
j_query_result_obj_.Reset(env, j_result_obj);
num_day_for_query_ = num_days;
Settings()
->data_reduction_proxy_service()
->compression_stats()
->GetHistoricalDataUsage(base::Bind(
&DataReductionProxySettingsAndroid::OnQueryDataUsageComplete,
weak_factory_.GetWeakPtr()));
weak_factory_.GetWeakPtr(), JavaObjectWeakGlobalRef(env, obj),
base::android::ScopedJavaGlobalRef<jobject>(j_result_obj), num_days));
}
void DataReductionProxySettingsAndroid::OnQueryDataUsageComplete(
JavaObjectWeakGlobalRef obj,
const base::android::ScopedJavaGlobalRef<jobject>& j_result_obj,
jint num_days,
std::unique_ptr<std::vector<data_reduction_proxy::DataUsageBucket>>
data_usage) {
if (j_query_result_obj_.is_null())
if (j_result_obj.is_null())
return;
JNIEnv* env = base::android::AttachCurrentThread();
......@@ -248,7 +284,7 @@ void DataReductionProxySettingsAndroid::OnQueryDataUsageComplete(
// Data usage is sorted chronologically with the last entry corresponding to
// |base::Time::Now()|.
const size_t num_buckets_to_display = num_day_for_query_ * kBucketsPerDay;
const size_t num_buckets_to_display = num_days * kBucketsPerDay;
for (auto data_usage_it = data_usage->size() > num_buckets_to_display
? data_usage->end() - num_buckets_to_display
: data_usage->begin();
......@@ -264,15 +300,12 @@ void DataReductionProxySettingsAndroid::OnQueryDataUsageComplete(
for (const auto& site_bucket : per_site_usage_map) {
Java_DataReductionProxySettings_createDataUseItemAndAddToList(
env, j_query_result_obj_,
ConvertUTF8ToJavaString(env, site_bucket.first),
env, j_result_obj, ConvertUTF8ToJavaString(env, site_bucket.first),
site_bucket.second.data_used, site_bucket.second.original_size);
}
Java_DataReductionProxySettings_onQueryDataUsageComplete(
env, j_settings_obj_.get(env), j_query_result_obj_);
j_query_result_obj_.Release();
Java_DataReductionProxySettings_onQueryDataUsageComplete(env, obj.get(env),
j_result_obj);
}
// Used by generated jni code.
......
......@@ -18,8 +18,6 @@
#include "components/data_reduction_proxy/proto/data_store.pb.h"
#include "components/prefs/pref_member.h"
using base::android::ScopedJavaLocalRef;
class Profile;
namespace data_reduction_proxy {
......@@ -65,13 +63,14 @@ class DataReductionProxySettingsAndroid {
jlong GetTotalHttpContentLengthSaved(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
ScopedJavaLocalRef<jlongArray> GetDailyOriginalContentLengths(
base::android::ScopedJavaLocalRef<jlongArray> GetDailyOriginalContentLengths(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
ScopedJavaLocalRef<jlongArray> GetDailyReceivedContentLengths(
base::android::ScopedJavaLocalRef<jlongArray> GetDailyReceivedContentLengths(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
ScopedJavaLocalRef<jstring> GetDataReductionProxyPassThroughHeader(
base::android::ScopedJavaLocalRef<jstring>
GetDataReductionProxyPassThroughHeader(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
......@@ -88,25 +87,26 @@ 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(
base::android::ScopedJavaLocalRef<jstring> MaybeRewriteWebliteUrl(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
const base::android::JavaRef<jobject>& obj,
const base::android::JavaRef<jstring>& url);
ScopedJavaLocalRef<jstring> GetTokenForAuthChallenge(JNIEnv* env,
jobject obj,
jstring host,
jstring realm);
base::android::ScopedJavaLocalRef<jstring> GetTokenForAuthChallenge(
JNIEnv* env,
jobject obj,
jstring host,
jstring realm);
// Returns a Java string of the Data Reduction Proxy proxy list for HTTP
// origins as a semi-colon delimited list.
ScopedJavaLocalRef<jstring> GetHttpProxyList(
base::android::ScopedJavaLocalRef<jstring> GetHttpProxyList(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
// Returns a Java string of the last Data Reduction Proxy bypass event as
// a JSON object.
ScopedJavaLocalRef<jstring> GetLastBypassEvent(
base::android::ScopedJavaLocalRef<jstring> GetLastBypassEvent(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
......@@ -117,24 +117,21 @@ class DataReductionProxySettingsAndroid {
const base::android::JavaParamRef<jobject>& j_result_obj,
jint num_days);
void OnQueryDataUsageComplete(
JavaObjectWeakGlobalRef obj,
const base::android::ScopedJavaGlobalRef<jobject>& j_result_obj,
jint num_days,
std::unique_ptr<std::vector<data_reduction_proxy::DataUsageBucket>>
data_usage);
JavaObjectWeakGlobalRef j_settings_obj_;
base::android::ScopedJavaGlobalRef<jobject> j_query_result_obj_;
int num_day_for_query_;
private:
friend class DataReductionProxySettingsAndroidTest;
friend class TestDataReductionProxySettingsAndroid;
FRIEND_TEST_ALL_PREFIXES(DataReductionProxySettingsAndroidTest,
TestGetDailyContentLengths);
// For testing purposes.
DataReductionProxySettingsAndroid();
ScopedJavaLocalRef<jlongArray> GetDailyContentLengths(JNIEnv* env,
const char* pref_name);
base::android::ScopedJavaLocalRef<jlongArray> GetDailyContentLengths(
JNIEnv* env,
const char* pref_name);
virtual data_reduction_proxy::DataReductionProxySettings* Settings();
......
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