| 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/instant/instant_controller.h" | 5 #include "chrome/browser/instant/instant_controller.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/metrics/histogram.h" | 8 #include "base/metrics/histogram.h" |
| 9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
| 10 #include "base/utf_string_conversions.h" | 10 #include "base/utf_string_conversions.h" |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 145 | 145 |
| 146 InstantController::InstantController(chrome::BrowserInstantController* browser, | 146 InstantController::InstantController(chrome::BrowserInstantController* browser, |
| 147 bool extended_enabled) | 147 bool extended_enabled) |
| 148 : browser_(browser), | 148 : browser_(browser), |
| 149 extended_enabled_(extended_enabled), | 149 extended_enabled_(extended_enabled), |
| 150 instant_enabled_(false), | 150 instant_enabled_(false), |
| 151 model_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), | 151 model_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), |
| 152 last_verbatim_(false), | 152 last_verbatim_(false), |
| 153 last_transition_type_(content::PAGE_TRANSITION_LINK), | 153 last_transition_type_(content::PAGE_TRANSITION_LINK), |
| 154 last_match_was_search_(false), | 154 last_match_was_search_(false), |
| 155 is_omnibox_focused_(false) { | 155 omnibox_focus_state_(NONE) { |
| 156 } | 156 } |
| 157 | 157 |
| 158 InstantController::~InstantController() { | 158 InstantController::~InstantController() { |
| 159 } | 159 } |
| 160 | 160 |
| 161 bool InstantController::Update(const AutocompleteMatch& match, | 161 bool InstantController::Update(const AutocompleteMatch& match, |
| 162 const string16& user_text, | 162 const string16& user_text, |
| 163 const string16& full_text, | 163 const string16& full_text, |
| 164 const bool verbatim, | 164 const bool verbatim, |
| 165 const bool user_input_in_progress, | 165 const bool user_input_in_progress, |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 469 | 469 |
| 470 // Try to create another loader immediately so that it is ready for the next | 470 // Try to create another loader immediately so that it is ready for the next |
| 471 // user interaction. | 471 // user interaction. |
| 472 CreateDefaultLoader(); | 472 CreateDefaultLoader(); |
| 473 | 473 |
| 474 return true; | 474 return true; |
| 475 } | 475 } |
| 476 | 476 |
| 477 void InstantController::OmniboxLostFocus(gfx::NativeView view_gaining_focus) { | 477 void InstantController::OmniboxLostFocus(gfx::NativeView view_gaining_focus) { |
| 478 DVLOG(1) << "OmniboxLostFocus"; | 478 DVLOG(1) << "OmniboxLostFocus"; |
| 479 is_omnibox_focused_ = false; | 479 omnibox_focus_state_ = NONE; |
| 480 SendKeyCaptureModeToPage(); |
| 480 | 481 |
| 481 if (!extended_enabled_ && !instant_enabled_) | 482 if (!extended_enabled_ && !instant_enabled_) |
| 482 return; | 483 return; |
| 483 | 484 |
| 484 // If the preview isn't showing search suggestions, nothing to do. The check | 485 // If the preview isn't showing search suggestions, nothing to do. The check |
| 485 // for GetPreviewContents() (which normally is redundant, given IsCurrent()) | 486 // for GetPreviewContents() (which normally is redundant, given IsCurrent()) |
| 486 // is to handle the case when we get here during a commit. | 487 // is to handle the case when we get here during a commit. |
| 487 if (!IsCurrent() || !GetPreviewContents()) { | 488 if (!IsCurrent() || !GetPreviewContents()) { |
| 488 OnStaleLoader(); | 489 OnStaleLoader(); |
| 489 return; | 490 return; |
| 490 } | 491 } |
| 491 | 492 |
| 492 #if defined(OS_MACOSX) | 493 #if defined(OS_MACOSX) |
| 493 if (!loader_->IsPointerDownFromActivate()) | 494 if (!loader_->IsPointerDownFromActivate()) |
| 494 Hide(true); | 495 Hide(true); |
| 495 #else | 496 #else |
| 496 if (IsViewInContents(GetViewGainingFocus(view_gaining_focus), | 497 if (IsViewInContents(GetViewGainingFocus(view_gaining_focus), |
| 497 GetPreviewContents()->web_contents())) | 498 GetPreviewContents()->web_contents())) |
| 498 CommitIfCurrent(INSTANT_COMMIT_FOCUS_LOST); | 499 CommitIfCurrent(INSTANT_COMMIT_FOCUS_LOST); |
| 499 else | 500 else |
| 500 Hide(true); | 501 Hide(true); |
| 501 #endif | 502 #endif |
| 502 } | 503 } |
| 503 | 504 |
| 504 void InstantController::OmniboxGotFocus() { | 505 void InstantController::OmniboxGotFocus(bool focus_is_visible) { |
| 505 DVLOG(1) << "OmniboxGotFocus"; | 506 DVLOG(1) << "OmniboxGotFocus"; |
| 506 is_omnibox_focused_ = true; | 507 omnibox_focus_state_ = focus_is_visible ? VISIBLE : INVISIBLE; |
| 508 SendKeyCaptureModeToPage(); |
| 507 | 509 |
| 508 if (!extended_enabled_ && !instant_enabled_) | 510 if (!extended_enabled_ && !instant_enabled_) |
| 509 return; | 511 return; |
| 510 | 512 |
| 511 if (!GetPreviewContents()) | 513 if (!GetPreviewContents()) |
| 512 CreateDefaultLoader(); | 514 CreateDefaultLoader(); |
| 513 } | 515 } |
| 514 | 516 |
| 515 void InstantController::SearchModeChanged( | 517 void InstantController::SearchModeChanged( |
| 516 const chrome::search::Mode& old_mode, | 518 const chrome::search::Mode& old_mode, |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 700 if (!GetInstantURL(template_url, &instant_url)) | 702 if (!GetInstantURL(template_url, &instant_url)) |
| 701 return false; | 703 return false; |
| 702 | 704 |
| 703 if (GetPreviewContents() && loader_->instant_url() != instant_url) | 705 if (GetPreviewContents() && loader_->instant_url() != instant_url) |
| 704 DeleteLoader(); | 706 DeleteLoader(); |
| 705 | 707 |
| 706 if (!GetPreviewContents()) { | 708 if (!GetPreviewContents()) { |
| 707 loader_.reset(new InstantLoader(this, instant_url, active_tab)); | 709 loader_.reset(new InstantLoader(this, instant_url, active_tab)); |
| 708 loader_->Init(); | 710 loader_->Init(); |
| 709 | 711 |
| 710 // Ensure the searchbox API has the correct theme-related info and context. | 712 // Ensure the searchbox API has correct state. |
| 711 if (extended_enabled_) { | 713 if (extended_enabled_) { |
| 712 browser_->UpdateThemeInfoForPreview(); | 714 browser_->UpdateThemeInfoForPreview(); |
| 713 loader_->SearchModeChanged(search_mode_); | 715 loader_->SearchModeChanged(search_mode_); |
| 716 SendKeyCaptureModeToPage(); |
| 714 } | 717 } |
| 715 | 718 |
| 716 // Reset the loader timer. | 719 // Reset the loader timer. |
| 717 stale_loader_timer_.Start( | 720 stale_loader_timer_.Start( |
| 718 FROM_HERE, | 721 FROM_HERE, |
| 719 base::TimeDelta::FromMilliseconds(kStaleLoaderTimeoutMS), this, | 722 base::TimeDelta::FromMilliseconds(kStaleLoaderTimeoutMS), this, |
| 720 &InstantController::OnStaleLoader); | 723 &InstantController::OnStaleLoader); |
| 721 } | 724 } |
| 722 | 725 |
| 723 return true; | 726 return true; |
| 724 } | 727 } |
| 725 | 728 |
| 726 bool InstantController::CreateDefaultLoader() { | 729 bool InstantController::CreateDefaultLoader() { |
| 727 // If there's no active tab, the browser is closing. | 730 // If there's no active tab, the browser is closing. |
| 728 const TabContents* active_tab = browser_->GetActiveTabContents(); | 731 const TabContents* active_tab = browser_->GetActiveTabContents(); |
| 729 if (!active_tab) | 732 if (!active_tab) |
| 730 return false; | 733 return false; |
| 731 | 734 |
| 732 const TemplateURL* template_url = | 735 const TemplateURL* template_url = |
| 733 TemplateURLServiceFactory::GetForProfile(active_tab->profile())-> | 736 TemplateURLServiceFactory::GetForProfile(active_tab->profile())-> |
| 734 GetDefaultSearchProvider(); | 737 GetDefaultSearchProvider(); |
| 735 | 738 |
| 736 return ResetLoader(template_url, active_tab); | 739 return ResetLoader(template_url, active_tab); |
| 737 } | 740 } |
| 738 | 741 |
| 739 void InstantController::OnStaleLoader() { | 742 void InstantController::OnStaleLoader() { |
| 740 // If the preview is showing or the omnibox has focus, don't delete the | 743 // If the preview is showing or the omnibox has focus, don't delete the |
| 741 // loader. It will get refreshed the next time the preview is hidden or the | 744 // loader. It will get refreshed the next time the preview is hidden or the |
| 742 // omnibox loses focus. | 745 // omnibox loses focus. |
| 743 if (!stale_loader_timer_.IsRunning() && !is_omnibox_focused_ && | 746 if (!stale_loader_timer_.IsRunning() && omnibox_focus_state_ == NONE && |
| 744 model_.mode().is_default()) { | 747 model_.mode().is_default()) { |
| 745 DeleteLoader(); | 748 DeleteLoader(); |
| 746 CreateDefaultLoader(); | 749 CreateDefaultLoader(); |
| 747 } | 750 } |
| 748 } | 751 } |
| 749 | 752 |
| 750 void InstantController::DeleteLoader() { | 753 void InstantController::DeleteLoader() { |
| 751 // Clear all state, except |last_transition_type_| as it's used during commit. | 754 // Clear all state, except |last_transition_type_| as it's used during commit. |
| 752 last_user_text_.clear(); | 755 last_user_text_.clear(); |
| 753 last_full_text_.clear(); | 756 last_full_text_.clear(); |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 855 // There is no point in sanity-checking |intersection.y()| because the omnibox | 858 // There is no point in sanity-checking |intersection.y()| because the omnibox |
| 856 // can be placed anywhere vertically relative to the preview (for example, in | 859 // can be placed anywhere vertically relative to the preview (for example, in |
| 857 // Mac fullscreen mode, the omnibox is fully enclosed by the preview bounds). | 860 // Mac fullscreen mode, the omnibox is fully enclosed by the preview bounds). |
| 858 DCHECK_LE(0, intersection.x()); | 861 DCHECK_LE(0, intersection.x()); |
| 859 DCHECK_LE(0, intersection.width()); | 862 DCHECK_LE(0, intersection.width()); |
| 860 DCHECK_LE(0, intersection.height()); | 863 DCHECK_LE(0, intersection.height()); |
| 861 | 864 |
| 862 loader_->SetOmniboxBounds(intersection); | 865 loader_->SetOmniboxBounds(intersection); |
| 863 } | 866 } |
| 864 | 867 |
| 868 void InstantController::SendKeyCaptureModeToPage() { |
| 869 if (extended_enabled_ && GetPreviewContents()) |
| 870 loader_->OnKeyCaptureChange(omnibox_focus_state_ == INVISIBLE); |
| 871 } |
| 872 |
| 865 bool InstantController::GetInstantURL(const TemplateURL* template_url, | 873 bool InstantController::GetInstantURL(const TemplateURL* template_url, |
| 866 std::string* instant_url) const { | 874 std::string* instant_url) const { |
| 867 CommandLine* command_line = CommandLine::ForCurrentProcess(); | 875 CommandLine* command_line = CommandLine::ForCurrentProcess(); |
| 868 if (command_line->HasSwitch(switches::kInstantURL)) { | 876 if (command_line->HasSwitch(switches::kInstantURL)) { |
| 869 *instant_url = command_line->GetSwitchValueASCII(switches::kInstantURL); | 877 *instant_url = command_line->GetSwitchValueASCII(switches::kInstantURL); |
| 870 return template_url != NULL; | 878 return template_url != NULL; |
| 871 } | 879 } |
| 872 | 880 |
| 873 if (!template_url) | 881 if (!template_url) |
| 874 return false; | 882 return false; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 906 } | 914 } |
| 907 | 915 |
| 908 std::map<std::string, int>::const_iterator iter = | 916 std::map<std::string, int>::const_iterator iter = |
| 909 blacklisted_urls_.find(*instant_url); | 917 blacklisted_urls_.find(*instant_url); |
| 910 if (iter != blacklisted_urls_.end() && | 918 if (iter != blacklisted_urls_.end() && |
| 911 iter->second > kMaxInstantSupportFailures) | 919 iter->second > kMaxInstantSupportFailures) |
| 912 return false; | 920 return false; |
| 913 | 921 |
| 914 return true; | 922 return true; |
| 915 } | 923 } |
| OLD | NEW |