OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 #import "chrome/browser/cocoa/location_bar/location_bar_view_mac.h" | 5 #import "chrome/browser/cocoa/location_bar/location_bar_view_mac.h" |
6 | 6 |
7 #include "app/l10n_util_mac.h" | 7 #include "app/l10n_util_mac.h" |
8 #include "app/resource_bundle.h" | 8 #include "app/resource_bundle.h" |
9 #include "base/nsimage_cache_mac.h" | 9 #include "base/nsimage_cache_mac.h" |
10 #include "base/stl_util-inl.h" | 10 #include "base/stl_util-inl.h" |
11 #include "base/string_util.h" | 11 #include "base/string_util.h" |
12 #include "base/sys_string_conversions.h" | 12 #include "base/sys_string_conversions.h" |
13 #include "base/utf_string_conversions.h" | 13 #include "base/utf_string_conversions.h" |
14 #include "chrome/app/chrome_dll_resource.h" | 14 #include "chrome/app/chrome_dll_resource.h" |
15 #include "chrome/browser/alternate_nav_url_fetcher.h" | 15 #include "chrome/browser/alternate_nav_url_fetcher.h" |
16 #import "chrome/browser/app_controller_mac.h" | 16 #import "chrome/browser/app_controller_mac.h" |
17 #import "chrome/browser/autocomplete/autocomplete_edit_view_mac.h" | 17 #import "chrome/browser/autocomplete/autocomplete_edit_view_mac.h" |
| 18 #import "chrome/browser/autocomplete/autocomplete_popup_model.h" |
18 #include "chrome/browser/browser_list.h" | 19 #include "chrome/browser/browser_list.h" |
19 #import "chrome/browser/cocoa/content_setting_bubble_cocoa.h" | 20 #import "chrome/browser/cocoa/content_setting_bubble_cocoa.h" |
20 #include "chrome/browser/cocoa/event_utils.h" | 21 #include "chrome/browser/cocoa/event_utils.h" |
21 #import "chrome/browser/cocoa/extensions/extension_action_context_menu.h" | 22 #import "chrome/browser/cocoa/extensions/extension_action_context_menu.h" |
22 #import "chrome/browser/cocoa/extensions/extension_popup_controller.h" | 23 #import "chrome/browser/cocoa/extensions/extension_popup_controller.h" |
23 #import "chrome/browser/cocoa/first_run_bubble_controller.h" | 24 #import "chrome/browser/cocoa/first_run_bubble_controller.h" |
24 #import "chrome/browser/cocoa/location_bar/autocomplete_text_field.h" | 25 #import "chrome/browser/cocoa/location_bar/autocomplete_text_field.h" |
25 #import "chrome/browser/cocoa/location_bar/autocomplete_text_field_cell.h" | 26 #import "chrome/browser/cocoa/location_bar/autocomplete_text_field_cell.h" |
26 #import "chrome/browser/cocoa/location_bar/content_setting_decoration.h" | 27 #import "chrome/browser/cocoa/location_bar/content_setting_decoration.h" |
27 #import "chrome/browser/cocoa/location_bar/ev_bubble_decoration.h" | 28 #import "chrome/browser/cocoa/location_bar/ev_bubble_decoration.h" |
28 #import "chrome/browser/cocoa/location_bar/keyword_hint_decoration.h" | 29 #import "chrome/browser/cocoa/location_bar/keyword_hint_decoration.h" |
29 #import "chrome/browser/cocoa/location_bar/location_icon_decoration.h" | 30 #import "chrome/browser/cocoa/location_bar/location_icon_decoration.h" |
30 #import "chrome/browser/cocoa/location_bar/page_action_decoration.h" | 31 #import "chrome/browser/cocoa/location_bar/page_action_decoration.h" |
31 #import "chrome/browser/cocoa/location_bar/selected_keyword_decoration.h" | 32 #import "chrome/browser/cocoa/location_bar/selected_keyword_decoration.h" |
32 #import "chrome/browser/cocoa/location_bar/star_decoration.h" | 33 #import "chrome/browser/cocoa/location_bar/star_decoration.h" |
33 #include "chrome/browser/command_updater.h" | 34 #include "chrome/browser/command_updater.h" |
34 #include "chrome/browser/content_setting_image_model.h" | 35 #include "chrome/browser/content_setting_image_model.h" |
35 #include "chrome/browser/content_setting_bubble_model.h" | 36 #include "chrome/browser/content_setting_bubble_model.h" |
36 #include "chrome/browser/defaults.h" | 37 #include "chrome/browser/defaults.h" |
37 #include "chrome/browser/extensions/extension_browser_event_router.h" | 38 #include "chrome/browser/extensions/extension_browser_event_router.h" |
38 #include "chrome/browser/extensions/extensions_service.h" | 39 #include "chrome/browser/extensions/extensions_service.h" |
39 #include "chrome/browser/extensions/extension_tabs_module.h" | 40 #include "chrome/browser/extensions/extension_tabs_module.h" |
| 41 #include "chrome/browser/instant/instant_controller.h" |
40 #include "chrome/browser/location_bar_util.h" | 42 #include "chrome/browser/location_bar_util.h" |
41 #include "chrome/browser/profile.h" | 43 #include "chrome/browser/profile.h" |
42 #include "chrome/browser/search_engines/template_url.h" | 44 #include "chrome/browser/search_engines/template_url.h" |
43 #include "chrome/browser/search_engines/template_url_model.h" | 45 #include "chrome/browser/search_engines/template_url_model.h" |
44 #include "chrome/browser/tab_contents/navigation_entry.h" | 46 #include "chrome/browser/tab_contents/navigation_entry.h" |
45 #include "chrome/browser/tab_contents/tab_contents.h" | 47 #include "chrome/browser/tab_contents/tab_contents.h" |
46 #include "chrome/common/extensions/extension.h" | 48 #include "chrome/common/extensions/extension.h" |
47 #include "chrome/common/extensions/extension_action.h" | 49 #include "chrome/common/extensions/extension_action.h" |
48 #include "chrome/common/extensions/extension_resource.h" | 50 #include "chrome/common/extensions/extension_resource.h" |
49 #include "chrome/common/notification_service.h" | 51 #include "chrome/common/notification_service.h" |
(...skipping 25 matching lines...) Expand all Loading... |
75 AutocompleteEditViewMac::GetFieldFont())), | 77 AutocompleteEditViewMac::GetFieldFont())), |
76 ev_bubble_decoration_( | 78 ev_bubble_decoration_( |
77 new EVBubbleDecoration(location_icon_decoration_.get(), | 79 new EVBubbleDecoration(location_icon_decoration_.get(), |
78 AutocompleteEditViewMac::GetFieldFont())), | 80 AutocompleteEditViewMac::GetFieldFont())), |
79 star_decoration_(new StarDecoration(command_updater)), | 81 star_decoration_(new StarDecoration(command_updater)), |
80 keyword_hint_decoration_( | 82 keyword_hint_decoration_( |
81 new KeywordHintDecoration(AutocompleteEditViewMac::GetFieldFont())), | 83 new KeywordHintDecoration(AutocompleteEditViewMac::GetFieldFont())), |
82 profile_(profile), | 84 profile_(profile), |
83 browser_(browser), | 85 browser_(browser), |
84 toolbar_model_(toolbar_model), | 86 toolbar_model_(toolbar_model), |
| 87 update_instant_(true), |
85 transition_(PageTransition::TYPED), | 88 transition_(PageTransition::TYPED), |
86 first_run_bubble_(this) { | 89 first_run_bubble_(this) { |
87 for (size_t i = 0; i < CONTENT_SETTINGS_NUM_TYPES; ++i) { | 90 for (size_t i = 0; i < CONTENT_SETTINGS_NUM_TYPES; ++i) { |
88 DCHECK_EQ(i, content_setting_decorations_.size()); | 91 DCHECK_EQ(i, content_setting_decorations_.size()); |
89 ContentSettingsType type = static_cast<ContentSettingsType>(i); | 92 ContentSettingsType type = static_cast<ContentSettingsType>(i); |
90 content_setting_decorations_.push_back( | 93 content_setting_decorations_.push_back( |
91 new ContentSettingDecoration(type, this, profile_)); | 94 new ContentSettingDecoration(type, this, profile_)); |
92 } | 95 } |
93 | 96 |
94 registrar_.Add(this, | 97 registrar_.Add(this, |
(...skipping 23 matching lines...) Expand all Loading... |
118 // of the left omnibox icon, so shift x and y co-ordinates. | 121 // of the left omnibox icon, so shift x and y co-ordinates. |
119 const NSPoint kOffset = NSMakePoint(1, 4); | 122 const NSPoint kOffset = NSMakePoint(1, 4); |
120 [FirstRunBubbleController showForView:field_ offset:kOffset profile:profile_]; | 123 [FirstRunBubbleController showForView:field_ offset:kOffset profile:profile_]; |
121 } | 124 } |
122 | 125 |
123 std::wstring LocationBarViewMac::GetInputString() const { | 126 std::wstring LocationBarViewMac::GetInputString() const { |
124 return location_input_; | 127 return location_input_; |
125 } | 128 } |
126 | 129 |
127 void LocationBarViewMac::SetSuggestedText(const string16& text) { | 130 void LocationBarViewMac::SetSuggestedText(const string16& text) { |
128 // TODO: implement me. | 131 // TODO(rohitrao): implement me. http://crbug.com/56385 |
129 NOTIMPLEMENTED(); | |
130 } | 132 } |
131 | 133 |
132 WindowOpenDisposition LocationBarViewMac::GetWindowOpenDisposition() const { | 134 WindowOpenDisposition LocationBarViewMac::GetWindowOpenDisposition() const { |
133 return disposition_; | 135 return disposition_; |
134 } | 136 } |
135 | 137 |
136 PageTransition::Type LocationBarViewMac::GetPageTransition() const { | 138 PageTransition::Type LocationBarViewMac::GetPageTransition() const { |
137 return transition_; | 139 return transition_; |
138 } | 140 } |
139 | 141 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 command_updater_->UpdateCommandEnabled(IDC_BOOKMARK_PAGE, star_enabled); | 196 command_updater_->UpdateCommandEnabled(IDC_BOOKMARK_PAGE, star_enabled); |
195 star_decoration_->SetVisible(star_enabled); | 197 star_decoration_->SetVisible(star_enabled); |
196 RefreshPageActionDecorations(); | 198 RefreshPageActionDecorations(); |
197 RefreshContentSettingsDecorations(); | 199 RefreshContentSettingsDecorations(); |
198 // AutocompleteEditView restores state if the tab is non-NULL. | 200 // AutocompleteEditView restores state if the tab is non-NULL. |
199 edit_view_->Update(should_restore_state ? contents : NULL); | 201 edit_view_->Update(should_restore_state ? contents : NULL); |
200 OnChanged(); | 202 OnChanged(); |
201 } | 203 } |
202 | 204 |
203 void LocationBarViewMac::OnAutocompleteWillClosePopup() { | 205 void LocationBarViewMac::OnAutocompleteWillClosePopup() { |
| 206 if (!update_instant_) |
| 207 return; |
| 208 |
| 209 InstantController* controller = browser_->instant(); |
| 210 if (controller && !controller->commit_on_mouse_up()) |
| 211 controller->DestroyPreviewContents(); |
204 } | 212 } |
205 | 213 |
206 void LocationBarViewMac::OnAutocompleteLosingFocus(gfx::NativeView unused) { | 214 void LocationBarViewMac::OnAutocompleteLosingFocus(gfx::NativeView unused) { |
| 215 InstantController* instant = browser_->instant(); |
| 216 if (!instant) |
| 217 return; |
| 218 |
| 219 if (!instant->is_active() || !instant->GetPreviewContents()) |
| 220 return; |
| 221 |
| 222 // If |IsMouseDownFromActivate()| returns false, the RenderWidgetHostView did |
| 223 // not receive a mouseDown event. Therefore, we should destroy the preview. |
| 224 // Otherwise, the RWHV was clicked, so we commit the preview. |
| 225 if (!instant->IsMouseDownFromActivate()) |
| 226 instant->DestroyPreviewContents(); |
| 227 else if (instant->IsShowingInstant()) |
| 228 instant->SetCommitOnMouseUp(); |
| 229 else |
| 230 instant->CommitCurrentPreview(INSTANT_COMMIT_FOCUS_LOST); |
207 } | 231 } |
208 | 232 |
209 void LocationBarViewMac::OnAutocompleteWillAccept() { | 233 void LocationBarViewMac::OnAutocompleteWillAccept() { |
| 234 update_instant_ = false; |
210 } | 235 } |
211 | 236 |
212 bool LocationBarViewMac::OnCommitSuggestedText(const std::wstring& typed_text) { | 237 bool LocationBarViewMac::OnCommitSuggestedText(const std::wstring& typed_text) { |
213 return false; | 238 return false; |
214 } | 239 } |
215 | 240 |
216 void LocationBarViewMac::OnPopupBoundsChanged(const gfx::Rect& bounds) { | 241 void LocationBarViewMac::OnPopupBoundsChanged(const gfx::Rect& bounds) { |
217 } | 242 } |
218 | 243 |
219 void LocationBarViewMac::OnAutocompleteAccept(const GURL& url, | 244 void LocationBarViewMac::OnAutocompleteAccept(const GURL& url, |
220 WindowOpenDisposition disposition, | 245 WindowOpenDisposition disposition, |
221 PageTransition::Type transition, | 246 PageTransition::Type transition, |
222 const GURL& alternate_nav_url) { | 247 const GURL& alternate_nav_url) { |
223 if (!url.is_valid()) | 248 // WARNING: don't add an early return here. The calls after the if must |
224 return; | 249 // happen. |
| 250 if (url.is_valid()) { |
| 251 location_input_ = UTF8ToWide(url.spec()); |
| 252 disposition_ = disposition; |
| 253 transition_ = transition; |
225 | 254 |
226 location_input_ = UTF8ToWide(url.spec()); | 255 if (command_updater_) { |
227 disposition_ = disposition; | 256 if (!alternate_nav_url.is_valid()) { |
228 transition_ = transition; | 257 command_updater_->ExecuteCommand(IDC_OPEN_CURRENT_URL); |
229 | 258 } else { |
230 if (!command_updater_) | 259 AlternateNavURLFetcher* fetcher = |
231 return; | 260 new AlternateNavURLFetcher(alternate_nav_url); |
232 | 261 // The AlternateNavURLFetcher will listen for the pending navigation |
233 if (!alternate_nav_url.is_valid()) { | 262 // notification that will be issued as a result of the "open URL." It |
234 command_updater_->ExecuteCommand(IDC_OPEN_CURRENT_URL); | 263 // will automatically install itself into that navigation controller. |
235 return; | 264 command_updater_->ExecuteCommand(IDC_OPEN_CURRENT_URL); |
| 265 if (fetcher->state() == AlternateNavURLFetcher::NOT_STARTED) { |
| 266 // I'm not sure this should be reachable, but I'm not also sure enough |
| 267 // that it shouldn't to stick in a NOTREACHED(). In any case, this is |
| 268 // harmless. |
| 269 delete fetcher; |
| 270 } else { |
| 271 // The navigation controller will delete the fetcher. |
| 272 } |
| 273 } |
| 274 } |
236 } | 275 } |
237 | 276 |
238 AlternateNavURLFetcher* fetcher = | 277 if (browser_->instant()) |
239 new AlternateNavURLFetcher(alternate_nav_url); | 278 browser_->instant()->DestroyPreviewContents(); |
240 // The AlternateNavURLFetcher will listen for the pending navigation | 279 |
241 // notification that will be issued as a result of the "open URL." It | 280 update_instant_ = true; |
242 // will automatically install itself into that navigation controller. | |
243 command_updater_->ExecuteCommand(IDC_OPEN_CURRENT_URL); | |
244 if (fetcher->state() == AlternateNavURLFetcher::NOT_STARTED) { | |
245 // I'm not sure this should be reachable, but I'm not also sure enough | |
246 // that it shouldn't to stick in a NOTREACHED(). In any case, this is | |
247 // harmless. | |
248 delete fetcher; | |
249 } else { | |
250 // The navigation controller will delete the fetcher. | |
251 } | |
252 } | 281 } |
253 | 282 |
254 void LocationBarViewMac::OnChanged() { | 283 void LocationBarViewMac::OnChanged() { |
255 // Update the location-bar icon. | 284 // Update the location-bar icon. |
256 const int resource_id = edit_view_->GetIcon(); | 285 const int resource_id = edit_view_->GetIcon(); |
257 NSImage* image = AutocompleteEditViewMac::ImageForResource(resource_id); | 286 NSImage* image = AutocompleteEditViewMac::ImageForResource(resource_id); |
258 location_icon_decoration_->SetImage(image); | 287 location_icon_decoration_->SetImage(image); |
259 ev_bubble_decoration_->SetImage(image); | 288 ev_bubble_decoration_->SetImage(image); |
260 Layout(); | 289 Layout(); |
| 290 |
| 291 InstantController* instant = browser_->instant(); |
| 292 string16 suggested_text; |
| 293 if (update_instant_ && instant && GetTabContents()) { |
| 294 if (edit_view_->model()->user_input_in_progress() && |
| 295 edit_view_->model()->popup_model()->IsOpen()) { |
| 296 instant->Update(GetTabContents(), |
| 297 edit_view_->model()->CurrentMatch(), |
| 298 WideToUTF16(edit_view_->GetText()), |
| 299 &suggested_text); |
| 300 } else { |
| 301 if (instant->is_active()) |
| 302 instant->DestroyPreviewContents(); |
| 303 } |
| 304 } |
261 } | 305 } |
262 | 306 |
263 void LocationBarViewMac::OnInputInProgress(bool in_progress) { | 307 void LocationBarViewMac::OnInputInProgress(bool in_progress) { |
264 toolbar_model_->set_input_in_progress(in_progress); | 308 toolbar_model_->set_input_in_progress(in_progress); |
265 Update(NULL, false); | 309 Update(NULL, false); |
266 } | 310 } |
267 | 311 |
268 void LocationBarViewMac::OnSetFocus() { | 312 void LocationBarViewMac::OnSetFocus() { |
269 // Update the keyword and search hint states. | 313 // Update the keyword and search hint states. |
270 OnChanged(); | 314 OnChanged(); |
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
593 | 637 |
594 // These need to change anytime the layout changes. | 638 // These need to change anytime the layout changes. |
595 // TODO(shess): Anytime the field editor might have changed, the | 639 // TODO(shess): Anytime the field editor might have changed, the |
596 // cursor rects almost certainly should have changed. The tooltips | 640 // cursor rects almost certainly should have changed. The tooltips |
597 // might change even when the rects don't change. | 641 // might change even when the rects don't change. |
598 [field_ resetFieldEditorFrameIfNeeded]; | 642 [field_ resetFieldEditorFrameIfNeeded]; |
599 [field_ updateCursorAndToolTipRects]; | 643 [field_ updateCursorAndToolTipRects]; |
600 | 644 |
601 [field_ setNeedsDisplay:YES]; | 645 [field_ setNeedsDisplay:YES]; |
602 } | 646 } |
OLD | NEW |