OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 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 "chrome/browser/search/search.h" | 5 #include "chrome/browser/search/search.h" |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/metrics/field_trial.h" | 8 #include "base/metrics/field_trial.h" |
9 #include "base/metrics/histogram.h" | |
10 #include "base/prefs/pref_service.h" | 9 #include "base/prefs/pref_service.h" |
11 #include "base/rand_util.h" | 10 #include "base/rand_util.h" |
12 #include "base/strings/string_number_conversions.h" | 11 #include "base/strings/string_number_conversions.h" |
13 #include "base/strings/string_split.h" | 12 #include "base/strings/string_split.h" |
14 #include "base/strings/utf_string_conversions.h" | 13 #include "base/strings/utf_string_conversions.h" |
15 #include "chrome/browser/browser_process.h" | 14 #include "chrome/browser/browser_process.h" |
16 #include "chrome/browser/google/google_util.h" | 15 #include "chrome/browser/google/google_util.h" |
17 #include "chrome/browser/profiles/profile.h" | 16 #include "chrome/browser/profiles/profile.h" |
18 #include "chrome/browser/profiles/profile_manager.h" | 17 #include "chrome/browser/profiles/profile_manager.h" |
19 #include "chrome/browser/search/instant_service.h" | 18 #include "chrome/browser/search/instant_service.h" |
(...skipping 26 matching lines...) Expand all Loading... |
46 namespace { | 45 namespace { |
47 | 46 |
48 // Configuration options for Embedded Search. | 47 // Configuration options for Embedded Search. |
49 // EmbeddedSearch field trials are named in such a way that we can parse out | 48 // EmbeddedSearch field trials are named in such a way that we can parse out |
50 // the experiment configuration from the trial's group name in order to give | 49 // the experiment configuration from the trial's group name in order to give |
51 // us maximum flexability in running experiments. | 50 // us maximum flexability in running experiments. |
52 // Field trial groups should be named things like "Group7 espv:2 instant:1". | 51 // Field trial groups should be named things like "Group7 espv:2 instant:1". |
53 // The first token is always GroupN for some integer N, followed by a | 52 // The first token is always GroupN for some integer N, followed by a |
54 // space-delimited list of key:value pairs which correspond to these flags: | 53 // space-delimited list of key:value pairs which correspond to these flags: |
55 const char kEmbeddedPageVersionFlagName[] = "espv"; | 54 const char kEmbeddedPageVersionFlagName[] = "espv"; |
56 const uint64 kEmbeddedPageVersionDisabled = 0; | |
57 #if defined(OS_IOS) || defined(OS_ANDROID) | 55 #if defined(OS_IOS) || defined(OS_ANDROID) |
58 const uint64 kEmbeddedPageVersionDefault = 1; | 56 const uint64 kEmbeddedPageVersionDefault = 1; |
59 #else | 57 #else |
60 const uint64 kEmbeddedPageVersionDefault = 2; | 58 const uint64 kEmbeddedPageVersionDefault = 2; |
61 #endif | 59 #endif |
62 | 60 |
63 // The staleness timeout can be set (in seconds) via this config. | 61 // The staleness timeout can be set (in seconds) via this config. |
64 const char kStalePageTimeoutFlagName[] = "stale"; | 62 const char kStalePageTimeoutFlagName[] = "stale"; |
65 const int kStalePageTimeoutDefault = 3 * 3600; // 3 hours. | 63 const int kStalePageTimeoutDefault = 3 * 3600; // 3 hours. |
66 | 64 |
67 const char kHideVerbatimFlagName[] = "hide_verbatim"; | 65 const char kHideVerbatimFlagName[] = "hide_verbatim"; |
68 const char kUseRemoteNTPOnStartupFlagName[] = "use_remote_ntp_on_startup"; | 66 const char kUseRemoteNTPOnStartupFlagName[] = "use_remote_ntp_on_startup"; |
69 const char kShowNtpFlagName[] = "show_ntp"; | 67 const char kShowNtpFlagName[] = "show_ntp"; |
70 const char kRecentTabsOnNTPFlagName[] = "show_recent_tabs"; | 68 const char kRecentTabsOnNTPFlagName[] = "show_recent_tabs"; |
71 const char kUseCacheableNTP[] = "use_cacheable_ntp"; | 69 const char kUseCacheableNTP[] = "use_cacheable_ntp"; |
72 const char kPrefetchSearchResultsFlagName[] = "prefetch_results"; | 70 const char kPrefetchSearchResultsFlagName[] = "prefetch_results"; |
73 const char kPrefetchSearchResultsOnSRP[] = "prefetch_results_srp"; | 71 const char kPrefetchSearchResultsOnSRP[] = "prefetch_results_srp"; |
74 const char kSuppressInstantExtendedOnSRPFlagName[] = "suppress_on_srp"; | |
75 const char kDisplaySearchButtonFlagName[] = "display_search_button"; | 72 const char kDisplaySearchButtonFlagName[] = "display_search_button"; |
76 const char kEnableOriginChipFlagName[] = "origin_chip"; | 73 const char kEnableOriginChipFlagName[] = "origin_chip"; |
| 74 #if !defined(OS_IOS) && !defined(OS_ANDROID) |
| 75 const char kEnableQueryExtractionFlagName[] = "query_extraction"; |
| 76 #endif |
77 | 77 |
78 // Constants for the field trial name and group prefix. | 78 // Constants for the field trial name and group prefix. |
79 // Note in M30 and below this field trial was named "InstantExtended" and in | 79 // Note in M30 and below this field trial was named "InstantExtended" and in |
80 // M31 was renamed to EmbeddedSearch for clarity and cleanliness. Since we | 80 // M31 was renamed to EmbeddedSearch for clarity and cleanliness. Since we |
81 // can't easilly sync up Finch configs with the pushing of this change to | 81 // can't easilly sync up Finch configs with the pushing of this change to |
82 // Dev & Canary, for now the code accepts both names. | 82 // Dev & Canary, for now the code accepts both names. |
83 // TODO(dcblack): Remove the InstantExtended name once M31 hits the Beta | 83 // TODO(dcblack): Remove the InstantExtended name once M31 hits the Beta |
84 // channel. | 84 // channel. |
85 const char kInstantExtendedFieldTrialName[] = "InstantExtended"; | 85 const char kInstantExtendedFieldTrialName[] = "InstantExtended"; |
86 const char kEmbeddedSearchFieldTrialName[] = "EmbeddedSearch"; | 86 const char kEmbeddedSearchFieldTrialName[] = "EmbeddedSearch"; |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 TemplateURLRef ref(template_url, i); | 154 TemplateURLRef ref(template_url, i); |
155 search_url = TemplateURLRefToGURL(ref, kDisableStartMargin, false, false); | 155 search_url = TemplateURLRefToGURL(ref, kDisableStartMargin, false, false); |
156 if (search_url.is_valid() && | 156 if (search_url.is_valid() && |
157 search::MatchesOriginAndPath(url, search_url)) | 157 search::MatchesOriginAndPath(url, search_url)) |
158 return true; | 158 return true; |
159 } | 159 } |
160 | 160 |
161 return false; | 161 return false; |
162 } | 162 } |
163 | 163 |
164 void RecordInstantExtendedOptInState() { | |
165 if (instant_extended_opt_in_state_gate) | |
166 return; | |
167 | |
168 instant_extended_opt_in_state_gate = true; | |
169 OptInState state = INSTANT_EXTENDED_NOT_SET; | |
170 const CommandLine* command_line = CommandLine::ForCurrentProcess(); | |
171 if (command_line->HasSwitch(switches::kDisableInstantExtendedAPI)) | |
172 state = INSTANT_EXTENDED_OPT_OUT; | |
173 else if (command_line->HasSwitch(switches::kEnableInstantExtendedAPI)) | |
174 state = INSTANT_EXTENDED_OPT_IN; | |
175 | |
176 UMA_HISTOGRAM_ENUMERATION("InstantExtended.NewOptInState", state, | |
177 INSTANT_EXTENDED_OPT_IN_STATE_ENUM_COUNT); | |
178 } | |
179 | |
180 // Returns true if |contents| is rendered inside the Instant process for | 164 // Returns true if |contents| is rendered inside the Instant process for |
181 // |profile|. | 165 // |profile|. |
182 bool IsRenderedInInstantProcess(const content::WebContents* contents, | 166 bool IsRenderedInInstantProcess(const content::WebContents* contents, |
183 Profile* profile) { | 167 Profile* profile) { |
184 const content::RenderProcessHost* process_host = | 168 const content::RenderProcessHost* process_host = |
185 contents->GetRenderProcessHost(); | 169 contents->GetRenderProcessHost(); |
186 if (!process_host) | 170 if (!process_host) |
187 return false; | 171 return false; |
188 | 172 |
189 const InstantService* instant_service = | 173 const InstantService* instant_service = |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
229 | 213 |
230 const TemplateURLRef& instant_url_ref = template_url->instant_url_ref(); | 214 const TemplateURLRef& instant_url_ref = template_url->instant_url_ref(); |
231 const GURL instant_url = | 215 const GURL instant_url = |
232 TemplateURLRefToGURL(instant_url_ref, kDisableStartMargin, false, false); | 216 TemplateURLRefToGURL(instant_url_ref, kDisableStartMargin, false, false); |
233 if (!instant_url.is_valid()) | 217 if (!instant_url.is_valid()) |
234 return false; | 218 return false; |
235 | 219 |
236 if (search::MatchesOriginAndPath(url, instant_url)) | 220 if (search::MatchesOriginAndPath(url, instant_url)) |
237 return true; | 221 return true; |
238 | 222 |
239 return !ShouldSuppressInstantExtendedOnSRP() && | 223 return IsQueryExtractionEnabled() && MatchesAnySearchURL(url, template_url); |
240 MatchesAnySearchURL(url, template_url); | |
241 } | 224 } |
242 | 225 |
243 string16 GetSearchTermsImpl(const content::WebContents* contents, | 226 string16 GetSearchTermsImpl(const content::WebContents* contents, |
244 const content::NavigationEntry* entry) { | 227 const content::NavigationEntry* entry) { |
245 if (!contents || !IsQueryExtractionEnabled()) | 228 if (!contents || !IsQueryExtractionEnabled()) |
246 return string16(); | 229 return string16(); |
247 | 230 |
248 // For security reasons, don't extract search terms if the page is not being | 231 // For security reasons, don't extract search terms if the page is not being |
249 // rendered in the privileged Instant renderer process. This is to protect | 232 // rendered in the privileged Instant renderer process. This is to protect |
250 // against a malicious page somehow scripting the search results page and | 233 // against a malicious page somehow scripting the search results page and |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
285 | 268 |
286 } // namespace | 269 } // namespace |
287 | 270 |
288 // Negative start-margin values prevent the "es_sm" parameter from being used. | 271 // Negative start-margin values prevent the "es_sm" parameter from being used. |
289 const int kDisableStartMargin = -1; | 272 const int kDisableStartMargin = -1; |
290 | 273 |
291 bool IsInstantExtendedAPIEnabled() { | 274 bool IsInstantExtendedAPIEnabled() { |
292 #if defined(OS_IOS) || defined(OS_ANDROID) | 275 #if defined(OS_IOS) || defined(OS_ANDROID) |
293 return false; | 276 return false; |
294 #else | 277 #else |
295 RecordInstantExtendedOptInState(); | 278 return true; |
296 return EmbeddedSearchPageVersion() != kEmbeddedPageVersionDisabled; | |
297 #endif // defined(OS_IOS) || defined(OS_ANDROID) | 279 #endif // defined(OS_IOS) || defined(OS_ANDROID) |
298 } | 280 } |
299 | 281 |
300 // Determine what embedded search page version to request from the user's | 282 // Determine what embedded search page version to request from the user's |
301 // default search provider. If 0, the embedded search UI should not be enabled. | 283 // default search provider. If 0, the embedded search UI should not be enabled. |
302 uint64 EmbeddedSearchPageVersion() { | 284 uint64 EmbeddedSearchPageVersion() { |
303 RecordInstantExtendedOptInState(); | |
304 | |
305 // Check the command-line/about:flags setting first, which should have | |
306 // precedence and allows the trial to not be reported (if it's never queried). | |
307 const CommandLine* command_line = CommandLine::ForCurrentProcess(); | |
308 if (command_line->HasSwitch(switches::kDisableInstantExtendedAPI)) | |
309 return kEmbeddedPageVersionDisabled; | |
310 if (command_line->HasSwitch(switches::kEnableInstantExtendedAPI)) { | |
311 // The user has set the about:flags switch to Enabled - give the default | |
312 // UI version. | |
313 return kEmbeddedPageVersionDefault; | |
314 } | |
315 | |
316 FieldTrialFlags flags; | 285 FieldTrialFlags flags; |
317 uint64 group_num = 0; | 286 if (GetFieldTrialInfo(&flags, NULL)) { |
318 if (GetFieldTrialInfo(&flags, &group_num)) { | |
319 if (group_num == 0) | |
320 return kEmbeddedPageVersionDefault; | |
321 return GetUInt64ValueForFlagWithDefault(kEmbeddedPageVersionFlagName, | 287 return GetUInt64ValueForFlagWithDefault(kEmbeddedPageVersionFlagName, |
322 kEmbeddedPageVersionDefault, | 288 kEmbeddedPageVersionDefault, |
323 flags); | 289 flags); |
324 } | 290 } |
325 return kEmbeddedPageVersionDefault; | 291 return kEmbeddedPageVersionDefault; |
326 } | 292 } |
327 | 293 |
328 bool IsQueryExtractionEnabled() { | 294 bool IsQueryExtractionEnabled() { |
329 return EmbeddedSearchPageVersion() != kEmbeddedPageVersionDisabled && | 295 #if defined(OS_IOS) || defined(OS_ANDROID) |
330 !ShouldSuppressInstantExtendedOnSRP(); | 296 return true; |
| 297 #else |
| 298 if (!IsInstantExtendedAPIEnabled()) |
| 299 return false; |
| 300 |
| 301 const CommandLine* command_line = CommandLine::ForCurrentProcess(); |
| 302 if (command_line->HasSwitch(switches::kEnableQueryExtraction)) |
| 303 return true; |
| 304 |
| 305 FieldTrialFlags flags; |
| 306 return GetFieldTrialInfo(&flags, NULL) && GetBoolValueForFlagWithDefault( |
| 307 kEnableQueryExtractionFlagName, false, flags); |
| 308 #endif // defined(OS_IOS) || defined(OS_ANDROID) |
331 } | 309 } |
332 | 310 |
333 string16 GetSearchTermsFromURL(Profile* profile, const GURL& url) { | 311 string16 GetSearchTermsFromURL(Profile* profile, const GURL& url) { |
334 string16 search_terms; | 312 string16 search_terms; |
335 TemplateURL* template_url = GetDefaultSearchProviderTemplateURL(profile); | 313 TemplateURL* template_url = GetDefaultSearchProviderTemplateURL(profile); |
336 if (template_url && IsSuitableURLForInstant(url, template_url)) | 314 if (template_url && IsSuitableURLForInstant(url, template_url)) |
337 template_url->ExtractSearchTermsFromURL(url, &search_terms); | 315 template_url->ExtractSearchTermsFromURL(url, &search_terms); |
338 return search_terms; | 316 return search_terms; |
339 } | 317 } |
340 | 318 |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
512 FieldTrialFlags flags; | 490 FieldTrialFlags flags; |
513 return GetFieldTrialInfo(&flags, NULL) && GetBoolValueForFlagWithDefault( | 491 return GetFieldTrialInfo(&flags, NULL) && GetBoolValueForFlagWithDefault( |
514 kPrefetchSearchResultsFlagName, false, flags); | 492 kPrefetchSearchResultsFlagName, false, flags); |
515 } | 493 } |
516 | 494 |
517 GURL GetLocalInstantURL(Profile* profile) { | 495 GURL GetLocalInstantURL(Profile* profile) { |
518 return GURL(chrome::kChromeSearchLocalNtpUrl); | 496 return GURL(chrome::kChromeSearchLocalNtpUrl); |
519 } | 497 } |
520 | 498 |
521 bool ShouldPreferRemoteNTPOnStartup() { | 499 bool ShouldPreferRemoteNTPOnStartup() { |
522 // Check the command-line/about:flags setting first, which should have | 500 CommandLine* command_line = CommandLine::ForCurrentProcess(); |
523 // precedence and allows the trial to not be reported (if it's never queried). | |
524 const CommandLine* command_line = CommandLine::ForCurrentProcess(); | |
525 if (command_line->HasSwitch(switches::kDisableInstantExtendedAPI) || | |
526 command_line->HasSwitch(switches::kEnableLocalFirstLoadNTP)) { | |
527 return false; | |
528 } | |
529 if (command_line->HasSwitch(switches::kDisableLocalFirstLoadNTP)) | 501 if (command_line->HasSwitch(switches::kDisableLocalFirstLoadNTP)) |
530 return true; | 502 return true; |
531 | 503 |
532 FieldTrialFlags flags; | 504 FieldTrialFlags flags; |
533 return GetFieldTrialInfo(&flags, NULL) && GetBoolValueForFlagWithDefault( | 505 return GetFieldTrialInfo(&flags, NULL) && GetBoolValueForFlagWithDefault( |
534 kUseRemoteNTPOnStartupFlagName, true, flags); | 506 kUseRemoteNTPOnStartupFlagName, true, flags); |
535 } | 507 } |
536 | 508 |
537 bool ShouldHideTopVerbatimMatch() { | 509 bool ShouldHideTopVerbatimMatch() { |
538 FieldTrialFlags flags; | 510 FieldTrialFlags flags; |
(...skipping 17 matching lines...) Expand all Loading... |
556 return !GetFieldTrialInfo(&flags, NULL) || | 528 return !GetFieldTrialInfo(&flags, NULL) || |
557 GetBoolValueForFlagWithDefault(kShowNtpFlagName, true, flags); | 529 GetBoolValueForFlagWithDefault(kShowNtpFlagName, true, flags); |
558 } | 530 } |
559 | 531 |
560 bool ShouldShowRecentTabsOnNTP() { | 532 bool ShouldShowRecentTabsOnNTP() { |
561 FieldTrialFlags flags; | 533 FieldTrialFlags flags; |
562 return GetFieldTrialInfo(&flags, NULL) && GetBoolValueForFlagWithDefault( | 534 return GetFieldTrialInfo(&flags, NULL) && GetBoolValueForFlagWithDefault( |
563 kRecentTabsOnNTPFlagName, false, flags); | 535 kRecentTabsOnNTPFlagName, false, flags); |
564 } | 536 } |
565 | 537 |
566 bool ShouldSuppressInstantExtendedOnSRP() { | |
567 FieldTrialFlags flags; | |
568 | |
569 const CommandLine* command_line = CommandLine::ForCurrentProcess(); | |
570 if (command_line->HasSwitch(switches::kEnableInstantExtendedAPI)) | |
571 return false; | |
572 | |
573 return !GetFieldTrialInfo(&flags, NULL) || GetBoolValueForFlagWithDefault( | |
574 kSuppressInstantExtendedOnSRPFlagName, true, flags); | |
575 } | |
576 | |
577 DisplaySearchButtonConditions GetDisplaySearchButtonConditions() { | 538 DisplaySearchButtonConditions GetDisplaySearchButtonConditions() { |
578 FieldTrialFlags flags; | 539 FieldTrialFlags flags; |
579 if (!GetFieldTrialInfo(&flags, NULL)) | 540 if (!GetFieldTrialInfo(&flags, NULL)) |
580 return DISPLAY_SEARCH_BUTTON_NEVER; | 541 return DISPLAY_SEARCH_BUTTON_NEVER; |
581 uint64 value = | 542 uint64 value = |
582 GetUInt64ValueForFlagWithDefault(kDisplaySearchButtonFlagName, 0, flags); | 543 GetUInt64ValueForFlagWithDefault(kDisplaySearchButtonFlagName, 0, flags); |
583 return (value < DISPLAY_SEARCH_BUTTON_NUM_VALUES) ? | 544 return (value < DISPLAY_SEARCH_BUTTON_NUM_VALUES) ? |
584 static_cast<DisplaySearchButtonConditions>(value) : | 545 static_cast<DisplaySearchButtonConditions>(value) : |
585 DISPLAY_SEARCH_BUTTON_NEVER; | 546 DISPLAY_SEARCH_BUTTON_NEVER; |
586 } | 547 } |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
706 InstantSupportState GetInstantSupportStateFromNavigationEntry( | 667 InstantSupportState GetInstantSupportStateFromNavigationEntry( |
707 const content::NavigationEntry& entry) { | 668 const content::NavigationEntry& entry) { |
708 string16 value; | 669 string16 value; |
709 if (!entry.GetExtraData(kInstantSupportStateKey, &value)) | 670 if (!entry.GetExtraData(kInstantSupportStateKey, &value)) |
710 return INSTANT_SUPPORT_UNKNOWN; | 671 return INSTANT_SUPPORT_UNKNOWN; |
711 | 672 |
712 return StringToInstantSupportState(value); | 673 return StringToInstantSupportState(value); |
713 } | 674 } |
714 | 675 |
715 bool ShouldPrefetchSearchResultsOnSRP() { | 676 bool ShouldPrefetchSearchResultsOnSRP() { |
716 // Check the command-line/about:flags setting first, which should have | |
717 // precedence and allows the trial to not be reported (if it's never queried). | |
718 const CommandLine* command_line = CommandLine::ForCurrentProcess(); | |
719 if (command_line->HasSwitch(switches::kDisableInstantExtendedAPI) || | |
720 command_line->HasSwitch(switches::kEnableInstantExtendedAPI)) { | |
721 return false; | |
722 } | |
723 | |
724 FieldTrialFlags flags; | 677 FieldTrialFlags flags; |
725 return GetFieldTrialInfo(&flags, NULL) && GetBoolValueForFlagWithDefault( | 678 return GetFieldTrialInfo(&flags, NULL) && GetBoolValueForFlagWithDefault( |
726 kPrefetchSearchResultsOnSRP, false, flags); | 679 kPrefetchSearchResultsOnSRP, false, flags); |
727 } | 680 } |
728 | 681 |
729 void EnableInstantExtendedAPIForTesting() { | 682 void EnableQueryExtractionForTesting() { |
730 CommandLine* cl = CommandLine::ForCurrentProcess(); | 683 CommandLine* cl = CommandLine::ForCurrentProcess(); |
731 cl->AppendSwitch(switches::kEnableInstantExtendedAPI); | 684 cl->AppendSwitch(switches::kEnableQueryExtraction); |
732 } | |
733 | |
734 void DisableInstantExtendedAPIForTesting() { | |
735 CommandLine* cl = CommandLine::ForCurrentProcess(); | |
736 cl->AppendSwitch(switches::kDisableInstantExtendedAPI); | |
737 } | 685 } |
738 | 686 |
739 bool GetFieldTrialInfo(FieldTrialFlags* flags, | 687 bool GetFieldTrialInfo(FieldTrialFlags* flags, |
740 uint64* group_number) { | 688 uint64* group_number) { |
741 // Get the group name. If the EmbeddedSearch trial doesn't exist, look for | 689 // Get the group name. If the EmbeddedSearch trial doesn't exist, look for |
742 // the older InstantExtended name. | 690 // the older InstantExtended name. |
743 std::string group_name = base::FieldTrialList::FindFullName( | 691 std::string group_name = base::FieldTrialList::FindFullName( |
744 kEmbeddedSearchFieldTrialName); | 692 kEmbeddedSearchFieldTrialName); |
745 if (group_name.empty()) { | 693 if (group_name.empty()) { |
746 group_name = base::FieldTrialList::FindFullName( | 694 group_name = base::FieldTrialList::FindFullName( |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
815 bool default_value, | 763 bool default_value, |
816 const FieldTrialFlags& flags) { | 764 const FieldTrialFlags& flags) { |
817 return !!GetUInt64ValueForFlagWithDefault(flag, default_value ? 1 : 0, flags); | 765 return !!GetUInt64ValueForFlagWithDefault(flag, default_value ? 1 : 0, flags); |
818 } | 766 } |
819 | 767 |
820 void ResetInstantExtendedOptInStateGateForTest() { | 768 void ResetInstantExtendedOptInStateGateForTest() { |
821 instant_extended_opt_in_state_gate = false; | 769 instant_extended_opt_in_state_gate = false; |
822 } | 770 } |
823 | 771 |
824 } // namespace chrome | 772 } // namespace chrome |
OLD | NEW |