summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorgavinp@chromium.org <gavinp@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-12 23:45:15 +0000
committergavinp@chromium.org <gavinp@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-12 23:45:15 +0000
commit0e6f56d09ae4323ce7a8ac65f367524b05d22e11 (patch)
tree62be0d0889b41eb05d8768404cdc0e8abe3b2ef2 /chrome
parent9a55bb981e5f390f796912bab0f58f5443112674 (diff)
downloadchromium_src-0e6f56d09ae4323ce7a8ac65f367524b05d22e11.zip
chromium_src-0e6f56d09ae4323ce7a8ac65f367524b05d22e11.tar.gz
chromium_src-0e6f56d09ae4323ce7a8ac65f367524b05d22e11.tar.bz2
Updated about_flags and command-line switch handling for prerender/prefetch
The second half of http://codereview.chromium.org/6410082/ , which cbentzel suggested be landed in two halves. This upload addresses comments from that review (improved description, unified options, no more contradictory option possibilities). BUG=70610 TEST=lots of manual testing, http://browserspy.dk/prefetch.php Review URL: http://codereview.chromium.org/6480002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@74740 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/app/generated_resources.grd15
-rw-r--r--chrome/browser/about_flags.cc12
-rw-r--r--chrome/browser/browser_main.cc95
-rw-r--r--chrome/browser/prerender/prerender_browsertest.cc3
-rw-r--r--chrome/browser/prerender/prerender_manager.cc7
-rw-r--r--chrome/browser/prerender/prerender_manager.h1
-rw-r--r--chrome/browser/profiles/profile_impl.cc3
-rw-r--r--chrome/common/chrome_switches.cc26
-rw-r--r--chrome/common/chrome_switches.h8
9 files changed, 117 insertions, 53 deletions
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index c6d88b7..47a3de1 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -4050,11 +4050,20 @@ Keep your key file in a safe place. You will need it to create new versions of y
<message name="IDS_FLAGS_DNS_SERVER_DESCRIPTION" desc="">
User specified DNS server, which Chrome will use for DNS resolutions rather than the system defaults.
</message>
- <message name="IDS_FLAGS_PAGE_PRERENDER_NAME" desc="">
+ <message name="IDS_FLAGS_PAGE_PRERENDER_NAME" desc="Name of the 'Prerendering' lab.">
Web Page Prerendering.
</message>
- <message name="IDS_FLAGS_PAGE_PRERENDER_DESCRIPTION" desc="">
- Speculatively prerenders complete webpages in the background for a faster browsing experience.
+ <message name="IDS_FLAGS_PAGE_PRERENDER_DESCRIPTION" desc="Description of the 'Prerendering' lab.">
+ Speculatively prerenders complete webpages in the background for a faster browsing experience. The default setting of automatic can cause this feature to enable/disable randomly for testing purposes.\n
+ </message>
+ <message name="IDS_FLAGS_PAGE_PRERENDER_AUTOMATIC" desc="Option name for automatic selection in the 'Prerendering' lab">
+ Automatic
+ </message>
+ <message name="IDS_FLAGS_PAGE_PRERENDER_ENABLED" desc="Option name for always enabling the 'Prerendering' lab">
+ Always Enabled
+ </message>
+ <message name="IDS_FLAGS_PAGE_PRERENDER_DISABLED" desc="Option name for always disabling the 'Prerendering' lab">
+ Always Disabled
</message>
<message name="IDS_FLAGS_CONFIRM_TO_QUIT_NAME" desc="Name of the 'Confirm to Quit' lab.">
Confirm to Quit
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 9193489..f2374ed 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -28,7 +28,7 @@ namespace about_flags {
#define SINGLE_VALUE_TYPE(command_line_switch) \
SINGLE_VALUE_TYPE_AND_VALUE(command_line_switch, "")
#define MULTI_VALUE_TYPE(choices) \
- Experiment::MULTI_VALUE, "", choices, arraysize(choices)
+ Experiment::MULTI_VALUE, "", "", choices, arraysize(choices)
namespace {
@@ -40,6 +40,14 @@ const char kMediaPlayerExperimentName[] = "media-player";
const char kAdvancedFileSystemExperimentName[] = "advanced-file-system";
const char kVerticalTabsExperimentName[] = "vertical-tabs";
+const Experiment::Choice kPagePrerenderChoices[] = {
+ { IDS_FLAGS_PAGE_PRERENDER_AUTOMATIC, "", "" },
+ { IDS_FLAGS_PAGE_PRERENDER_ENABLED,
+ switches::kPrerender, switches::kPrerenderSwitchValueEnabled },
+ { IDS_FLAGS_PAGE_PRERENDER_DISABLED,
+ switches::kPrerender, switches::kPrerenderSwitchValueDisabled },
+};
+
// RECORDING USER METRICS FOR FLAGS:
// -----------------------------------------------------------------------------
// The first line of the experiment is the internal name. If you'd like to
@@ -195,7 +203,7 @@ const Experiment kExperiments[] = {
IDS_FLAGS_PAGE_PRERENDER_NAME,
IDS_FLAGS_PAGE_PRERENDER_DESCRIPTION,
kOsAll,
- SINGLE_VALUE_TYPE(switches::kEnablePagePrerender)
+ MULTI_VALUE_TYPE(kPagePrerenderChoices)
},
{
"confirm-to-quit", // FLAGS:RECORD_UMA
diff --git a/chrome/browser/browser_main.cc b/chrome/browser/browser_main.cc
index b813a17..9ef2054 100644
--- a/chrome/browser/browser_main.cc
+++ b/chrome/browser/browser_main.cc
@@ -429,39 +429,76 @@ void BrowserMainParts::SpdyFieldTrial() {
}
}
-// If any of --enable-prerender, --enable-content-prefetch or
-// --disable-content-prefetch are set, use those to determine if
-// prefetch is enabled. Otherwise, randomly assign users to an A/B test for
-// prefetching.
+// Parse the --prerender= command line switch, which controls both prerendering
+// and prefetching. If the switch is unset, or is set to "auto", then the user
+// is assigned to a field trial.
void BrowserMainParts::PrefetchAndPrerenderFieldTrial() {
- if (parsed_command_line().HasSwitch(switches::kEnableContentPrefetch) ||
- parsed_command_line().HasSwitch(switches::kEnablePagePrerender))
- ResourceDispatcherHost::set_is_prefetch_enabled(true);
- else if (parsed_command_line().HasSwitch(switches::kDisableContentPrefetch)) {
- ResourceDispatcherHost::set_is_prefetch_enabled(false);
- } else {
- const base::FieldTrial::Probability kPrefetchDivisor = 1000;
- const base::FieldTrial::Probability no_prefetch_probability = 500;
- // After June 30, 2011 builds, it will always be in default group.
- scoped_refptr<base::FieldTrial> trial(
- new base::FieldTrial("Prefetch", kPrefetchDivisor,
- "ContentPrefetchEnabled", 2011, 6, 30));
- const int yes_prefetch_grp = trial->kDefaultGroupNumber;
- trial->AppendGroup("ContentPrefetchDisabled", no_prefetch_probability);
- const int trial_grp = trial->group();
- ResourceDispatcherHost::set_is_prefetch_enabled(
- trial_grp == yes_prefetch_grp);
+ enum PrerenderOption {
+ PRERENDER_OPTION_AUTO,
+ PRERENDER_OPTION_DISABLED,
+ PRERENDER_OPTION_ENABLED,
+ PRERENDER_OPTION_PREFETCH_ONLY,
+ };
+
+ PrerenderOption prerender_option = PRERENDER_OPTION_AUTO;
+ if (parsed_command_line().HasSwitch(switches::kPrerender)) {
+ const std::string switch_value =
+ parsed_command_line().GetSwitchValueASCII(switches::kPrerender);
+
+ if (switch_value == switches::kPrerenderSwitchValueAuto) {
+ prerender_option = PRERENDER_OPTION_AUTO;
+ } else if (switch_value == switches::kPrerenderSwitchValueDisabled) {
+ prerender_option = PRERENDER_OPTION_DISABLED;
+ } else if (switch_value.empty() ||
+ switch_value == switches::kPrerenderSwitchValueEnabled) {
+ // The empty string means the option was provided with no value, and that
+ // means enable.
+ prerender_option = PRERENDER_OPTION_ENABLED;
+ } else if (switch_value == switches::kPrerenderSwitchValuePrefetchOnly) {
+ prerender_option = PRERENDER_OPTION_PREFETCH_ONLY;
+ } else {
+ prerender_option = PRERENDER_OPTION_DISABLED;
+ LOG(ERROR) << "Invalid --prerender option received on command line: "
+ << switch_value;
+ LOG(ERROR) << "Disabling prerendering!";
+ }
}
- PrerenderManager::PrerenderManagerMode prerender_mode =
- PrerenderManager::PRERENDER_MODE_DISABLED;
- if (parsed_command_line().HasSwitch(switches::kEnablePagePrerender))
- prerender_mode = PrerenderManager::PRERENDER_MODE_ENABLED;
- else
- prerender_mode = PrerenderManager::PRERENDER_MODE_DISABLED;
- PrerenderManager::SetMode(prerender_mode);
+ switch (prerender_option) {
+ case PRERENDER_OPTION_AUTO: {
+ const base::FieldTrial::Probability kPrefetchDivisor = 1000;
+ const base::FieldTrial::Probability no_prefetch_probability = 500;
+ // After June 30, 2011 builds, it will always be in default group.
+ scoped_refptr<base::FieldTrial> trial(
+ new base::FieldTrial("Prefetch", kPrefetchDivisor,
+ "ContentPrefetchEnabled", 2011, 6, 30));
+ const int yes_prefetch_grp = trial->kDefaultGroupNumber;
+ trial->AppendGroup("ContentPrefetchDisabled", no_prefetch_probability);
+ const int trial_grp = trial->group();
+ ResourceDispatcherHost::set_is_prefetch_enabled(
+ trial_grp == yes_prefetch_grp);
+
+ // There is currently no prerendering field trial.
+ PrerenderManager::SetMode(PrerenderManager::PRERENDER_MODE_DISABLED);
+ break;
+ }
+ case PRERENDER_OPTION_DISABLED:
+ ResourceDispatcherHost::set_is_prefetch_enabled(false);
+ PrerenderManager::SetMode(PrerenderManager::PRERENDER_MODE_DISABLED);
+ break;
+ case PRERENDER_OPTION_ENABLED:
+ ResourceDispatcherHost::set_is_prefetch_enabled(true);
+ PrerenderManager::SetMode(PrerenderManager::PRERENDER_MODE_ENABLED);
+ break;
+ case PRERENDER_OPTION_PREFETCH_ONLY:
+ ResourceDispatcherHost::set_is_prefetch_enabled(true);
+ PrerenderManager::SetMode(PrerenderManager::PRERENDER_MODE_DISABLED);
+ break;
+ default:
+ NOTREACHED();
+ }
- UMA_HISTOGRAM_ENUMERATION("Prerender.Sessions", prerender_mode,
+ UMA_HISTOGRAM_ENUMERATION("Prerender.Sessions", PrerenderManager::GetMode(),
PrerenderManager::PRERENDER_MODE_MAX);
}
diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc
index 116a6d7..c31817e 100644
--- a/chrome/browser/prerender/prerender_browsertest.cc
+++ b/chrome/browser/prerender/prerender_browsertest.cc
@@ -92,7 +92,8 @@ class PrerenderBrowserTest : public InProcessBrowserTest {
}
virtual void SetUpCommandLine(CommandLine* command_line) {
- command_line->AppendSwitch(switches::kEnablePagePrerender);
+ command_line->AppendSwitchASCII(switches::kPrerender,
+ switches::kPrerenderSwitchValueEnabled);
#if defined(OS_MACOSX)
// The plugins directory isn't read by default on the Mac, so it needs to be
// explicitly registered.
diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc
index e4f4508..6e28a2c 100644
--- a/chrome/browser/prerender/prerender_manager.cc
+++ b/chrome/browser/prerender/prerender_manager.cc
@@ -33,6 +33,13 @@ void PrerenderManager::SetMode(PrerenderManagerMode mode) {
mode_ = mode;
}
+// static
+bool PrerenderManager::IsPrerenderingEnabled() {
+ return
+ GetMode() == PRERENDER_MODE_ENABLED ||
+ GetMode() == PRERENDER_MODE_EXPERIMENT_PRERENDER_GROUP;
+}
+
struct PrerenderManager::PrerenderContentsData {
PrerenderContents* contents_;
base::Time start_time_;
diff --git a/chrome/browser/prerender/prerender_manager.h b/chrome/browser/prerender/prerender_manager.h
index de54500..6a62915 100644
--- a/chrome/browser/prerender/prerender_manager.h
+++ b/chrome/browser/prerender/prerender_manager.h
@@ -66,6 +66,7 @@ class PrerenderManager : public base::RefCounted<PrerenderManager> {
static PrerenderManagerMode GetMode();
static void SetMode(PrerenderManagerMode mode);
+ static bool IsPrerenderingEnabled();
// The following static method can be called from any thread, but will result
// in posting a task to the UI thread if we are not in the UI thread.
diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/profile_impl.cc
index 8cc2ec7..c585ebc 100644
--- a/chrome/browser/profiles/profile_impl.cc
+++ b/chrome/browser/profiles/profile_impl.cc
@@ -1500,8 +1500,7 @@ PrefProxyConfigTracker* ProfileImpl::GetProxyConfigTracker() {
}
PrerenderManager* ProfileImpl::GetPrerenderManager() {
- CommandLine* cl = CommandLine::ForCurrentProcess();
- if (!cl->HasSwitch(switches::kEnablePagePrerender))
+ if (!PrerenderManager::IsPrerenderingEnabled())
return NULL;
if (!prerender_manager_)
prerender_manager_ = new PrerenderManager(this);
diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc
index a53c979..182e9c9 100644
--- a/chrome/common/chrome_switches.cc
+++ b/chrome/common/chrome_switches.cc
@@ -208,11 +208,6 @@ const char kDisableBlockContentAnimation[] =
// exceeded.
const char kDisableConnectBackupJobs[] = "disable-connect-backup-jobs";
-// Disable requests that webkit labels TargetIsPrefetch. As of
-// writing only <link rel=prefetch...> but also eventually
-// Link: headers.
-const char kDisableContentPrefetch[] = "disable-content-prefetch";
-
// Disables the custom JumpList on Windows 7.
const char kDisableCustomJumpList[] = "disable-custom-jumplist";
@@ -480,11 +475,6 @@ const char kEnableConfirmToQuit[] = "enable-confirm-to-quit";
// exceeded.
const char kEnableConnectBackupJobs[] = "enable-connect-backup-jobs";
-// Enable requests that webkit labels TargetIsPrefetch. As of
-// writing only <link rel=prefetch...> but also eventually
-// Link: headers.
-const char kEnableContentPrefetch[] = "enable-content-prefetch";
-
// Enables web developers to create apps for Chrome without using crx packages.
const char kEnableCrxlessWebApps[] = "enable-crxless-web-apps";
@@ -562,9 +552,6 @@ const char kEnableRemoting[] = "enable-remoting";
const char kEnableResourceContentSettings[] =
"enable-resource-content-settings";
-// Enable speculative prerendering of pages.
-const char kEnablePagePrerender[] = "enable-page-prerender";
-
// Enable speculative TCP/IP preconnection.
const char kEnablePreconnect[] = "enable-preconnect";
@@ -944,6 +931,19 @@ const char kPpapiPluginProcess[] = "ppapi";
// Causes the PPAPI sub process to display a dialog on launch.
const char kPpapiStartupDialog[] = "ppapi-startup-dialog";
+// Controls speculative prerendering of pages, and content prefetching. Both
+// are dispatched from <link rel=prefetch href=...> elements.
+const char kPrerender[] = "prerender";
+// These are the values the switch may have, as in "--prerender=auto".
+// auto: Allow field trial selection in both prerender and prefetch.
+const char kPrerenderSwitchValueAuto[] = "auto";
+// disabled: No prerendering or prefetching.
+const char kPrerenderSwitchValueDisabled[] = "disabled";
+// enabled: Both prerendering and prefetching.
+const char kPrerenderSwitchValueEnabled[] = "enabled";
+// prefetch_only: No prerendering, but enable prefetching.
+const char kPrerenderSwitchValuePrefetchOnly[] = "prefetch_only";
+
// Prints the pages on the screen.
const char kPrint[] = "print";
diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h
index b2504e0..d18661f 100644
--- a/chrome/common/chrome_switches.h
+++ b/chrome/common/chrome_switches.h
@@ -67,7 +67,6 @@ extern const char kDisableBackgroundNetworking[];
extern const char kDisableBackingStoreLimit[];
extern const char kDisableBlockContentAnimation[];
extern const char kDisableConnectBackupJobs[];
-extern const char kDisableContentPrefetch[];
extern const char kDisableCustomJumpList[];
extern const char kDisableDatabases[];
extern const char kDisableDesktopNotifications[];
@@ -143,7 +142,6 @@ extern const char kEnableCloudPrintProxy[];
extern const char kEnableCloudPrint[];
extern const char kEnableConfirmToQuit[];
extern const char kEnableConnectBackupJobs[];
-extern const char kEnableContentPrefetch[];
extern const char kEnableCrxlessWebApps[];
extern const char kEnableDeviceMotion[];
extern const char kEnableDNSCertProvenanceChecking[];
@@ -163,7 +161,6 @@ extern const char kEnableMonitorProfile[];
extern const char kEnableNaCl[];
extern const char kEnableNaClDebug[];
extern const char kEnableNativeWebWorkers[];
-extern const char kEnablePagePrerender[];
extern const char kEnablePreconnect[];
extern const char kEnablePreparsedJsCaching[];
extern const char kEnablePrintPreview[];
@@ -270,6 +267,11 @@ extern const char kPpapiOutOfProcess[];
extern const char kPpapiPluginLauncher[];
extern const char kPpapiPluginProcess[];
extern const char kPpapiStartupDialog[];
+extern const char kPrerender[];
+extern const char kPrerenderSwitchValueAuto[];
+extern const char kPrerenderSwitchValueDisabled[];
+extern const char kPrerenderSwitchValueEnabled[];
+extern const char kPrerenderSwitchValuePrefetchOnly[];
extern const char kPrint[];
extern const char kProcessPerSite[];
extern const char kProcessPerTab[];