Index: chrome/browser/cocoa/location_bar/location_bar_view_mac.mm |
=================================================================== |
--- chrome/browser/cocoa/location_bar/location_bar_view_mac.mm (revision 62138) |
+++ chrome/browser/cocoa/location_bar/location_bar_view_mac.mm (working copy) |
@@ -15,6 +15,7 @@ |
#include "chrome/browser/alternate_nav_url_fetcher.h" |
#import "chrome/browser/app_controller_mac.h" |
#import "chrome/browser/autocomplete/autocomplete_edit_view_mac.h" |
+#import "chrome/browser/autocomplete/autocomplete_popup_model.h" |
#include "chrome/browser/browser_list.h" |
#import "chrome/browser/cocoa/content_setting_bubble_cocoa.h" |
#include "chrome/browser/cocoa/event_utils.h" |
@@ -37,6 +38,7 @@ |
#include "chrome/browser/extensions/extension_browser_event_router.h" |
#include "chrome/browser/extensions/extensions_service.h" |
#include "chrome/browser/extensions/extension_tabs_module.h" |
+#include "chrome/browser/instant/instant_controller.h" |
#include "chrome/browser/location_bar_util.h" |
#include "chrome/browser/profile.h" |
#include "chrome/browser/search_engines/template_url.h" |
@@ -82,6 +84,7 @@ |
profile_(profile), |
browser_(browser), |
toolbar_model_(toolbar_model), |
+ update_instant_(true), |
transition_(PageTransition::TYPED), |
first_run_bubble_(this) { |
for (size_t i = 0; i < CONTENT_SETTINGS_NUM_TYPES; ++i) { |
@@ -125,8 +128,7 @@ |
} |
void LocationBarViewMac::SetSuggestedText(const string16& text) { |
- // TODO: implement me. |
- NOTIMPLEMENTED(); |
+ // TODO(rohitrao): implement me. http://crbug.com/56385 |
} |
WindowOpenDisposition LocationBarViewMac::GetWindowOpenDisposition() const { |
@@ -201,12 +203,35 @@ |
} |
void LocationBarViewMac::OnAutocompleteWillClosePopup() { |
+ if (!update_instant_) |
+ return; |
+ |
+ InstantController* controller = browser_->instant(); |
+ if (controller && !controller->commit_on_mouse_up()) |
+ controller->DestroyPreviewContents(); |
} |
void LocationBarViewMac::OnAutocompleteLosingFocus(gfx::NativeView unused) { |
+ InstantController* instant = browser_->instant(); |
+ if (!instant) |
+ return; |
+ |
+ if (!instant->is_active() || !instant->GetPreviewContents()) |
+ return; |
+ |
+ // If |IsMouseDownFromActivate()| returns false, the RenderWidgetHostView did |
+ // not receive a mouseDown event. Therefore, we should destroy the preview. |
+ // Otherwise, the RWHV was clicked, so we commit the preview. |
+ if (!instant->IsMouseDownFromActivate()) |
+ instant->DestroyPreviewContents(); |
+ else if (instant->IsShowingInstant()) |
+ instant->SetCommitOnMouseUp(); |
+ else |
+ instant->CommitCurrentPreview(INSTANT_COMMIT_FOCUS_LOST); |
} |
void LocationBarViewMac::OnAutocompleteWillAccept() { |
+ update_instant_ = false; |
} |
bool LocationBarViewMac::OnCommitSuggestedText(const std::wstring& typed_text) { |
@@ -220,35 +245,39 @@ |
WindowOpenDisposition disposition, |
PageTransition::Type transition, |
const GURL& alternate_nav_url) { |
- if (!url.is_valid()) |
- return; |
+ // WARNING: don't add an early return here. The calls after the if must |
+ // happen. |
+ if (url.is_valid()) { |
+ location_input_ = UTF8ToWide(url.spec()); |
+ disposition_ = disposition; |
+ transition_ = transition; |
- location_input_ = UTF8ToWide(url.spec()); |
- disposition_ = disposition; |
- transition_ = transition; |
+ if (command_updater_) { |
+ if (!alternate_nav_url.is_valid()) { |
+ command_updater_->ExecuteCommand(IDC_OPEN_CURRENT_URL); |
+ } else { |
+ AlternateNavURLFetcher* fetcher = |
+ new AlternateNavURLFetcher(alternate_nav_url); |
+ // The AlternateNavURLFetcher will listen for the pending navigation |
+ // notification that will be issued as a result of the "open URL." It |
+ // will automatically install itself into that navigation controller. |
+ command_updater_->ExecuteCommand(IDC_OPEN_CURRENT_URL); |
+ if (fetcher->state() == AlternateNavURLFetcher::NOT_STARTED) { |
+ // I'm not sure this should be reachable, but I'm not also sure enough |
+ // that it shouldn't to stick in a NOTREACHED(). In any case, this is |
+ // harmless. |
+ delete fetcher; |
+ } else { |
+ // The navigation controller will delete the fetcher. |
+ } |
+ } |
+ } |
+ } |
- if (!command_updater_) |
- return; |
+ if (browser_->instant()) |
+ browser_->instant()->DestroyPreviewContents(); |
- if (!alternate_nav_url.is_valid()) { |
- command_updater_->ExecuteCommand(IDC_OPEN_CURRENT_URL); |
- return; |
- } |
- |
- AlternateNavURLFetcher* fetcher = |
- new AlternateNavURLFetcher(alternate_nav_url); |
- // The AlternateNavURLFetcher will listen for the pending navigation |
- // notification that will be issued as a result of the "open URL." It |
- // will automatically install itself into that navigation controller. |
- command_updater_->ExecuteCommand(IDC_OPEN_CURRENT_URL); |
- if (fetcher->state() == AlternateNavURLFetcher::NOT_STARTED) { |
- // I'm not sure this should be reachable, but I'm not also sure enough |
- // that it shouldn't to stick in a NOTREACHED(). In any case, this is |
- // harmless. |
- delete fetcher; |
- } else { |
- // The navigation controller will delete the fetcher. |
- } |
+ update_instant_ = true; |
} |
void LocationBarViewMac::OnChanged() { |
@@ -258,6 +287,21 @@ |
location_icon_decoration_->SetImage(image); |
ev_bubble_decoration_->SetImage(image); |
Layout(); |
+ |
+ InstantController* instant = browser_->instant(); |
+ string16 suggested_text; |
+ if (update_instant_ && instant && GetTabContents()) { |
+ if (edit_view_->model()->user_input_in_progress() && |
+ edit_view_->model()->popup_model()->IsOpen()) { |
+ instant->Update(GetTabContents(), |
+ edit_view_->model()->CurrentMatch(), |
+ WideToUTF16(edit_view_->GetText()), |
+ &suggested_text); |
+ } else { |
+ if (instant->is_active()) |
+ instant->DestroyPreviewContents(); |
+ } |
+ } |
} |
void LocationBarViewMac::OnInputInProgress(bool in_progress) { |