diff options
author | gavinp@chromium.org <gavinp@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-12 23:45:15 +0000 |
---|---|---|
committer | gavinp@chromium.org <gavinp@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-12 23:45:15 +0000 |
commit | 0e6f56d09ae4323ce7a8ac65f367524b05d22e11 (patch) | |
tree | 62be0d0889b41eb05d8768404cdc0e8abe3b2ef2 /chrome | |
parent | 9a55bb981e5f390f796912bab0f58f5443112674 (diff) | |
download | chromium_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.grd | 15 | ||||
-rw-r--r-- | chrome/browser/about_flags.cc | 12 | ||||
-rw-r--r-- | chrome/browser/browser_main.cc | 95 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_browsertest.cc | 3 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_manager.cc | 7 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_manager.h | 1 | ||||
-rw-r--r-- | chrome/browser/profiles/profile_impl.cc | 3 | ||||
-rw-r--r-- | chrome/common/chrome_switches.cc | 26 | ||||
-rw-r--r-- | chrome/common/chrome_switches.h | 8 |
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[]; |