| 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/ui/omnibox/omnibox_edit_model.h" | 5 #include "chrome/browser/ui/omnibox/omnibox_edit_model.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 112 // between focusing and opening an omnibox match. | 112 // between focusing and opening an omnibox match. |
| 113 const char kFocusToOpenTimeHistogram[] = "Omnibox.FocusToOpenTimeAnyPopupState"; | 113 const char kFocusToOpenTimeHistogram[] = "Omnibox.FocusToOpenTimeAnyPopupState"; |
| 114 | 114 |
| 115 // Split the percentage match histograms into buckets based on the width of the | 115 // Split the percentage match histograms into buckets based on the width of the |
| 116 // omnibox. | 116 // omnibox. |
| 117 const int kPercentageMatchHistogramWidthBuckets[] = { 400, 700, 1200 }; | 117 const int kPercentageMatchHistogramWidthBuckets[] = { 400, 700, 1200 }; |
| 118 | 118 |
| 119 void RecordPercentageMatchHistogram(const base::string16& old_text, | 119 void RecordPercentageMatchHistogram(const base::string16& old_text, |
| 120 const base::string16& new_text, | 120 const base::string16& new_text, |
| 121 bool url_replacement_active, | 121 bool url_replacement_active, |
| 122 content::PageTransition transition, | 122 ui::PageTransition transition, |
| 123 int omnibox_width) { | 123 int omnibox_width) { |
| 124 size_t avg_length = (old_text.length() + new_text.length()) / 2; | 124 size_t avg_length = (old_text.length() + new_text.length()) / 2; |
| 125 | 125 |
| 126 int percent = 0; | 126 int percent = 0; |
| 127 if (!old_text.empty() && !new_text.empty()) { | 127 if (!old_text.empty() && !new_text.empty()) { |
| 128 size_t shorter_length = std::min(old_text.length(), new_text.length()); | 128 size_t shorter_length = std::min(old_text.length(), new_text.length()); |
| 129 base::string16::const_iterator end(old_text.begin() + shorter_length); | 129 base::string16::const_iterator end(old_text.begin() + shorter_length); |
| 130 base::string16::const_iterator mismatch( | 130 base::string16::const_iterator mismatch( |
| 131 std::mismatch(old_text.begin(), end, new_text.begin()).first); | 131 std::mismatch(old_text.begin(), end, new_text.begin()).first); |
| 132 size_t matching_characters = mismatch - old_text.begin(); | 132 size_t matching_characters = mismatch - old_text.begin(); |
| 133 percent = static_cast<float>(matching_characters) / avg_length * 100; | 133 percent = static_cast<float>(matching_characters) / avg_length * 100; |
| 134 } | 134 } |
| 135 | 135 |
| 136 std::string histogram_name; | 136 std::string histogram_name; |
| 137 if (url_replacement_active) { | 137 if (url_replacement_active) { |
| 138 if (transition == content::PAGE_TRANSITION_TYPED) { | 138 if (transition == ui::PAGE_TRANSITION_TYPED) { |
| 139 histogram_name = "InstantExtended.PercentageMatchV2_QuerytoURL"; | 139 histogram_name = "InstantExtended.PercentageMatchV2_QuerytoURL"; |
| 140 UMA_HISTOGRAM_PERCENTAGE(histogram_name, percent); | 140 UMA_HISTOGRAM_PERCENTAGE(histogram_name, percent); |
| 141 } else { | 141 } else { |
| 142 histogram_name = "InstantExtended.PercentageMatchV2_QuerytoQuery"; | 142 histogram_name = "InstantExtended.PercentageMatchV2_QuerytoQuery"; |
| 143 UMA_HISTOGRAM_PERCENTAGE(histogram_name, percent); | 143 UMA_HISTOGRAM_PERCENTAGE(histogram_name, percent); |
| 144 } | 144 } |
| 145 } else { | 145 } else { |
| 146 if (transition == content::PAGE_TRANSITION_TYPED) { | 146 if (transition == ui::PAGE_TRANSITION_TYPED) { |
| 147 histogram_name = "InstantExtended.PercentageMatchV2_URLtoURL"; | 147 histogram_name = "InstantExtended.PercentageMatchV2_URLtoURL"; |
| 148 UMA_HISTOGRAM_PERCENTAGE(histogram_name, percent); | 148 UMA_HISTOGRAM_PERCENTAGE(histogram_name, percent); |
| 149 } else { | 149 } else { |
| 150 histogram_name = "InstantExtended.PercentageMatchV2_URLtoQuery"; | 150 histogram_name = "InstantExtended.PercentageMatchV2_URLtoQuery"; |
| 151 UMA_HISTOGRAM_PERCENTAGE(histogram_name, percent); | 151 UMA_HISTOGRAM_PERCENTAGE(histogram_name, percent); |
| 152 } | 152 } |
| 153 } | 153 } |
| 154 | 154 |
| 155 std::string suffix = "large"; | 155 std::string suffix = "large"; |
| 156 for (size_t i = 0; i < arraysize(kPercentageMatchHistogramWidthBuckets); | 156 for (size_t i = 0; i < arraysize(kPercentageMatchHistogramWidthBuckets); |
| (...skipping 505 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 662 if (url_match.destination_url.is_valid()) { | 662 if (url_match.destination_url.is_valid()) { |
| 663 // We have a valid URL, we use this newly generated AutocompleteMatch. | 663 // We have a valid URL, we use this newly generated AutocompleteMatch. |
| 664 match = url_match; | 664 match = url_match; |
| 665 alternate_nav_url = GURL(); | 665 alternate_nav_url = GURL(); |
| 666 } | 666 } |
| 667 } | 667 } |
| 668 | 668 |
| 669 if (!match.destination_url.is_valid()) | 669 if (!match.destination_url.is_valid()) |
| 670 return; | 670 return; |
| 671 | 671 |
| 672 if ((match.transition == content::PAGE_TRANSITION_TYPED) && | 672 if ((match.transition == ui::PAGE_TRANSITION_TYPED) && |
| 673 (match.destination_url == PermanentURL())) { | 673 (match.destination_url == PermanentURL())) { |
| 674 // When the user hit enter on the existing permanent URL, treat it like a | 674 // When the user hit enter on the existing permanent URL, treat it like a |
| 675 // reload for scoring purposes. We could detect this by just checking | 675 // reload for scoring purposes. We could detect this by just checking |
| 676 // user_input_in_progress_, but it seems better to treat "edits" that end | 676 // user_input_in_progress_, but it seems better to treat "edits" that end |
| 677 // up leaving the URL unchanged (e.g. deleting the last character and then | 677 // up leaving the URL unchanged (e.g. deleting the last character and then |
| 678 // retyping it) as reloads too. We exclude non-TYPED transitions because if | 678 // retyping it) as reloads too. We exclude non-TYPED transitions because if |
| 679 // the transition is GENERATED, the user input something that looked | 679 // the transition is GENERATED, the user input something that looked |
| 680 // different from the current URL, even if it wound up at the same place | 680 // different from the current URL, even if it wound up at the same place |
| 681 // (e.g. manually retyping the same search query), and it seems wrong to | 681 // (e.g. manually retyping the same search query), and it seems wrong to |
| 682 // treat this as a reload. | 682 // treat this as a reload. |
| 683 match.transition = content::PAGE_TRANSITION_RELOAD; | 683 match.transition = ui::PAGE_TRANSITION_RELOAD; |
| 684 } else if (for_drop || ((paste_state_ != NONE) && | 684 } else if (for_drop || ((paste_state_ != NONE) && |
| 685 match.is_history_what_you_typed_match)) { | 685 match.is_history_what_you_typed_match)) { |
| 686 // When the user pasted in a URL and hit enter, score it like a link click | 686 // When the user pasted in a URL and hit enter, score it like a link click |
| 687 // rather than a normal typed URL, so it doesn't get inline autocompleted | 687 // rather than a normal typed URL, so it doesn't get inline autocompleted |
| 688 // as aggressively later. | 688 // as aggressively later. |
| 689 match.transition = content::PAGE_TRANSITION_LINK; | 689 match.transition = ui::PAGE_TRANSITION_LINK; |
| 690 } | 690 } |
| 691 | 691 |
| 692 TemplateURLService* service = | 692 TemplateURLService* service = |
| 693 TemplateURLServiceFactory::GetForProfile(profile_); | 693 TemplateURLServiceFactory::GetForProfile(profile_); |
| 694 const TemplateURL* template_url = match.GetTemplateURL(service, false); | 694 const TemplateURL* template_url = match.GetTemplateURL(service, false); |
| 695 if (template_url && template_url->url_ref().HasGoogleBaseURLs( | 695 if (template_url && template_url->url_ref().HasGoogleBaseURLs( |
| 696 UIThreadSearchTermsData(profile_))) { | 696 UIThreadSearchTermsData(profile_))) { |
| 697 GoogleURLTracker* tracker = | 697 GoogleURLTracker* tracker = |
| 698 GoogleURLTrackerFactory::GetForProfile(profile_); | 698 GoogleURLTrackerFactory::GetForProfile(profile_); |
| 699 if (tracker) | 699 if (tracker) |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 785 content::Details<OmniboxLog>(&log)); | 785 content::Details<OmniboxLog>(&log)); |
| 786 LOCAL_HISTOGRAM_BOOLEAN("Omnibox.EventCount", true); | 786 LOCAL_HISTOGRAM_BOOLEAN("Omnibox.EventCount", true); |
| 787 DCHECK(!last_omnibox_focus_.is_null()) | 787 DCHECK(!last_omnibox_focus_.is_null()) |
| 788 << "An omnibox focus should have occurred before opening a match."; | 788 << "An omnibox focus should have occurred before opening a match."; |
| 789 UMA_HISTOGRAM_TIMES(kFocusToOpenTimeHistogram, now - last_omnibox_focus_); | 789 UMA_HISTOGRAM_TIMES(kFocusToOpenTimeHistogram, now - last_omnibox_focus_); |
| 790 | 790 |
| 791 TemplateURLService* service = | 791 TemplateURLService* service = |
| 792 TemplateURLServiceFactory::GetForProfile(profile_); | 792 TemplateURLServiceFactory::GetForProfile(profile_); |
| 793 TemplateURL* template_url = match.GetTemplateURL(service, false); | 793 TemplateURL* template_url = match.GetTemplateURL(service, false); |
| 794 if (template_url) { | 794 if (template_url) { |
| 795 if (match.transition == content::PAGE_TRANSITION_KEYWORD) { | 795 if (match.transition == ui::PAGE_TRANSITION_KEYWORD) { |
| 796 // The user is using a non-substituting keyword or is explicitly in | 796 // The user is using a non-substituting keyword or is explicitly in |
| 797 // keyword mode. | 797 // keyword mode. |
| 798 | 798 |
| 799 // Don't increment usage count for extension keywords. | 799 // Don't increment usage count for extension keywords. |
| 800 if (delegate_->ProcessExtensionKeyword(template_url, match, | 800 if (delegate_->ProcessExtensionKeyword(template_url, match, |
| 801 disposition)) { | 801 disposition)) { |
| 802 observer->OnSuccessfulNavigation(); | 802 observer->OnSuccessfulNavigation(); |
| 803 if (disposition != NEW_BACKGROUND_TAB) | 803 if (disposition != NEW_BACKGROUND_TAB) |
| 804 view_->RevertAll(); | 804 view_->RevertAll(); |
| 805 return; | 805 return; |
| 806 } | 806 } |
| 807 | 807 |
| 808 content::RecordAction(base::UserMetricsAction("AcceptedKeyword")); | 808 content::RecordAction(base::UserMetricsAction("AcceptedKeyword")); |
| 809 TemplateURLServiceFactory::GetForProfile(profile_)->IncrementUsageCount( | 809 TemplateURLServiceFactory::GetForProfile(profile_)->IncrementUsageCount( |
| 810 template_url); | 810 template_url); |
| 811 } else { | 811 } else { |
| 812 DCHECK_EQ(content::PAGE_TRANSITION_GENERATED, match.transition); | 812 DCHECK_EQ(ui::PAGE_TRANSITION_GENERATED, match.transition); |
| 813 // NOTE: We purposefully don't increment the usage count of the default | 813 // NOTE: We purposefully don't increment the usage count of the default |
| 814 // search engine here like we do for explicit keywords above; see comments | 814 // search engine here like we do for explicit keywords above; see comments |
| 815 // in template_url.h. | 815 // in template_url.h. |
| 816 } | 816 } |
| 817 | 817 |
| 818 UMA_HISTOGRAM_ENUMERATION( | 818 UMA_HISTOGRAM_ENUMERATION( |
| 819 "Omnibox.SearchEngineType", | 819 "Omnibox.SearchEngineType", |
| 820 TemplateURLPrepopulateData::GetEngineType( | 820 TemplateURLPrepopulateData::GetEngineType( |
| 821 *template_url, UIThreadSearchTermsData(profile_)), | 821 *template_url, UIThreadSearchTermsData(profile_)), |
| 822 SEARCH_ENGINE_MAX); | 822 SEARCH_ENGINE_MAX); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 841 IsSearchResultsPageFromDefaultSearchProvider(match.destination_url)) { | 841 IsSearchResultsPageFromDefaultSearchProvider(match.destination_url)) { |
| 842 content::RecordAction( | 842 content::RecordAction( |
| 843 base::UserMetricsAction("OmniboxDestinationURLIsSearchOnDSP")); | 843 base::UserMetricsAction("OmniboxDestinationURLIsSearchOnDSP")); |
| 844 } | 844 } |
| 845 | 845 |
| 846 if (match.destination_url.is_valid()) { | 846 if (match.destination_url.is_valid()) { |
| 847 // This calls RevertAll again. | 847 // This calls RevertAll again. |
| 848 base::AutoReset<bool> tmp(&in_revert_, true); | 848 base::AutoReset<bool> tmp(&in_revert_, true); |
| 849 controller_->OnAutocompleteAccept( | 849 controller_->OnAutocompleteAccept( |
| 850 match.destination_url, disposition, | 850 match.destination_url, disposition, |
| 851 content::PageTransitionFromInt( | 851 ui::PageTransitionFromInt( |
| 852 match.transition | content::PAGE_TRANSITION_FROM_ADDRESS_BAR)); | 852 match.transition | ui::PAGE_TRANSITION_FROM_ADDRESS_BAR)); |
| 853 if (observer->load_state() != OmniboxNavigationObserver::LOAD_NOT_SEEN) | 853 if (observer->load_state() != OmniboxNavigationObserver::LOAD_NOT_SEEN) |
| 854 ignore_result(observer.release()); // The observer will delete itself. | 854 ignore_result(observer.release()); // The observer will delete itself. |
| 855 } | 855 } |
| 856 | 856 |
| 857 BookmarkModel* bookmark_model = BookmarkModelFactory::GetForProfile(profile_); | 857 BookmarkModel* bookmark_model = BookmarkModelFactory::GetForProfile(profile_); |
| 858 if (bookmark_model && bookmark_model->IsBookmarked(match.destination_url)) | 858 if (bookmark_model && bookmark_model->IsBookmarked(match.destination_url)) |
| 859 RecordBookmarkLaunch(NULL, BOOKMARK_LAUNCH_LOCATION_OMNIBOX); | 859 RecordBookmarkLaunch(NULL, BOOKMARK_LAUNCH_LOCATION_OMNIBOX); |
| 860 } | 860 } |
| 861 | 861 |
| 862 bool OmniboxEditModel::AcceptKeyword(EnteredKeywordModeMethod entered_method) { | 862 bool OmniboxEditModel::AcceptKeyword(EnteredKeywordModeMethod entered_method) { |
| (...skipping 469 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1332 // explicitly set up a match that will reload here. | 1332 // explicitly set up a match that will reload here. |
| 1333 | 1333 |
| 1334 // It's important that we fetch the current visible URL to reload instead of | 1334 // It's important that we fetch the current visible URL to reload instead of |
| 1335 // just getting a "search what you typed" URL from | 1335 // just getting a "search what you typed" URL from |
| 1336 // SearchProvider::CreateSearchSuggestion(), since the user may be in a | 1336 // SearchProvider::CreateSearchSuggestion(), since the user may be in a |
| 1337 // non-default search mode such as image search. | 1337 // non-default search mode such as image search. |
| 1338 match->type = AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED; | 1338 match->type = AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED; |
| 1339 match->provider = autocomplete_controller()->search_provider(); | 1339 match->provider = autocomplete_controller()->search_provider(); |
| 1340 match->destination_url = | 1340 match->destination_url = |
| 1341 delegate_->GetNavigationController().GetVisibleEntry()->GetURL(); | 1341 delegate_->GetNavigationController().GetVisibleEntry()->GetURL(); |
| 1342 match->transition = content::PAGE_TRANSITION_RELOAD; | 1342 match->transition = ui::PAGE_TRANSITION_RELOAD; |
| 1343 } else if (query_in_progress() || | 1343 } else if (query_in_progress() || |
| 1344 (popup_model() && popup_model()->IsOpen())) { | 1344 (popup_model() && popup_model()->IsOpen())) { |
| 1345 if (query_in_progress()) { | 1345 if (query_in_progress()) { |
| 1346 // It's technically possible for |result| to be empty if no provider | 1346 // It's technically possible for |result| to be empty if no provider |
| 1347 // returns a synchronous result but the query has not completed | 1347 // returns a synchronous result but the query has not completed |
| 1348 // synchronously; pratically, however, that should never actually happen. | 1348 // synchronously; pratically, however, that should never actually happen. |
| 1349 if (result().empty()) | 1349 if (result().empty()) |
| 1350 return; | 1350 return; |
| 1351 // The user cannot have manually selected a match, or the query would have | 1351 // The user cannot have manually selected a match, or the query would have |
| 1352 // stopped. So the default match must be the desired selection. | 1352 // stopped. So the default match must be the desired selection. |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1475 // Update state and notify view if the omnibox has focus and the caret | 1475 // Update state and notify view if the omnibox has focus and the caret |
| 1476 // visibility changed. | 1476 // visibility changed. |
| 1477 const bool was_caret_visible = is_caret_visible(); | 1477 const bool was_caret_visible = is_caret_visible(); |
| 1478 focus_state_ = state; | 1478 focus_state_ = state; |
| 1479 if (focus_state_ != OMNIBOX_FOCUS_NONE && | 1479 if (focus_state_ != OMNIBOX_FOCUS_NONE && |
| 1480 is_caret_visible() != was_caret_visible) | 1480 is_caret_visible() != was_caret_visible) |
| 1481 view_->ApplyCaretVisibility(); | 1481 view_->ApplyCaretVisibility(); |
| 1482 | 1482 |
| 1483 delegate_->OnFocusChanged(focus_state_, reason); | 1483 delegate_->OnFocusChanged(focus_state_, reason); |
| 1484 } | 1484 } |
| OLD | NEW |