OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <deque> | 5 #include <deque> |
6 #include <vector> | 6 #include <vector> |
7 | 7 |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
(...skipping 12 matching lines...) Expand all Loading... |
23 #include "chrome/browser/browsing_data/browsing_data_helper.h" | 23 #include "chrome/browser/browsing_data/browsing_data_helper.h" |
24 #include "chrome/browser/browsing_data/browsing_data_remover.h" | 24 #include "chrome/browser/browsing_data/browsing_data_remover.h" |
25 #include "chrome/browser/browsing_data/browsing_data_remover_test_util.h" | 25 #include "chrome/browser/browsing_data/browsing_data_remover_test_util.h" |
26 #include "chrome/browser/chrome_content_browser_client.h" | 26 #include "chrome/browser/chrome_content_browser_client.h" |
27 #include "chrome/browser/chrome_notification_types.h" | 27 #include "chrome/browser/chrome_notification_types.h" |
28 #include "chrome/browser/content_settings/host_content_settings_map.h" | 28 #include "chrome/browser/content_settings/host_content_settings_map.h" |
29 #include "chrome/browser/extensions/api/web_navigation/web_navigation_api.h" | 29 #include "chrome/browser/extensions/api/web_navigation/web_navigation_api.h" |
30 #include "chrome/browser/extensions/extension_apitest.h" | 30 #include "chrome/browser/extensions/extension_apitest.h" |
31 #include "chrome/browser/external_protocol/external_protocol_handler.h" | 31 #include "chrome/browser/external_protocol/external_protocol_handler.h" |
32 #include "chrome/browser/favicon/favicon_tab_helper.h" | 32 #include "chrome/browser/favicon/favicon_tab_helper.h" |
| 33 #include "chrome/browser/net/prediction_options.h" |
33 #include "chrome/browser/predictors/autocomplete_action_predictor.h" | 34 #include "chrome/browser/predictors/autocomplete_action_predictor.h" |
34 #include "chrome/browser/predictors/autocomplete_action_predictor_factory.h" | 35 #include "chrome/browser/predictors/autocomplete_action_predictor_factory.h" |
35 #include "chrome/browser/prerender/prerender_contents.h" | 36 #include "chrome/browser/prerender/prerender_contents.h" |
| 37 #include "chrome/browser/prerender/prerender_field_trial.h" |
36 #include "chrome/browser/prerender/prerender_handle.h" | 38 #include "chrome/browser/prerender/prerender_handle.h" |
37 #include "chrome/browser/prerender/prerender_link_manager.h" | 39 #include "chrome/browser/prerender/prerender_link_manager.h" |
38 #include "chrome/browser/prerender/prerender_link_manager_factory.h" | 40 #include "chrome/browser/prerender/prerender_link_manager_factory.h" |
39 #include "chrome/browser/prerender/prerender_manager.h" | 41 #include "chrome/browser/prerender/prerender_manager.h" |
40 #include "chrome/browser/prerender/prerender_manager_factory.h" | 42 #include "chrome/browser/prerender/prerender_manager_factory.h" |
41 #include "chrome/browser/profiles/profile.h" | 43 #include "chrome/browser/profiles/profile.h" |
42 #include "chrome/browser/profiles/profile_io_data.h" | 44 #include "chrome/browser/profiles/profile_io_data.h" |
43 #include "chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.
h" | 45 #include "chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.
h" |
44 #include "chrome/browser/safe_browsing/database_manager.h" | 46 #include "chrome/browser/safe_browsing/database_manager.h" |
45 #include "chrome/browser/safe_browsing/safe_browsing_service.h" | 47 #include "chrome/browser/safe_browsing/safe_browsing_service.h" |
(...skipping 13 matching lines...) Expand all Loading... |
59 #include "chrome/browser/ui/tabs/tab_strip_model_observer.h" | 61 #include "chrome/browser/ui/tabs/tab_strip_model_observer.h" |
60 #include "chrome/common/chrome_paths.h" | 62 #include "chrome/common/chrome_paths.h" |
61 #include "chrome/common/chrome_switches.h" | 63 #include "chrome/common/chrome_switches.h" |
62 #include "chrome/common/extensions/extension_constants.h" | 64 #include "chrome/common/extensions/extension_constants.h" |
63 #include "chrome/common/extensions/manifest_handlers/mime_types_handler.h" | 65 #include "chrome/common/extensions/manifest_handlers/mime_types_handler.h" |
64 #include "chrome/common/pref_names.h" | 66 #include "chrome/common/pref_names.h" |
65 #include "chrome/grit/generated_resources.h" | 67 #include "chrome/grit/generated_resources.h" |
66 #include "chrome/test/base/in_process_browser_test.h" | 68 #include "chrome/test/base/in_process_browser_test.h" |
67 #include "chrome/test/base/test_switches.h" | 69 #include "chrome/test/base/test_switches.h" |
68 #include "chrome/test/base/ui_test_utils.h" | 70 #include "chrome/test/base/ui_test_utils.h" |
| 71 #include "components/variations/entropy_provider.h" |
| 72 #include "components/variations/variations_associated_data.h" |
69 #include "content/public/browser/browser_message_filter.h" | 73 #include "content/public/browser/browser_message_filter.h" |
70 #include "content/public/browser/devtools_agent_host.h" | 74 #include "content/public/browser/devtools_agent_host.h" |
71 #include "content/public/browser/navigation_controller.h" | 75 #include "content/public/browser/navigation_controller.h" |
72 #include "content/public/browser/navigation_entry.h" | 76 #include "content/public/browser/navigation_entry.h" |
73 #include "content/public/browser/notification_service.h" | 77 #include "content/public/browser/notification_service.h" |
74 #include "content/public/browser/render_frame_host.h" | 78 #include "content/public/browser/render_frame_host.h" |
75 #include "content/public/browser/render_process_host.h" | 79 #include "content/public/browser/render_process_host.h" |
76 #include "content/public/browser/render_view_host.h" | 80 #include "content/public/browser/render_view_host.h" |
77 #include "content/public/browser/site_instance.h" | 81 #include "content/public/browser/site_instance.h" |
78 #include "content/public/browser/web_contents.h" | 82 #include "content/public/browser/web_contents.h" |
(...skipping 12 matching lines...) Expand all Loading... |
91 #include "net/ssl/ssl_cert_request_info.h" | 95 #include "net/ssl/ssl_cert_request_info.h" |
92 #include "net/test/url_request/url_request_mock_http_job.h" | 96 #include "net/test/url_request/url_request_mock_http_job.h" |
93 #include "net/url_request/url_request_context.h" | 97 #include "net/url_request/url_request_context.h" |
94 #include "net/url_request/url_request_context_getter.h" | 98 #include "net/url_request/url_request_context_getter.h" |
95 #include "net/url_request/url_request_filter.h" | 99 #include "net/url_request/url_request_filter.h" |
96 #include "net/url_request/url_request_interceptor.h" | 100 #include "net/url_request/url_request_interceptor.h" |
97 #include "net/url_request/url_request_job.h" | 101 #include "net/url_request/url_request_job.h" |
98 #include "ui/base/l10n/l10n_util.h" | 102 #include "ui/base/l10n/l10n_util.h" |
99 #include "url/gurl.h" | 103 #include "url/gurl.h" |
100 | 104 |
| 105 using chrome_browser_net::NetworkPredictionOptions; |
101 using content::BrowserThread; | 106 using content::BrowserThread; |
102 using content::DevToolsAgentHost; | 107 using content::DevToolsAgentHost; |
103 using content::NavigationController; | 108 using content::NavigationController; |
104 using content::OpenURLParams; | 109 using content::OpenURLParams; |
105 using content::Referrer; | 110 using content::Referrer; |
106 using content::RenderFrameHost; | 111 using content::RenderFrameHost; |
107 using content::RenderViewHost; | 112 using content::RenderViewHost; |
108 using content::RenderWidgetHost; | 113 using content::RenderWidgetHost; |
109 using content::TestNavigationObserver; | 114 using content::TestNavigationObserver; |
110 using content::WebContents; | 115 using content::WebContents; |
111 using content::WebContentsObserver; | 116 using content::WebContentsObserver; |
| 117 using net::NetworkChangeNotifier; |
112 using task_manager::browsertest_util::WaitForTaskManagerRows; | 118 using task_manager::browsertest_util::WaitForTaskManagerRows; |
113 | 119 |
114 // Prerender tests work as follows: | 120 // Prerender tests work as follows: |
115 // | 121 // |
116 // A page with a prefetch link to the test page is loaded. Once prerendered, | 122 // A page with a prefetch link to the test page is loaded. Once prerendered, |
117 // its Javascript function DidPrerenderPass() is called, which returns true if | 123 // its Javascript function DidPrerenderPass() is called, which returns true if |
118 // the page behaves as expected when prerendered. | 124 // the page behaves as expected when prerendered. |
119 // | 125 // |
120 // The prerendered page is then displayed on a tab. The Javascript function | 126 // The prerendered page is then displayed on a tab. The Javascript function |
121 // DidDisplayPass() is called, and returns true if the page behaved as it | 127 // DidDisplayPass() is called, and returns true if the page behaved as it |
122 // should while being displayed. | 128 // should while being displayed. |
123 | 129 |
124 namespace prerender { | 130 namespace prerender { |
125 | 131 |
126 namespace { | 132 namespace { |
127 | 133 |
| 134 class MockNetworkChangeNotifierWIFI : public NetworkChangeNotifier { |
| 135 public: |
| 136 virtual ConnectionType GetCurrentConnectionType() const OVERRIDE { |
| 137 return NetworkChangeNotifier::CONNECTION_WIFI; |
| 138 } |
| 139 }; |
| 140 |
| 141 class MockNetworkChangeNotifier4G : public NetworkChangeNotifier { |
| 142 public: |
| 143 virtual ConnectionType GetCurrentConnectionType() const OVERRIDE { |
| 144 return NetworkChangeNotifier::CONNECTION_4G; |
| 145 } |
| 146 }; |
| 147 |
128 // Constants used in the test HTML files. | 148 // Constants used in the test HTML files. |
129 const char* kReadyTitle = "READY"; | 149 const char* kReadyTitle = "READY"; |
130 const char* kPassTitle = "PASS"; | 150 const char* kPassTitle = "PASS"; |
131 | 151 |
132 std::string CreateClientRedirect(const std::string& dest_url) { | 152 std::string CreateClientRedirect(const std::string& dest_url) { |
133 const char* const kClientRedirectBase = "client-redirect?"; | 153 const char* const kClientRedirectBase = "client-redirect?"; |
134 return kClientRedirectBase + net::EscapeQueryParamValue(dest_url, false); | 154 return kClientRedirectBase + net::EscapeQueryParamValue(dest_url, false); |
135 } | 155 } |
136 | 156 |
137 std::string CreateServerRedirect(const std::string& dest_url) { | 157 std::string CreateServerRedirect(const std::string& dest_url) { |
(...skipping 925 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1063 // explicitly registered. | 1083 // explicitly registered. |
1064 base::FilePath app_dir; | 1084 base::FilePath app_dir; |
1065 PathService::Get(chrome::DIR_APP, &app_dir); | 1085 PathService::Get(chrome::DIR_APP, &app_dir); |
1066 command_line->AppendSwitchPath( | 1086 command_line->AppendSwitchPath( |
1067 switches::kExtraPluginDir, | 1087 switches::kExtraPluginDir, |
1068 app_dir.Append(FILE_PATH_LITERAL("plugins"))); | 1088 app_dir.Append(FILE_PATH_LITERAL("plugins"))); |
1069 #endif | 1089 #endif |
1070 command_line->AppendSwitch(switches::kAlwaysAuthorizePlugins); | 1090 command_line->AppendSwitch(switches::kAlwaysAuthorizePlugins); |
1071 } | 1091 } |
1072 | 1092 |
| 1093 void SetPreference(NetworkPredictionOptions value) { |
| 1094 browser()->profile()->GetPrefs()->SetInteger( |
| 1095 prefs::kNetworkPredictionOptions, value); |
| 1096 } |
| 1097 |
| 1098 void CreateTestFieldTrial(const std::string& name, |
| 1099 const std::string& group_name) { |
| 1100 base::FieldTrial* trial = base::FieldTrialList::CreateFieldTrial( |
| 1101 name, group_name); |
| 1102 trial->group(); |
| 1103 } |
| 1104 |
| 1105 // Verifies, for the current field trial, whether |
| 1106 // ShouldDisableLocalPredictorDueToPreferencesAndNetwork produces the desired |
| 1107 // output. |
| 1108 void TestShouldDisableLocalPredictorPreferenceNetworkMatrix( |
| 1109 bool preference_wifi_network_wifi, |
| 1110 bool preference_wifi_network_4g, |
| 1111 bool preference_always_network_wifi, |
| 1112 bool preference_always_network_4g, |
| 1113 bool preference_never_network_wifi, |
| 1114 bool preference_never_network_4g) { |
| 1115 Profile* profile = browser()->profile(); |
| 1116 |
| 1117 // Set real NetworkChangeNotifier singleton aside. |
| 1118 scoped_ptr<NetworkChangeNotifier::DisableForTest> disable_for_test( |
| 1119 new NetworkChangeNotifier::DisableForTest); |
| 1120 |
| 1121 // Set preference to WIFI_ONLY: prefetch when not on cellular. |
| 1122 SetPreference(NetworkPredictionOptions::NETWORK_PREDICTION_WIFI_ONLY); |
| 1123 { |
| 1124 scoped_ptr<NetworkChangeNotifier> mock(new MockNetworkChangeNotifierWIFI); |
| 1125 EXPECT_EQ( |
| 1126 ShouldDisableLocalPredictorDueToPreferencesAndNetwork(profile), |
| 1127 preference_wifi_network_wifi); |
| 1128 } |
| 1129 { |
| 1130 scoped_ptr<NetworkChangeNotifier> mock(new MockNetworkChangeNotifier4G); |
| 1131 EXPECT_EQ( |
| 1132 ShouldDisableLocalPredictorDueToPreferencesAndNetwork(profile), |
| 1133 preference_wifi_network_4g); |
| 1134 } |
| 1135 |
| 1136 // Set preference to ALWAYS: always prefetch. |
| 1137 SetPreference(NetworkPredictionOptions::NETWORK_PREDICTION_ALWAYS); |
| 1138 { |
| 1139 scoped_ptr<NetworkChangeNotifier> mock(new MockNetworkChangeNotifierWIFI); |
| 1140 EXPECT_EQ( |
| 1141 ShouldDisableLocalPredictorDueToPreferencesAndNetwork(profile), |
| 1142 preference_always_network_wifi); |
| 1143 } |
| 1144 { |
| 1145 scoped_ptr<NetworkChangeNotifier> mock(new MockNetworkChangeNotifier4G); |
| 1146 EXPECT_EQ( |
| 1147 ShouldDisableLocalPredictorDueToPreferencesAndNetwork(profile), |
| 1148 preference_always_network_4g); |
| 1149 } |
| 1150 |
| 1151 // Set preference to NEVER: never prefetch. |
| 1152 SetPreference(NetworkPredictionOptions::NETWORK_PREDICTION_NEVER); |
| 1153 { |
| 1154 scoped_ptr<NetworkChangeNotifier> mock(new MockNetworkChangeNotifierWIFI); |
| 1155 EXPECT_EQ( |
| 1156 ShouldDisableLocalPredictorDueToPreferencesAndNetwork(profile), |
| 1157 preference_never_network_wifi); |
| 1158 } |
| 1159 { |
| 1160 scoped_ptr<NetworkChangeNotifier> mock(new MockNetworkChangeNotifier4G); |
| 1161 EXPECT_EQ( |
| 1162 ShouldDisableLocalPredictorDueToPreferencesAndNetwork(profile), |
| 1163 preference_never_network_4g); |
| 1164 } |
| 1165 } |
| 1166 |
1073 virtual void SetUpOnMainThread() OVERRIDE { | 1167 virtual void SetUpOnMainThread() OVERRIDE { |
1074 current_browser()->profile()->GetPrefs()->SetBoolean( | 1168 current_browser()->profile()->GetPrefs()->SetBoolean( |
1075 prefs::kPromptForDownload, false); | 1169 prefs::kPromptForDownload, false); |
1076 IncreasePrerenderMemory(); | 1170 IncreasePrerenderMemory(); |
1077 if (autostart_test_server_) | 1171 if (autostart_test_server_) |
1078 ASSERT_TRUE(test_server()->Start()); | 1172 ASSERT_TRUE(test_server()->Start()); |
1079 ChromeResourceDispatcherHostDelegate:: | 1173 ChromeResourceDispatcherHostDelegate:: |
1080 SetExternalProtocolHandlerDelegateForTesting( | 1174 SetExternalProtocolHandlerDelegateForTesting( |
1081 &external_protocol_handler_delegate_); | 1175 &external_protocol_handler_delegate_); |
1082 | 1176 |
(...skipping 579 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1662 NeverRunsExternalProtocolHandlerDelegate external_protocol_handler_delegate_; | 1756 NeverRunsExternalProtocolHandlerDelegate external_protocol_handler_delegate_; |
1663 GURL dest_url_; | 1757 GURL dest_url_; |
1664 scoped_ptr<net::SpawnedTestServer> https_src_server_; | 1758 scoped_ptr<net::SpawnedTestServer> https_src_server_; |
1665 bool call_javascript_; | 1759 bool call_javascript_; |
1666 bool check_load_events_; | 1760 bool check_load_events_; |
1667 std::string loader_host_override_; | 1761 std::string loader_host_override_; |
1668 std::string loader_path_; | 1762 std::string loader_path_; |
1669 std::string loader_query_; | 1763 std::string loader_query_; |
1670 Browser* explicitly_set_browser_; | 1764 Browser* explicitly_set_browser_; |
1671 base::HistogramTester histogram_tester_; | 1765 base::HistogramTester histogram_tester_; |
| 1766 scoped_ptr<base::FieldTrialList> field_trial_list_; |
1672 }; | 1767 }; |
1673 | 1768 |
1674 // Checks that a page is correctly prerendered in the case of a | 1769 // Checks that a page is correctly prerendered in the case of a |
1675 // <link rel=prerender> tag and then loaded into a tab in response to a | 1770 // <link rel=prerender> tag and then loaded into a tab in response to a |
1676 // navigation. | 1771 // navigation. |
1677 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPage) { | 1772 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPage) { |
1678 PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); | 1773 PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1); |
1679 EXPECT_EQ(1, GetPrerenderDomContentLoadedEventCountForLinkNumber(0)); | 1774 EXPECT_EQ(1, GetPrerenderDomContentLoadedEventCountForLinkNumber(0)); |
1680 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 1); | 1775 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLT", 1); |
1681 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); | 1776 histogram_tester().ExpectTotalCount("Prerender.none_PerceivedPLTMatched", 0); |
(...skipping 2764 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4446 prerender->contents()->set_skip_final_checks(true); | 4541 prerender->contents()->set_skip_final_checks(true); |
4447 | 4542 |
4448 // Navigate to the URL entered. | 4543 // Navigate to the URL entered. |
4449 omnibox_view->model()->AcceptInput(CURRENT_TAB, false); | 4544 omnibox_view->model()->AcceptInput(CURRENT_TAB, false); |
4450 | 4545 |
4451 // Prerender should be running, but abandoned. | 4546 // Prerender should be running, but abandoned. |
4452 EXPECT_TRUE( | 4547 EXPECT_TRUE( |
4453 GetAutocompleteActionPredictor()->IsPrerenderAbandonedForTesting()); | 4548 GetAutocompleteActionPredictor()->IsPrerenderAbandonedForTesting()); |
4454 } | 4549 } |
4455 | 4550 |
| 4551 // Prefetch should be allowed depending on preference and network type. |
| 4552 // This test is for the bsae case: no Finch overrides should never disable. |
| 4553 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| 4554 LocalPredictorDisableWorksBaseCase) { |
| 4555 TestShouldDisableLocalPredictorPreferenceNetworkMatrix( |
| 4556 false /*preference_wifi_network_wifi*/, |
| 4557 false /*preference_wifi_network_4g*/, |
| 4558 false /*preference_always_network_wifi*/, |
| 4559 false /*preference_always_network_4g*/, |
| 4560 false /*preference_never_network_wifi*/, |
| 4561 false /*preference_never_network_4g*/); |
| 4562 } |
| 4563 |
| 4564 // Prefetch should be allowed depending on preference and network type. |
| 4565 // LocalPredictorOnCellularOnly should disable all wifi cases. |
| 4566 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| 4567 LocalPredictorDisableWorksCellularOnly) { |
| 4568 CreateTestFieldTrial("PrerenderLocalPredictorSpec", |
| 4569 "LocalPredictorOnCellularOnly=Enabled"); |
| 4570 TestShouldDisableLocalPredictorPreferenceNetworkMatrix( |
| 4571 true /*preference_wifi_network_wifi*/, |
| 4572 false /*preference_wifi_network_4g*/, |
| 4573 true /*preference_always_network_wifi*/, |
| 4574 false /*preference_always_network_4g*/, |
| 4575 true /*preference_never_network_wifi*/, |
| 4576 false /*preference_never_network_4g*/); |
| 4577 } |
| 4578 |
| 4579 // Prefetch should be allowed depending on preference and network type. |
| 4580 // LocalPredictorNetworkPredictionEnabledOnly should disable whenever |
| 4581 // network predictions will not be exercised. |
| 4582 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| 4583 LocalPredictorDisableWorksNetworkPredictionEnableOnly) { |
| 4584 CreateTestFieldTrial("PrerenderLocalPredictorSpec", |
| 4585 "LocalPredictorNetworkPredictionEnabledOnly=Enabled"); |
| 4586 TestShouldDisableLocalPredictorPreferenceNetworkMatrix( |
| 4587 false /*preference_wifi_network_wifi*/, |
| 4588 true /*preference_wifi_network_4g*/, |
| 4589 false /*preference_always_network_wifi*/, |
| 4590 false /*preference_always_network_4g*/, |
| 4591 true /*preference_never_network_wifi*/, |
| 4592 true /*preference_never_network_4g*/); |
| 4593 } |
| 4594 |
| 4595 // Prefetch should be allowed depending on preference and network type. |
| 4596 // If LocalPredictorNetworkPredictionEnabledOnly and |
| 4597 // LocalPredictorOnCellularOnly are both selected, we must disable whenever |
| 4598 // network predictions are not exercised, or when we are on wifi. |
| 4599 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
| 4600 LocalPredictorDisableWorksBothOptions) { |
| 4601 CreateTestFieldTrial("PrerenderLocalPredictorSpec", |
| 4602 "LocalPredictorOnCellularOnly=Enabled:" |
| 4603 "LocalPredictorNetworkPredictionEnabledOnly=Enabled"); |
| 4604 TestShouldDisableLocalPredictorPreferenceNetworkMatrix( |
| 4605 true /*preference_wifi_network_wifi*/, |
| 4606 true /*preference_wifi_network_4g*/, |
| 4607 true /*preference_always_network_wifi*/, |
| 4608 false /*preference_always_network_4g*/, |
| 4609 true /*preference_never_network_wifi*/, |
| 4610 true /*preference_never_network_4g*/); |
| 4611 } |
| 4612 |
4456 } // namespace prerender | 4613 } // namespace prerender |
OLD | NEW |