Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(36)

Side by Side Diff: chrome/browser/views/location_bar_view.cc

Issue 1056002: Omnibox M5 work, part 1: Security changes... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/views/location_bar_view.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 #include "chrome/browser/views/location_bar_view.h" 5 #include "chrome/browser/views/location_bar_view.h"
6 6
7 #if defined(OS_LINUX) 7 #if defined(OS_LINUX)
8 #include <gtk/gtk.h> 8 #include <gtk/gtk.h>
9 #endif 9 #endif
10 10
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
50 // Padding on the right and left of the entry field. 50 // Padding on the right and left of the entry field.
51 static const int kEntryPadding = 3; 51 static const int kEntryPadding = 3;
52 52
53 // Padding between the entry and the leading/trailing views. 53 // Padding between the entry and the leading/trailing views.
54 static const int kInnerPadding = 3; 54 static const int kInnerPadding = 3;
55 55
56 static const SkBitmap* kBackground = NULL; 56 static const SkBitmap* kBackground = NULL;
57 57
58 static const SkBitmap* kPopupBackground = NULL; 58 static const SkBitmap* kPopupBackground = NULL;
59 59
60 // The delay the mouse has to be hovering over the lock/warning icon before the
61 // info bubble is shown.
62 static const int kInfoBubbleHoverDelayMs = 500;
63
64 // The tab key image. 60 // The tab key image.
65 static const SkBitmap* kTabButtonBitmap = NULL; 61 static const SkBitmap* kTabButtonBitmap = NULL;
66 62
67 // Returns the short name for a keyword. 63 // Returns the short name for a keyword.
68 static std::wstring GetKeywordName(Profile* profile, 64 static std::wstring GetKeywordName(Profile* profile,
69 const std::wstring& keyword) { 65 const std::wstring& keyword) {
70 // Make sure the TemplateURL still exists. 66 // Make sure the TemplateURL still exists.
71 // TODO(sky): Once LocationBarView adds a listener to the TemplateURLModel 67 // TODO(sky): Once LocationBarView adds a listener to the TemplateURLModel
72 // to track changes to the model, this should become a DCHECK. 68 // to track changes to the model, this should become a DCHECK.
73 const TemplateURL* template_url = 69 const TemplateURL* template_url =
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
132 CommandUpdater* command_updater, 128 CommandUpdater* command_updater,
133 ToolbarModel* model, 129 ToolbarModel* model,
134 Delegate* delegate, 130 Delegate* delegate,
135 bool popup_window_mode, 131 bool popup_window_mode,
136 const BubblePositioner* bubble_positioner) 132 const BubblePositioner* bubble_positioner)
137 : profile_(profile), 133 : profile_(profile),
138 command_updater_(command_updater), 134 command_updater_(command_updater),
139 model_(model), 135 model_(model),
140 delegate_(delegate), 136 delegate_(delegate),
141 disposition_(CURRENT_TAB), 137 disposition_(CURRENT_TAB),
138 security_image_view_(this),
142 location_entry_view_(NULL), 139 location_entry_view_(NULL),
143 selected_keyword_view_(profile), 140 selected_keyword_view_(profile),
144 keyword_hint_view_(profile), 141 keyword_hint_view_(profile),
145 type_to_search_view_(l10n_util::GetString(IDS_OMNIBOX_EMPTY_TEXT)), 142 type_to_search_view_(l10n_util::GetString(IDS_OMNIBOX_EMPTY_TEXT)),
146 security_image_view_(this, profile, model, bubble_positioner),
147 popup_window_mode_(popup_window_mode), 143 popup_window_mode_(popup_window_mode),
148 first_run_bubble_(this), 144 first_run_bubble_(this),
149 bubble_positioner_(bubble_positioner) { 145 bubble_positioner_(bubble_positioner) {
150 DCHECK(profile_); 146 DCHECK(profile_);
151 SetID(VIEW_ID_LOCATION_BAR); 147 SetID(VIEW_ID_LOCATION_BAR);
152 SetFocusable(true); 148 SetFocusable(true);
153 149
154 if (!kBackground) { 150 if (!kBackground) {
155 ResourceBundle &rb = ResourceBundle::GetSharedInstance(); 151 ResourceBundle &rb = ResourceBundle::GetSharedInstance();
156 kBackground = rb.GetBitmapNamed(IDR_LOCATIONBG); 152 kBackground = rb.GetBitmapNamed(IDR_LOCATIONBG);
157 kPopupBackground = rb.GetBitmapNamed(IDR_LOCATIONBG_POPUPMODE_CENTER); 153 kPopupBackground = rb.GetBitmapNamed(IDR_LOCATIONBG_POPUPMODE_CENTER);
158 } 154 }
159 } 155 }
160 156
161 LocationBarView::~LocationBarView() { 157 LocationBarView::~LocationBarView() {
162 } 158 }
163 159
164 void LocationBarView::Init() { 160 void LocationBarView::Init() {
165 if (popup_window_mode_) { 161 if (popup_window_mode_) {
166 font_ = ResourceBundle::GetSharedInstance().GetFont( 162 font_ = ResourceBundle::GetSharedInstance().GetFont(
167 ResourceBundle::BaseFont); 163 ResourceBundle::BaseFont);
168 } else { 164 } else {
169 // Use a larger version of the system font. 165 // Use a larger version of the system font.
170 font_ = font_.DeriveFont(3); 166 font_ = font_.DeriveFont(3);
171 } 167 }
172 168
169 AddChildView(&security_image_view_);
170 security_image_view_.SetVisible(false);
171 security_image_view_.set_parent_owned(false);
172
173 // URL edit field. 173 // URL edit field.
174 // View container for URL edit field. 174 // View container for URL edit field.
175 #if defined(OS_WIN) 175 #if defined(OS_WIN)
176 views::Widget* widget = GetWidget();
177 location_entry_.reset(new AutocompleteEditViewWin(font_, this, model_, this, 176 location_entry_.reset(new AutocompleteEditViewWin(font_, this, model_, this,
178 widget->GetNativeView(), 177 GetWidget()->GetNativeView(), profile_, command_updater_,
179 profile_, command_updater_, 178 popup_window_mode_, bubble_positioner_));
180 popup_window_mode_,
181 bubble_positioner_));
182 #else 179 #else
183 location_entry_.reset(new AutocompleteEditViewGtk(this, model_, profile_, 180 location_entry_.reset(new AutocompleteEditViewGtk(this, model_, profile_,
184 command_updater_, 181 command_updater_, popup_window_mode_, bubble_positioner_));
185 popup_window_mode_,
186 bubble_positioner_));
187 location_entry_->Init(); 182 location_entry_->Init();
188 // Make all the children of the widget visible. NOTE: this won't display 183 // Make all the children of the widget visible. NOTE: this won't display
189 // anything, it just toggles the visible flag. 184 // anything, it just toggles the visible flag.
190 gtk_widget_show_all(location_entry_->widget()); 185 gtk_widget_show_all(location_entry_->GetNativeView());
191 // Hide the widget. NativeViewHostGtk will make it visible again as 186 // Hide the widget. NativeViewHostGtk will make it visible again as
192 // necessary. 187 // necessary.
193 gtk_widget_hide(location_entry_->widget()); 188 gtk_widget_hide(location_entry_->GetNativeView());
194 #endif 189 #endif
195 location_entry_view_ = new views::NativeViewHost; 190 location_entry_view_ = new views::NativeViewHost;
196 location_entry_view_->SetID(VIEW_ID_AUTOCOMPLETE); 191 location_entry_view_->SetID(VIEW_ID_AUTOCOMPLETE);
197 AddChildView(location_entry_view_); 192 AddChildView(location_entry_view_);
198 location_entry_view_->set_focus_view(this); 193 location_entry_view_->set_focus_view(this);
199 location_entry_view_->Attach( 194 location_entry_view_->Attach(location_entry_->GetNativeView());
200 #if defined(OS_WIN)
201 location_entry_->m_hWnd
202 #else
203 location_entry_->widget()
204 #endif
205 ); // NOLINT
206 195
207 AddChildView(&selected_keyword_view_); 196 AddChildView(&selected_keyword_view_);
208 selected_keyword_view_.SetFont(font_); 197 selected_keyword_view_.SetFont(font_);
209 selected_keyword_view_.SetVisible(false); 198 selected_keyword_view_.SetVisible(false);
210 selected_keyword_view_.set_parent_owned(false); 199 selected_keyword_view_.set_parent_owned(false);
211 200
212 SkColor dimmed_text = GetColor(false, DEEMPHASIZED_TEXT); 201 SkColor dimmed_text = GetColor(ToolbarModel::NONE, DEEMPHASIZED_TEXT);
213 202
214 AddChildView(&type_to_search_view_); 203 AddChildView(&type_to_search_view_);
215 type_to_search_view_.SetVisible(false); 204 type_to_search_view_.SetVisible(false);
216 type_to_search_view_.SetFont(font_); 205 type_to_search_view_.SetFont(font_);
217 type_to_search_view_.SetColor(dimmed_text); 206 type_to_search_view_.SetColor(dimmed_text);
218 type_to_search_view_.set_parent_owned(false); 207 type_to_search_view_.set_parent_owned(false);
219 208
220 AddChildView(&keyword_hint_view_); 209 AddChildView(&keyword_hint_view_);
221 keyword_hint_view_.SetVisible(false); 210 keyword_hint_view_.SetVisible(false);
222 keyword_hint_view_.SetFont(font_); 211 keyword_hint_view_.SetFont(font_);
223 keyword_hint_view_.SetColor(dimmed_text); 212 keyword_hint_view_.SetColor(dimmed_text);
224 keyword_hint_view_.set_parent_owned(false); 213 keyword_hint_view_.set_parent_owned(false);
225 214
226 AddChildView(&security_image_view_); 215 AddChildView(&security_info_label_);
227 security_image_view_.SetVisible(false); 216 security_info_label_.SetVisible(false);
228 security_image_view_.set_parent_owned(false); 217 security_info_label_.set_parent_owned(false);
229 218
230 for (int i = 0; i < CONTENT_SETTINGS_NUM_TYPES; ++i) { 219 for (int i = 0; i < CONTENT_SETTINGS_NUM_TYPES; ++i) {
231 ContentSettingImageView* content_blocked_view = 220 ContentSettingImageView* content_blocked_view =
232 new ContentSettingImageView(static_cast<ContentSettingsType>(i), this, 221 new ContentSettingImageView(static_cast<ContentSettingsType>(i), this,
233 profile_, bubble_positioner_); 222 profile_, bubble_positioner_);
234 content_setting_views_.push_back(content_blocked_view); 223 content_setting_views_.push_back(content_blocked_view);
235 AddChildView(content_blocked_view); 224 AddChildView(content_blocked_view);
236 content_blocked_view->SetVisible(false); 225 content_blocked_view->SetVisible(false);
237 } 226 }
238 227
239 AddChildView(&info_label_);
240 info_label_.SetVisible(false);
241 info_label_.set_parent_owned(false);
242
243 // Notify us when any ancestor is resized. In this case we want to tell the 228 // Notify us when any ancestor is resized. In this case we want to tell the
244 // AutocompleteEditView to close its popup. 229 // AutocompleteEditView to close its popup.
245 SetNotifyWhenVisibleBoundsInRootChanges(true); 230 SetNotifyWhenVisibleBoundsInRootChanges(true);
246 231
247 // Initialize the location entry. We do this to avoid a black flash which is 232 // Initialize the location entry. We do this to avoid a black flash which is
248 // visible when the location entry has just been initialized. 233 // visible when the location entry has just been initialized.
249 Update(NULL); 234 Update(NULL);
250 235
251 OnChanged(); 236 OnChanged();
252 } 237 }
253 238
254 bool LocationBarView::IsInitialized() const { 239 bool LocationBarView::IsInitialized() const {
255 return location_entry_view_ != NULL; 240 return location_entry_view_ != NULL;
256 } 241 }
257 242
258 // static 243 // static
259 SkColor LocationBarView::GetColor(bool is_secure, ColorKind kind) { 244 SkColor LocationBarView::GetColor(ToolbarModel::SecurityLevel security_level,
260 enum SecurityState { 245 ColorKind kind) {
261 NOT_SECURE = 0, 246 switch (kind) {
262 SECURE,
263 NUM_STATES
264 };
265
266 static bool initialized = false;
267 static SkColor colors[NUM_STATES][NUM_KINDS];
268 if (!initialized) {
269 #if defined(OS_WIN) 247 #if defined(OS_WIN)
270 colors[NOT_SECURE][BACKGROUND] = color_utils::GetSysSkColor(COLOR_WINDOW); 248 case BACKGROUND: return color_utils::GetSysSkColor(COLOR_WINDOW);
271 colors[NOT_SECURE][TEXT] = color_utils::GetSysSkColor(COLOR_WINDOWTEXT); 249 case TEXT: return color_utils::GetSysSkColor(COLOR_WINDOWTEXT);
272 colors[NOT_SECURE][SELECTED_TEXT] = 250 case SELECTED_TEXT: return color_utils::GetSysSkColor(COLOR_HIGHLIGHTTEXT);
273 color_utils::GetSysSkColor(COLOR_HIGHLIGHTTEXT);
274 #else 251 #else
275 // TODO(beng): source from theme provider. 252 // TODO(beng): source from theme provider.
276 colors[NOT_SECURE][BACKGROUND] = SK_ColorWHITE; 253 case BACKGROUND: return SK_ColorWHITE;
277 colors[NOT_SECURE][TEXT] = SK_ColorBLACK; 254 case TEXT: return SK_ColorBLACK;
278 colors[NOT_SECURE][SELECTED_TEXT] = SK_ColorWHITE; 255 case SELECTED_TEXT: return SK_ColorWHITE;
279 #endif 256 #endif
280 colors[SECURE][BACKGROUND] = SkColorSetRGB(255, 245, 195); 257
281 colors[SECURE][TEXT] = SK_ColorBLACK; 258 case DEEMPHASIZED_TEXT:
282 colors[SECURE][SELECTED_TEXT] = 0; // Unused 259 return color_utils::AlphaBlend(GetColor(security_level, TEXT),
283 colors[NOT_SECURE][DEEMPHASIZED_TEXT] = 260 GetColor(security_level, BACKGROUND), 128);
284 color_utils::AlphaBlend(colors[NOT_SECURE][TEXT], 261
285 colors[NOT_SECURE][BACKGROUND], 128); 262 case SECURITY_TEXT: {
286 colors[SECURE][DEEMPHASIZED_TEXT] = 263 SkColor color;
287 color_utils::AlphaBlend(colors[SECURE][TEXT], 264 switch (security_level) {
288 colors[SECURE][BACKGROUND], 128); 265 case ToolbarModel::EV_SECURE:
289 colors[NOT_SECURE][SECURITY_TEXT] = color_utils::GetReadableColor( 266 color = SkColorSetRGB(7, 149, 0);
290 SkColorSetRGB(200, 0, 0), colors[NOT_SECURE][BACKGROUND]); 267 break;
291 colors[SECURE][SECURITY_TEXT] = SkColorSetRGB(0, 150, 20); 268
292 colors[NOT_SECURE][SECURITY_INFO_BUBBLE_TEXT] = 269 case ToolbarModel::SECURE:
293 colors[NOT_SECURE][SECURITY_TEXT]; 270 case ToolbarModel::SECURITY_WARNING:
294 colors[SECURE][SECURITY_INFO_BUBBLE_TEXT] = color_utils::GetReadableColor( 271 color = SkColorSetRGB(0, 14, 149);
295 SkColorSetRGB(0, 153, 51), colors[NOT_SECURE][BACKGROUND]); 272 break;
296 colors[NOT_SECURE][SCHEME_STRIKEOUT] = color_utils::GetReadableColor( 273
297 SkColorSetRGB(210, 0, 0), colors[NOT_SECURE][BACKGROUND]); 274 case ToolbarModel::SECURITY_ERROR:
298 colors[SECURE][SCHEME_STRIKEOUT] = 0; // Unused 275 color = SkColorSetRGB(162, 0, 0);
299 initialized = true; 276 break;
277
278 default:
279 NOTREACHED();
280 return GetColor(security_level, TEXT);
281 }
282 return color_utils::GetReadableColor(color, GetColor(security_level,
283 BACKGROUND));
284 }
285
286 default:
287 NOTREACHED();
288 return GetColor(security_level, TEXT);
300 } 289 }
301
302 return colors[is_secure ? SECURE : NOT_SECURE][kind];
303 } 290 }
304 291
305 void LocationBarView::Update(const TabContents* tab_for_state_restoring) { 292 void LocationBarView::Update(const TabContents* tab_for_state_restoring) {
306 SetSecurityIcon(model_->GetIcon()); 293 security_image_view_.SetSecurityIcon(model_->GetSecurityIcon());
294 // The visibility of the |security_info_label_| will be set during layout.
295 std::wstring security_info_text(model_->GetSecurityInfoText());
296 security_info_label_.SetText(security_info_text);
297 if (!security_info_text.empty()) {
298 security_info_label_.SetColor(GetColor(model_->GetSecurityLevel(),
299 SECURITY_TEXT));
300 }
301
307 RefreshContentSettingViews(); 302 RefreshContentSettingViews();
308 RefreshPageActionViews(); 303 RefreshPageActionViews();
309 std::wstring info_text, info_tooltip;
310 ToolbarModel::InfoTextType info_text_type =
311 model_->GetInfoText(&info_text, &info_tooltip);
312 SetInfoText(info_text, info_text_type, info_tooltip);
313 location_entry_->Update(tab_for_state_restoring); 304 location_entry_->Update(tab_for_state_restoring);
314 Layout(); 305 Layout();
315 SchedulePaint(); 306 SchedulePaint();
316 } 307 }
317 308
318 void LocationBarView::UpdateContentSettingsIcons() { 309 void LocationBarView::UpdateContentSettingsIcons() {
319 RefreshContentSettingViews(); 310 RefreshContentSettingViews();
320 311
321 Layout(); 312 Layout();
322 SchedulePaint(); 313 SchedulePaint();
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
355 void LocationBarView::SetProfile(Profile* profile) { 346 void LocationBarView::SetProfile(Profile* profile) {
356 DCHECK(profile); 347 DCHECK(profile);
357 if (profile_ != profile) { 348 if (profile_ != profile) {
358 profile_ = profile; 349 profile_ = profile;
359 location_entry_->model()->SetProfile(profile); 350 location_entry_->model()->SetProfile(profile);
360 selected_keyword_view_.set_profile(profile); 351 selected_keyword_view_.set_profile(profile);
361 keyword_hint_view_.set_profile(profile); 352 keyword_hint_view_.set_profile(profile);
362 for (ContentSettingViews::const_iterator i(content_setting_views_.begin()); 353 for (ContentSettingViews::const_iterator i(content_setting_views_.begin());
363 i != content_setting_views_.end(); ++i) 354 i != content_setting_views_.end(); ++i)
364 (*i)->set_profile(profile); 355 (*i)->set_profile(profile);
365 security_image_view_.set_profile(profile);
366 } 356 }
367 } 357 }
368 358
369 TabContents* LocationBarView::GetTabContents() const { 359 TabContents* LocationBarView::GetTabContents() const {
370 return delegate_->GetTabContents(); 360 return delegate_->GetTabContents();
371 } 361 }
372 362
373 void LocationBarView::SetPreviewEnabledPageAction(ExtensionAction *page_action, 363 void LocationBarView::SetPreviewEnabledPageAction(ExtensionAction *page_action,
374 bool preview_enabled) { 364 bool preview_enabled) {
375 DCHECK(page_action); 365 DCHECK(page_action);
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
412 void LocationBarView::Paint(gfx::Canvas* canvas) { 402 void LocationBarView::Paint(gfx::Canvas* canvas) {
413 View::Paint(canvas); 403 View::Paint(canvas);
414 404
415 const SkBitmap* background = 405 const SkBitmap* background =
416 popup_window_mode_ ? 406 popup_window_mode_ ?
417 kPopupBackground : 407 kPopupBackground :
418 GetThemeProvider()->GetBitmapNamed(IDR_LOCATIONBG); 408 GetThemeProvider()->GetBitmapNamed(IDR_LOCATIONBG);
419 409
420 canvas->TileImageInt(*background, 0, 0, 0, 0, width(), height()); 410 canvas->TileImageInt(*background, 0, 0, 0, 0, width(), height());
421 int top_margin = TopMargin(); 411 int top_margin = TopMargin();
422 canvas->FillRectInt( 412 canvas->FillRectInt(GetColor(ToolbarModel::NONE, BACKGROUND), 0,
423 GetColor(model_->GetSchemeSecurityLevel() == ToolbarModel::SECURE, 413 top_margin, width(),
424 BACKGROUND), 414 std::max(height() - top_margin - kVertMargin, 0));
425 0, top_margin, width(), std::max(height() - top_margin - kVertMargin, 0));
426 } 415 }
427 416
428 void LocationBarView::VisibleBoundsInRootChanged() { 417 void LocationBarView::VisibleBoundsInRootChanged() {
429 location_entry_->ClosePopup(); 418 location_entry_->ClosePopup();
430 } 419 }
431 420
432 #if defined(OS_WIN) 421 #if defined(OS_WIN)
433 bool LocationBarView::OnMousePressed(const views::MouseEvent& event) { 422 bool LocationBarView::OnMousePressed(const views::MouseEvent& event) {
434 UINT msg; 423 UINT msg;
435 if (event.IsLeftMouseButton()) { 424 if (event.IsLeftMouseButton()) {
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
539 DCHECK(delegate_->GetTabContents()); 528 DCHECK(delegate_->GetTabContents());
540 return UTF16ToWideHack(delegate_->GetTabContents()->GetTitle()); 529 return UTF16ToWideHack(delegate_->GetTabContents()->GetTitle());
541 } 530 }
542 531
543 void LocationBarView::DoLayout(const bool force_layout) { 532 void LocationBarView::DoLayout(const bool force_layout) {
544 if (!location_entry_.get()) 533 if (!location_entry_.get())
545 return; 534 return;
546 535
547 int entry_width = width() - (kEntryPadding * 2); 536 int entry_width = width() - (kEntryPadding * 2);
548 537
538 gfx::Size security_image_size;
539 if (security_image_view_.IsVisible()) {
540 security_image_size = security_image_view_.GetPreferredSize();
541 entry_width -= security_image_size.width() + kInnerPadding;
542 }
549 for (PageActionViews::const_iterator i(page_action_views_.begin()); 543 for (PageActionViews::const_iterator i(page_action_views_.begin());
550 i != page_action_views_.end(); ++i) { 544 i != page_action_views_.end(); ++i) {
551 if ((*i)->IsVisible()) 545 if ((*i)->IsVisible())
552 entry_width -= (*i)->GetPreferredSize().width() + kInnerPadding; 546 entry_width -= (*i)->GetPreferredSize().width() + kInnerPadding;
553 } 547 }
554 for (ContentSettingViews::const_iterator i(content_setting_views_.begin()); 548 for (ContentSettingViews::const_iterator i(content_setting_views_.begin());
555 i != content_setting_views_.end(); ++i) { 549 i != content_setting_views_.end(); ++i) {
556 if ((*i)->IsVisible()) 550 if ((*i)->IsVisible())
557 entry_width -= (*i)->GetPreferredSize().width() + kInnerPadding; 551 entry_width -= (*i)->GetPreferredSize().width() + kInnerPadding;
558 } 552 }
559 gfx::Size security_image_size;
560 if (security_image_view_.IsVisible()) {
561 security_image_size = security_image_view_.GetPreferredSize();
562 entry_width -= security_image_size.width() + kInnerPadding;
563 }
564 gfx::Size info_label_size;
565 if (info_label_.IsVisible()) {
566 info_label_size = info_label_.GetPreferredSize();
567 entry_width -= (info_label_size.width() + kInnerPadding);
568 }
569 553
570 #if defined(OS_WIN) 554 #if defined(OS_WIN)
571 RECT formatting_rect; 555 RECT formatting_rect;
572 location_entry_->GetRect(&formatting_rect); 556 location_entry_->GetRect(&formatting_rect);
573 RECT edit_bounds; 557 RECT edit_bounds;
574 location_entry_->GetClientRect(&edit_bounds); 558 location_entry_->GetClientRect(&edit_bounds);
575 int max_edit_width = entry_width - formatting_rect.left - 559 int max_edit_width = entry_width - formatting_rect.left -
576 (edit_bounds.right - formatting_rect.right); 560 (edit_bounds.right - formatting_rect.right);
577 #else 561 #else
578 int max_edit_width = entry_width; 562 int max_edit_width = entry_width;
579 #endif 563 #endif
580 564
581 if (max_edit_width < 0) 565 if (max_edit_width < 0)
582 return; 566 return;
583 const int available_width = AvailableWidth(max_edit_width); 567 const int available_width = AvailableWidth(max_edit_width);
584 bool needs_layout = force_layout; 568 bool needs_layout = force_layout;
585 needs_layout |= AdjustHints(available_width); 569 needs_layout |= AdjustAutocollapseViews(available_width);
586 570
587 if (!needs_layout) 571 if (!needs_layout)
588 return; 572 return;
589 573
590 // TODO(sky): baseline layout. 574 // TODO(sky): baseline layout.
591 int location_y = TopMargin(); 575 int location_y = TopMargin();
592 int location_height = std::max(height() - location_y - kVertMargin, 0); 576 int location_height = std::max(height() - location_y - kVertMargin, 0);
593 577
594 // First set the bounds for the label that appears to the right of the 578 // Lay out items to the right of the edit field.
595 // security icon.
596 int offset = width() - kEntryPadding; 579 int offset = width() - kEntryPadding;
597 if (info_label_.IsVisible()) {
598 offset -= info_label_size.width();
599 info_label_.SetBounds(offset, location_y,
600 info_label_size.width(), location_height);
601 offset -= kInnerPadding;
602 }
603 if (security_image_view_.IsVisible()) {
604 offset -= security_image_size.width();
605 security_image_view_.SetBounds(offset, location_y,
606 security_image_size.width(),
607 location_height);
608 offset -= kInnerPadding;
609 }
610
611 for (PageActionViews::const_iterator i(page_action_views_.begin()); 580 for (PageActionViews::const_iterator i(page_action_views_.begin());
612 i != page_action_views_.end(); ++i) { 581 i != page_action_views_.end(); ++i) {
613 if ((*i)->IsVisible()) { 582 if ((*i)->IsVisible()) {
614 int page_action_width = (*i)->GetPreferredSize().width(); 583 int page_action_width = (*i)->GetPreferredSize().width();
615 offset -= page_action_width; 584 offset -= page_action_width;
616 (*i)->SetBounds(offset, location_y, page_action_width, location_height); 585 (*i)->SetBounds(offset, location_y, page_action_width, location_height);
617 offset -= kInnerPadding; 586 offset -= kInnerPadding;
618 } 587 }
619 } 588 }
620 // We use a reverse_iterator here because we're laying out the views from 589 // We use a reverse_iterator here because we're laying out the views from
621 // right to left but in the vector they're ordered left to right. 590 // right to left but in the vector they're ordered left to right.
622 for (ContentSettingViews::const_reverse_iterator 591 for (ContentSettingViews::const_reverse_iterator
623 i(content_setting_views_.rbegin()); i != content_setting_views_.rend(); 592 i(content_setting_views_.rbegin()); i != content_setting_views_.rend();
624 ++i) { 593 ++i) {
625 if ((*i)->IsVisible()) { 594 if ((*i)->IsVisible()) {
626 int content_blocked_width = (*i)->GetPreferredSize().width(); 595 int content_blocked_width = (*i)->GetPreferredSize().width();
627 offset -= content_blocked_width; 596 offset -= content_blocked_width;
628 (*i)->SetBounds(offset, location_y, content_blocked_width, 597 (*i)->SetBounds(offset, location_y, content_blocked_width,
629 location_height); 598 location_height);
630 offset -= kInnerPadding; 599 offset -= kInnerPadding;
631 } 600 }
632 } 601 }
633 gfx::Rect location_bounds(kEntryPadding, location_y, entry_width, 602
634 location_height); 603 // Now lay out items to the left of the edit field.
604 offset = kEntryPadding;
605 if (security_image_view_.IsVisible()) {
606 security_image_view_.SetBounds(offset, location_y,
607 security_image_size.width(),
608 location_height);
609 offset = security_image_view_.bounds().right() + kInnerPadding;
610 }
611
612 // Now lay out the edit field and views that autocollapse to give it more
613 // room.
614 gfx::Rect location_bounds(offset, location_y, entry_width, location_height);
635 if (selected_keyword_view_.IsVisible()) { 615 if (selected_keyword_view_.IsVisible()) {
636 LayoutView(true, &selected_keyword_view_, available_width, 616 LayoutView(true, &selected_keyword_view_, available_width,
637 &location_bounds); 617 &location_bounds);
638 } else if (keyword_hint_view_.IsVisible()) { 618 } else if (keyword_hint_view_.IsVisible()) {
639 LayoutView(false, &keyword_hint_view_, available_width, 619 LayoutView(false, &keyword_hint_view_, available_width,
640 &location_bounds); 620 &location_bounds);
641 } else if (type_to_search_view_.IsVisible()) { 621 } else if (type_to_search_view_.IsVisible()) {
642 LayoutView(false, &type_to_search_view_, available_width, 622 LayoutView(false, &type_to_search_view_, available_width,
643 &location_bounds); 623 &location_bounds);
644 } 624 }
625 if (security_info_label_.IsVisible()) {
626 LayoutView(false, &security_info_label_, available_width,
627 &location_bounds);
628 }
645 629
646 location_entry_view_->SetBounds(location_bounds); 630 location_entry_view_->SetBounds(location_bounds);
647 if (!force_layout) { 631 if (!force_layout) {
648 // If force_layout is false and we got this far it means one of the views 632 // If force_layout is false and we got this far it means one of the views
649 // was added/removed or changed in size. We need to paint ourselves. 633 // was added/removed or changed in size. We need to paint ourselves.
650 SchedulePaint(); 634 SchedulePaint();
651 } 635 }
652 } 636 }
653 637
654 int LocationBarView::TopMargin() const { 638 int LocationBarView::TopMargin() const {
(...skipping 17 matching lines...) Expand all
672 return (pref_width + kInnerPadding <= available_width); 656 return (pref_width + kInnerPadding <= available_width);
673 } 657 }
674 658
675 bool LocationBarView::NeedsResize(View* view, int available_width) { 659 bool LocationBarView::NeedsResize(View* view, int available_width) {
676 gfx::Size size = view->GetPreferredSize(); 660 gfx::Size size = view->GetPreferredSize();
677 if (!UsePref(size.width(), available_width)) 661 if (!UsePref(size.width(), available_width))
678 size = view->GetMinimumSize(); 662 size = view->GetMinimumSize();
679 return (view->width() != size.width()); 663 return (view->width() != size.width());
680 } 664 }
681 665
682 bool LocationBarView::AdjustHints(int available_width) { 666 bool LocationBarView::AdjustAutocollapseViews(int available_width) {
683 const std::wstring keyword(location_entry_->model()->keyword()); 667 const std::wstring keyword(location_entry_->model()->keyword());
684 const bool is_keyword_hint(location_entry_->model()->is_keyword_hint()); 668 const bool is_keyword_hint(location_entry_->model()->is_keyword_hint());
685 const bool show_selected_keyword = !keyword.empty() && !is_keyword_hint; 669 const bool show_selected_keyword = !keyword.empty() && !is_keyword_hint;
686 const bool show_keyword_hint = !keyword.empty() && is_keyword_hint; 670 const bool show_keyword_hint = !keyword.empty() && is_keyword_hint;
687 bool show_search_hint(location_entry_->model()->show_search_hint()); 671 bool show_search_hint(location_entry_->model()->show_search_hint());
688 DCHECK(keyword.empty() || !show_search_hint); 672 DCHECK(keyword.empty() || !show_search_hint);
689 673
690 if (show_search_hint) { 674 if (show_search_hint) {
691 // Only show type to search if all the text fits. 675 // Only show type to search if all the text fits.
692 gfx::Size view_pref = type_to_search_view_.GetPreferredSize(); 676 gfx::Size preferred_size = type_to_search_view_.GetPreferredSize();
693 show_search_hint = UsePref(view_pref.width(), available_width); 677 show_search_hint = UsePref(preferred_size.width(), available_width);
678 }
679
680 bool show_security_info_label = !security_info_label_.GetText().empty();
681 if (show_security_info_label) {
682 // Only show the security info label if all the text fits.
683 gfx::Size preferred_size = security_info_label_.GetPreferredSize();
684 show_security_info_label = UsePref(preferred_size.width(), available_width);
694 } 685 }
695 686
696 // NOTE: This isn't just one big || statement as ToggleVisibility MUST be 687 // NOTE: This isn't just one big || statement as ToggleVisibility MUST be
697 // invoked for each view. 688 // invoked for each view.
698 bool needs_layout = false; 689 bool needs_layout = false;
699 needs_layout |= ToggleVisibility(show_selected_keyword, 690 needs_layout |= ToggleVisibility(show_selected_keyword,
700 &selected_keyword_view_); 691 &selected_keyword_view_);
701 needs_layout |= ToggleVisibility(show_keyword_hint, &keyword_hint_view_); 692 needs_layout |= ToggleVisibility(show_keyword_hint, &keyword_hint_view_);
702 needs_layout |= ToggleVisibility(show_search_hint, &type_to_search_view_); 693 needs_layout |= ToggleVisibility(show_search_hint, &type_to_search_view_);
694 needs_layout |= ToggleVisibility(show_security_info_label,
695 &security_info_label_);
703 if (show_selected_keyword) { 696 if (show_selected_keyword) {
704 if (selected_keyword_view_.keyword() != keyword) { 697 if (selected_keyword_view_.keyword() != keyword) {
705 needs_layout = true; 698 needs_layout = true;
706 selected_keyword_view_.SetKeyword(keyword); 699 selected_keyword_view_.SetKeyword(keyword);
707 } 700 }
708 needs_layout |= NeedsResize(&selected_keyword_view_, available_width); 701 needs_layout |= NeedsResize(&selected_keyword_view_, available_width);
709 } else if (show_keyword_hint) { 702 } else if (show_keyword_hint) {
710 if (keyword_hint_view_.keyword() != keyword) { 703 if (keyword_hint_view_.keyword() != keyword) {
711 needs_layout = true; 704 needs_layout = true;
712 keyword_hint_view_.SetKeyword(keyword); 705 keyword_hint_view_.SetKeyword(keyword);
713 } 706 }
714 needs_layout |= NeedsResize(&keyword_hint_view_, available_width); 707 needs_layout |= NeedsResize(&keyword_hint_view_, available_width);
715 } 708 }
716 709
717 return needs_layout; 710 return needs_layout;
718 } 711 }
719 712
720 void LocationBarView::LayoutView(bool leading, 713 void LocationBarView::LayoutView(bool leading,
721 views::View* view, 714 views::View* view,
722 int available_width, 715 int available_width,
723 gfx::Rect* bounds) { 716 gfx::Rect* bounds) {
724 DCHECK(view && bounds); 717 DCHECK(view && bounds);
725 gfx::Size view_size = view->GetPreferredSize(); 718 gfx::Size view_size = view->GetPreferredSize();
726 if (!UsePref(view_size.width(), available_width)) 719 if (!UsePref(view_size.width(), available_width))
727 view_size = view->GetMinimumSize(); 720 view_size = view->GetMinimumSize();
728 if (view_size.width() + kInnerPadding < bounds->width()) { 721 if (view_size.width() + kInnerPadding >= bounds->width()) {
729 view->SetVisible(true); 722 view->SetVisible(false);
730 if (leading) { 723 return;
731 view->SetBounds(bounds->x(), bounds->y(), view_size.width(), 724 }
732 bounds->height()); 725 if (leading) {
733 bounds->Offset(view_size.width() + kInnerPadding, 0); 726 view->SetBounds(bounds->x(), bounds->y(), view_size.width(),
734 } else { 727 bounds->height());
735 view->SetBounds(bounds->right() - view_size.width(), bounds->y(), 728 bounds->Offset(view_size.width() + kInnerPadding, 0);
736 view_size.width(), bounds->height());
737 }
738 bounds->set_width(bounds->width() - view_size.width() - kInnerPadding);
739 } else { 729 } else {
740 view->SetVisible(false); 730 view->SetBounds(bounds->right() - view_size.width(), bounds->y(),
731 view_size.width(), bounds->height());
741 } 732 }
742 } 733 bounds->set_width(bounds->width() - view_size.width() - kInnerPadding);
743 734 view->SetVisible(true);
744 void LocationBarView::SetSecurityIcon(ToolbarModel::Icon icon) {
745 switch (icon) {
746 case ToolbarModel::LOCK_ICON:
747 security_image_view_.SetImageShown(SecurityImageView::LOCK);
748 security_image_view_.SetVisible(true);
749 break;
750 case ToolbarModel::WARNING_ICON:
751 security_image_view_.SetImageShown(SecurityImageView::WARNING);
752 security_image_view_.SetVisible(true);
753 break;
754 case ToolbarModel::NO_ICON:
755 security_image_view_.SetVisible(false);
756 break;
757 default:
758 NOTREACHED();
759 security_image_view_.SetVisible(false);
760 break;
761 }
762 } 735 }
763 736
764 void LocationBarView::RefreshContentSettingViews() { 737 void LocationBarView::RefreshContentSettingViews() {
765 const TabContents* tab_contents = delegate_->GetTabContents(); 738 const TabContents* tab_contents = delegate_->GetTabContents();
766 for (ContentSettingViews::const_iterator i(content_setting_views_.begin()); 739 for (ContentSettingViews::const_iterator i(content_setting_views_.begin());
767 i != content_setting_views_.end(); ++i) { 740 i != content_setting_views_.end(); ++i) {
768 (*i)->UpdateFromTabContents( 741 (*i)->UpdateFromTabContents(
769 model_->input_in_progress() ? NULL : tab_contents); 742 model_->input_in_progress() ? NULL : tab_contents);
770 } 743 }
771 } 744 }
(...skipping 25 matching lines...) Expand all
797 770
798 // On startup we sometimes haven't loaded any extensions. This makes sure 771 // On startup we sometimes haven't loaded any extensions. This makes sure
799 // we catch up when the extensions (and any page actions) load. 772 // we catch up when the extensions (and any page actions) load.
800 if (page_actions.size() != page_action_views_.size()) { 773 if (page_actions.size() != page_action_views_.size()) {
801 DeletePageActionViews(); // Delete the old views (if any). 774 DeletePageActionViews(); // Delete the old views (if any).
802 775
803 page_action_views_.resize(page_actions.size()); 776 page_action_views_.resize(page_actions.size());
804 777
805 for (size_t i = 0; i < page_actions.size(); ++i) { 778 for (size_t i = 0; i < page_actions.size(); ++i) {
806 page_action_views_[i] = new PageActionWithBadgeView( 779 page_action_views_[i] = new PageActionWithBadgeView(
807 new PageActionImageView(this, profile_, 780 new PageActionImageView(this, profile_, page_actions[i]));
808 page_actions[i], bubble_positioner_));
809 page_action_views_[i]->SetVisible(false); 781 page_action_views_[i]->SetVisible(false);
810 AddChildView(page_action_views_[i]); 782 AddChildView(page_action_views_[i]);
811 } 783 }
812 } 784 }
813 785
814 TabContents* contents = delegate_->GetTabContents(); 786 TabContents* contents = delegate_->GetTabContents();
815 if (!page_action_views_.empty() && contents) { 787 if (!page_action_views_.empty() && contents) {
816 GURL url = GURL(WideToUTF8(model_->GetText())); 788 GURL url = GURL(WideToUTF8(model_->GetText()));
817 789
818 for (PageActionViews::const_iterator i(page_action_views_.begin()); 790 for (PageActionViews::const_iterator i(page_action_views_.begin());
819 i != page_action_views_.end(); ++i) { 791 i != page_action_views_.end(); ++i) {
820 (*i)->UpdateVisibility(contents, url); 792 (*i)->UpdateVisibility(contents, url);
821 793
822 // Check if the visibility of the action changed and notify if it did. 794 // Check if the visibility of the action changed and notify if it did.
823 ExtensionAction* action = (*i)->image_view()->page_action(); 795 ExtensionAction* action = (*i)->image_view()->page_action();
824 if (old_visibility.find(action) == old_visibility.end() || 796 if (old_visibility.find(action) == old_visibility.end() ||
825 old_visibility[action] != (*i)->IsVisible()) { 797 old_visibility[action] != (*i)->IsVisible()) {
826 NotificationService::current()->Notify( 798 NotificationService::current()->Notify(
827 NotificationType::EXTENSION_PAGE_ACTION_VISIBILITY_CHANGED, 799 NotificationType::EXTENSION_PAGE_ACTION_VISIBILITY_CHANGED,
828 Source<ExtensionAction>(action), 800 Source<ExtensionAction>(action),
829 Details<TabContents>(contents)); 801 Details<TabContents>(contents));
830 } 802 }
831 } 803 }
832 } 804 }
833 } 805 }
834 806
835 void LocationBarView::SetInfoText(const std::wstring& text,
836 ToolbarModel::InfoTextType text_type,
837 const std::wstring& tooltip_text) {
838 info_label_.SetVisible(!text.empty());
839 info_label_.SetText(text);
840 if (text_type == ToolbarModel::INFO_EV_TEXT)
841 info_label_.SetColor(GetColor(true, SECURITY_TEXT));
842 info_label_.SetTooltipText(tooltip_text);
843 }
844
845 bool LocationBarView::ToggleVisibility(bool new_vis, View* view) { 807 bool LocationBarView::ToggleVisibility(bool new_vis, View* view) {
846 DCHECK(view); 808 DCHECK(view);
847 if (view->IsVisible() != new_vis) { 809 if (view->IsVisible() == new_vis)
848 view->SetVisible(new_vis); 810 return false;
849 return true; 811 view->SetVisible(new_vis);
850 } 812 return true;
851 return false;
852 } 813 }
853 814
854 #if defined(OS_WIN) 815 #if defined(OS_WIN)
855 void LocationBarView::OnMouseEvent(const views::MouseEvent& event, UINT msg) { 816 void LocationBarView::OnMouseEvent(const views::MouseEvent& event, UINT msg) {
856 UINT flags = 0; 817 UINT flags = 0;
857 if (event.IsControlDown()) 818 if (event.IsControlDown())
858 flags |= MK_CONTROL; 819 flags |= MK_CONTROL;
859 if (event.IsShiftDown()) 820 if (event.IsShiftDown())
860 flags |= MK_SHIFT; 821 flags |= MK_SHIFT;
861 if (event.IsLeftMouseButton()) 822 if (event.IsLeftMouseButton())
862 flags |= MK_LBUTTON; 823 flags |= MK_LBUTTON;
863 if (event.IsMiddleMouseButton()) 824 if (event.IsMiddleMouseButton())
864 flags |= MK_MBUTTON; 825 flags |= MK_MBUTTON;
865 if (event.IsRightMouseButton()) 826 if (event.IsRightMouseButton())
866 flags |= MK_RBUTTON; 827 flags |= MK_RBUTTON;
867 828
868 gfx::Point screen_point(event.location()); 829 gfx::Point screen_point(event.location());
869 ConvertPointToScreen(this, &screen_point); 830 ConvertPointToScreen(this, &screen_point);
870 831
871 location_entry_->HandleExternalMsg(msg, flags, screen_point.ToPOINT()); 832 location_entry_->HandleExternalMsg(msg, flags, screen_point.ToPOINT());
872 } 833 }
873 #endif 834 #endif
874 835
836 void LocationBarView::ShowFirstRunBubbleInternal(bool use_OEM_bubble) {
837 if (!location_entry_view_)
838 return;
839 if (!location_entry_view_->GetWidget()->IsActive()) {
840 // The browser is no longer active. Let's not show the info bubble, this
841 // would make the browser the active window again.
842 return;
843 }
844
845 gfx::Point location;
846
847 // If the UI layout is RTL, the coordinate system is not transformed and
848 // therefore we need to adjust the X coordinate so that bubble appears on the
849 // right hand side of the location bar.
850 if (UILayoutIsRightToLeft())
851 location.Offset(width(), 0);
852 views::View::ConvertPointToScreen(this, &location);
853
854 // We try to guess that 20 pixels offset is a good place for the first
855 // letter in the OmniBox.
856 gfx::Rect bounds(location.x(), location.y(), 20, height());
857
858 // Moving the bounds "backwards" so that it appears within the location bar
859 // if the UI layout is RTL.
860 if (UILayoutIsRightToLeft())
861 bounds.set_x(location.x() - 20);
862
863 #if defined(OS_WIN)
864 FirstRunBubble::Show(profile_, GetWindow(), bounds, use_OEM_bubble);
865 #else
866 // First run bubble doesn't make sense for Chrome OS.
867 #endif
868 }
869
875 bool LocationBarView::GetAccessibleName(std::wstring* name) { 870 bool LocationBarView::GetAccessibleName(std::wstring* name) {
876 DCHECK(name); 871 DCHECK(name);
877 872
878 if (!accessible_name_.empty()) { 873 if (!accessible_name_.empty()) {
879 name->assign(accessible_name_); 874 name->assign(accessible_name_);
880 return true; 875 return true;
881 } 876 }
882 return false; 877 return false;
883 } 878 }
884 879
885 bool LocationBarView::GetAccessibleRole(AccessibilityTypes::Role* role) { 880 bool LocationBarView::GetAccessibleRole(AccessibilityTypes::Role* role) {
886 DCHECK(role); 881 DCHECK(role);
887 882
888 *role = AccessibilityTypes::ROLE_GROUPING; 883 *role = AccessibilityTypes::ROLE_GROUPING;
889 return true; 884 return true;
890 } 885 }
891 886
892 void LocationBarView::SetAccessibleName(const std::wstring& name) { 887 void LocationBarView::SetAccessibleName(const std::wstring& name) {
893 accessible_name_.assign(name); 888 accessible_name_.assign(name);
894 } 889 }
895 890
891 // SecurityImageView------------------------------------------------------------
892
893 LocationBarView::SecurityImageView::SecurityImageView(
894 const LocationBarView* parent)
895 : parent_(parent) {
896 SetSecurityIcon(0);
897 }
898
899 LocationBarView::SecurityImageView::~SecurityImageView() {
900 }
901
902 void LocationBarView::SecurityImageView::SetSecurityIcon(int icon_id) {
903 if (icon_id == 0) {
904 SetVisible(false);
905 return;
906 }
907
908 SetImage(ResourceBundle::GetSharedInstance().GetBitmapNamed(icon_id));
909 SetVisible(true);
910 }
911
912 bool LocationBarView::SecurityImageView::OnMousePressed(
913 const views::MouseEvent& event) {
914 TabContents* tab = parent_->GetTabContents();
915 NavigationEntry* nav_entry = tab->controller().GetActiveEntry();
916 if (!nav_entry) {
917 NOTREACHED();
918 return true;
919 }
920 tab->ShowPageInfo(nav_entry->url(), nav_entry->ssl(), true);
921 return true;
922 }
923
896 // SelectedKeywordView ------------------------------------------------------- 924 // SelectedKeywordView -------------------------------------------------------
897 925
898 // The background is drawn using HorizontalPainter. This is the 926 // The background is drawn using HorizontalPainter. This is the
899 // left/center/right image names. 927 // left/center/right image names.
900 static const int kBorderImages[] = { 928 static const int kBorderImages[] = {
901 IDR_LOCATION_BAR_SELECTED_KEYWORD_BACKGROUND_L, 929 IDR_LOCATION_BAR_SELECTED_KEYWORD_BACKGROUND_L,
902 IDR_LOCATION_BAR_SELECTED_KEYWORD_BACKGROUND_C, 930 IDR_LOCATION_BAR_SELECTED_KEYWORD_BACKGROUND_C,
903 IDR_LOCATION_BAR_SELECTED_KEYWORD_BACKGROUND_R }; 931 IDR_LOCATION_BAR_SELECTED_KEYWORD_BACKGROUND_R };
904 932
905 // Insets around the label. 933 // Insets around the label.
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
1124 // AutocompleteEditViewWin::SkipDefaultKeyEventProcessing into this class so 1152 // AutocompleteEditViewWin::SkipDefaultKeyEventProcessing into this class so
1125 // it can be shared between Windows and Linux. 1153 // it can be shared between Windows and Linux.
1126 // For now, we just override back-space as it is the accelerator for back 1154 // For now, we just override back-space as it is the accelerator for back
1127 // navigation. 1155 // navigation.
1128 if (e.GetKeyCode() == base::VKEY_BACK) 1156 if (e.GetKeyCode() == base::VKEY_BACK)
1129 return true; 1157 return true;
1130 return false; 1158 return false;
1131 #endif 1159 #endif
1132 } 1160 }
1133 1161
1134 // ShowInfoBubbleTask-----------------------------------------------------------
1135
1136 class LocationBarView::ShowInfoBubbleTask : public Task {
1137 public:
1138 explicit ShowInfoBubbleTask(
1139 LocationBarView::LocationBarImageView* image_view);
1140 virtual void Run();
1141 void Cancel();
1142
1143 private:
1144 LocationBarView::LocationBarImageView* image_view_;
1145 bool cancelled_;
1146
1147 DISALLOW_COPY_AND_ASSIGN(ShowInfoBubbleTask);
1148 };
1149
1150 LocationBarView::ShowInfoBubbleTask::ShowInfoBubbleTask(
1151 LocationBarView::LocationBarImageView* image_view)
1152 : image_view_(image_view),
1153 cancelled_(false) {
1154 }
1155
1156 void LocationBarView::ShowInfoBubbleTask::Run() {
1157 if (cancelled_)
1158 return;
1159
1160 if (!image_view_->GetWidget()->IsActive()) {
1161 // The browser is no longer active. Let's not show the info bubble, this
1162 // would make the browser the active window again. Also makes sure we NULL
1163 // show_info_bubble_task_ to prevent the SecurityImageView from keeping a
1164 // dangling pointer.
1165 image_view_->show_info_bubble_task_ = NULL;
1166 return;
1167 }
1168
1169 image_view_->ShowInfoBubble();
1170 }
1171
1172 void LocationBarView::ShowInfoBubbleTask::Cancel() {
1173 cancelled_ = true;
1174 }
1175
1176 // -----------------------------------------------------------------------------
1177
1178 void LocationBarView::ShowFirstRunBubbleInternal(bool use_OEM_bubble) {
1179 if (!location_entry_view_)
1180 return;
1181 if (!location_entry_view_->GetWidget()->IsActive()) {
1182 // The browser is no longer active. Let's not show the info bubble, this
1183 // would make the browser the active window again.
1184 return;
1185 }
1186
1187 gfx::Point location;
1188
1189 // If the UI layout is RTL, the coordinate system is not transformed and
1190 // therefore we need to adjust the X coordinate so that bubble appears on the
1191 // right hand side of the location bar.
1192 if (UILayoutIsRightToLeft())
1193 location.Offset(width(), 0);
1194 views::View::ConvertPointToScreen(this, &location);
1195
1196 // We try to guess that 20 pixels offset is a good place for the first
1197 // letter in the OmniBox.
1198 gfx::Rect bounds(location.x(), location.y(), 20, height());
1199
1200 // Moving the bounds "backwards" so that it appears within the location bar
1201 // if the UI layout is RTL.
1202 if (UILayoutIsRightToLeft())
1203 bounds.set_x(location.x() - 20);
1204
1205 #if defined(OS_WIN)
1206 FirstRunBubble::Show(profile_, GetWindow(), bounds, use_OEM_bubble);
1207 #else
1208 // First run bubble doesn't make sense for Chrome OS.
1209 #endif
1210 }
1211
1212 // LocationBarImageView---------------------------------------------------------
1213
1214 LocationBarView::LocationBarImageView::LocationBarImageView(
1215 const BubblePositioner* bubble_positioner)
1216 : info_bubble_(NULL),
1217 show_info_bubble_task_(NULL),
1218 bubble_positioner_(bubble_positioner) {
1219 }
1220
1221 LocationBarView::LocationBarImageView::~LocationBarImageView() {
1222 if (show_info_bubble_task_)
1223 show_info_bubble_task_->Cancel();
1224
1225 if (info_bubble_)
1226 info_bubble_->Close();
1227 }
1228
1229 void LocationBarView::LocationBarImageView::OnMouseMoved(
1230 const views::MouseEvent& event) {
1231 if (show_info_bubble_task_) {
1232 show_info_bubble_task_->Cancel();
1233 show_info_bubble_task_ = NULL;
1234 }
1235
1236 if (info_bubble_) {
1237 // If an info bubble is currently showing, nothing to do.
1238 return;
1239 }
1240
1241 show_info_bubble_task_ = new ShowInfoBubbleTask(this);
1242 MessageLoop::current()->PostDelayedTask(FROM_HERE, show_info_bubble_task_,
1243 kInfoBubbleHoverDelayMs);
1244 }
1245
1246 void LocationBarView::LocationBarImageView::OnMouseExited(
1247 const views::MouseEvent& event) {
1248 if (show_info_bubble_task_) {
1249 show_info_bubble_task_->Cancel();
1250 show_info_bubble_task_ = NULL;
1251 }
1252
1253 if (info_bubble_)
1254 info_bubble_->Close();
1255 }
1256
1257 void LocationBarView::LocationBarImageView::InfoBubbleClosing(
1258 InfoBubble* info_bubble, bool closed_by_escape) {
1259 info_bubble_ = NULL;
1260 }
1261
1262 void LocationBarView::LocationBarImageView::ShowInfoBubbleImpl(
1263 const std::wstring& text, SkColor text_color) {
1264 gfx::Rect bounds(bubble_positioner_->GetLocationStackBounds());
1265 gfx::Point location;
1266 views::View::ConvertPointToScreen(this, &location);
1267 bounds.set_x(location.x());
1268 bounds.set_width(width());
1269
1270 views::Label* label = new views::Label(text);
1271 label->SetMultiLine(true);
1272 label->SetColor(text_color);
1273 label->SetFont(ResourceBundle::GetSharedInstance().GetFont(
1274 ResourceBundle::BaseFont).DeriveFont(2));
1275 label->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
1276 label->SizeToFit(0);
1277 DCHECK(info_bubble_ == NULL);
1278 info_bubble_ = InfoBubble::Show(GetWindow(), bounds, label, this);
1279 show_info_bubble_task_ = NULL;
1280 }
1281
1282 // SecurityImageView------------------------------------------------------------
1283
1284 // static
1285 SkBitmap* LocationBarView::SecurityImageView::lock_icon_ = NULL;
1286 SkBitmap* LocationBarView::SecurityImageView::warning_icon_ = NULL;
1287
1288 LocationBarView::SecurityImageView::SecurityImageView(
1289 const LocationBarView* parent,
1290 Profile* profile,
1291 ToolbarModel* model,
1292 const BubblePositioner* bubble_positioner)
1293 : LocationBarImageView(bubble_positioner),
1294 parent_(parent),
1295 profile_(profile),
1296 model_(model) {
1297 if (!lock_icon_) {
1298 ResourceBundle& rb = ResourceBundle::GetSharedInstance();
1299 lock_icon_ = rb.GetBitmapNamed(IDR_LOCK);
1300 warning_icon_ = rb.GetBitmapNamed(IDR_WARNING);
1301 }
1302 SetImageShown(LOCK);
1303 }
1304
1305 LocationBarView::SecurityImageView::~SecurityImageView() {
1306 }
1307
1308 void LocationBarView::SecurityImageView::SetImageShown(Image image) {
1309 switch (image) {
1310 case LOCK:
1311 SetImage(lock_icon_);
1312 break;
1313 case WARNING:
1314 SetImage(warning_icon_);
1315 break;
1316 default:
1317 NOTREACHED();
1318 break;
1319 }
1320 }
1321
1322 bool LocationBarView::SecurityImageView::OnMousePressed(
1323 const views::MouseEvent& event) {
1324 TabContents* tab = parent_->GetTabContents();
1325 NavigationEntry* nav_entry = tab->controller().GetActiveEntry();
1326 if (!nav_entry) {
1327 NOTREACHED();
1328 return true;
1329 }
1330 tab->ShowPageInfo(nav_entry->url(), nav_entry->ssl(), true);
1331 return true;
1332 }
1333
1334 void LocationBarView::SecurityImageView::ShowInfoBubble() {
1335 std::wstring text;
1336 model_->GetIconHoverText(&text);
1337 ShowInfoBubbleImpl(text, GetColor(
1338 model_->GetSecurityLevel() == ToolbarModel::SECURE,
1339 SECURITY_INFO_BUBBLE_TEXT));
1340 }
1341
1342 // ContentSettingImageView------------------------------------------------------ 1162 // ContentSettingImageView------------------------------------------------------
1343 1163
1344 LocationBarView::ContentSettingImageView::ContentSettingImageView( 1164 LocationBarView::ContentSettingImageView::ContentSettingImageView(
1345 ContentSettingsType content_type, 1165 ContentSettingsType content_type,
1346 const LocationBarView* parent, 1166 const LocationBarView* parent,
1347 Profile* profile, 1167 Profile* profile,
1348 const BubblePositioner* bubble_positioner) 1168 const BubblePositioner* bubble_positioner)
1349 : content_setting_image_model_( 1169 : content_setting_image_model_(
1350 ContentSettingImageModel::CreateContentSettingImageModel( 1170 ContentSettingImageModel::CreateContentSettingImageModel(
1351 content_type)), 1171 content_type)),
1352 parent_(parent), 1172 parent_(parent),
1353 profile_(profile), 1173 profile_(profile),
1354 info_bubble_(NULL), 1174 info_bubble_(NULL),
1355 bubble_positioner_(bubble_positioner) { 1175 bubble_positioner_(bubble_positioner) {
1356 } 1176 }
1357 1177
1358 LocationBarView::ContentSettingImageView::~ContentSettingImageView() { 1178 LocationBarView::ContentSettingImageView::~ContentSettingImageView() {
1359 if (info_bubble_) 1179 if (info_bubble_)
1360 info_bubble_->Close(); 1180 info_bubble_->Close();
1361 } 1181 }
1362 1182
1363 void LocationBarView::ContentSettingImageView::UpdateFromTabContents( 1183 void LocationBarView::ContentSettingImageView::UpdateFromTabContents(
1364 const TabContents* tab_contents) { 1184 const TabContents* tab_contents) {
1365 int old_icon = content_setting_image_model_->get_icon(); 1185 int old_icon = content_setting_image_model_->get_icon();
1366 content_setting_image_model_->UpdateFromTabContents(tab_contents); 1186 content_setting_image_model_->UpdateFromTabContents(tab_contents);
1367 if (content_setting_image_model_->is_visible()) { 1187 if (!content_setting_image_model_->is_visible()) {
1368 if (old_icon != content_setting_image_model_->get_icon()) {
1369 ResourceBundle& rb = ResourceBundle::GetSharedInstance();
1370 SetImage(rb.GetBitmapNamed(content_setting_image_model_->get_icon()));
1371 }
1372 SetTooltipText(UTF8ToWide(content_setting_image_model_->get_tooltip()));
1373 SetVisible(true);
1374 } else {
1375 SetVisible(false); 1188 SetVisible(false);
1189 return;
1376 } 1190 }
1191 if (old_icon != content_setting_image_model_->get_icon()) {
1192 ResourceBundle& rb = ResourceBundle::GetSharedInstance();
1193 SetImage(rb.GetBitmapNamed(content_setting_image_model_->get_icon()));
1194 }
1195 SetTooltipText(UTF8ToWide(content_setting_image_model_->get_tooltip()));
1196 SetVisible(true);
1377 } 1197 }
1378 1198
1379 bool LocationBarView::ContentSettingImageView::OnMousePressed( 1199 bool LocationBarView::ContentSettingImageView::OnMousePressed(
1380 const views::MouseEvent& event) { 1200 const views::MouseEvent& event) {
1381 gfx::Rect bounds(bubble_positioner_->GetLocationStackBounds()); 1201 gfx::Rect bounds(bubble_positioner_->GetLocationStackBounds());
1382 gfx::Point location; 1202 gfx::Point location;
1383 views::View::ConvertPointToScreen(this, &location); 1203 views::View::ConvertPointToScreen(this, &location);
1384 bounds.set_x(location.x()); 1204 bounds.set_x(location.x());
1385 bounds.set_width(width()); 1205 bounds.set_width(width());
1386 1206
(...skipping 27 matching lines...) Expand all
1414 1234
1415 bool LocationBarView::ContentSettingImageView::CloseOnEscape() { 1235 bool LocationBarView::ContentSettingImageView::CloseOnEscape() {
1416 return true; 1236 return true;
1417 } 1237 }
1418 1238
1419 // PageActionImageView---------------------------------------------------------- 1239 // PageActionImageView----------------------------------------------------------
1420 1240
1421 LocationBarView::PageActionImageView::PageActionImageView( 1241 LocationBarView::PageActionImageView::PageActionImageView(
1422 LocationBarView* owner, 1242 LocationBarView* owner,
1423 Profile* profile, 1243 Profile* profile,
1424 ExtensionAction* page_action, 1244 ExtensionAction* page_action)
1425 const BubblePositioner* bubble_positioner) 1245 : owner_(owner),
1426 : LocationBarImageView(bubble_positioner),
1427 owner_(owner),
1428 profile_(profile), 1246 profile_(profile),
1429 page_action_(page_action), 1247 page_action_(page_action),
1430 ALLOW_THIS_IN_INITIALIZER_LIST(tracker_(this)), 1248 ALLOW_THIS_IN_INITIALIZER_LIST(tracker_(this)),
1431 current_tab_id_(-1), 1249 current_tab_id_(-1),
1432 preview_enabled_(false), 1250 preview_enabled_(false),
1433 popup_(NULL) { 1251 popup_(NULL) {
1434 Extension* extension = profile->GetExtensionsService()->GetExtensionById( 1252 Extension* extension = profile->GetExtensionsService()->GetExtensionById(
1435 page_action->extension_id(), false); 1253 page_action->extension_id(), false);
1436 DCHECK(extension); 1254 DCHECK(extension);
1437 1255
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1498 inspect_with_devtools, 1316 inspect_with_devtools,
1499 ExtensionPopup::BUBBLE_CHROME, 1317 ExtensionPopup::BUBBLE_CHROME,
1500 this); // ExtensionPopup::Observer 1318 this); // ExtensionPopup::Observer
1501 } else { 1319 } else {
1502 ExtensionBrowserEventRouter::GetInstance()->PageActionExecuted( 1320 ExtensionBrowserEventRouter::GetInstance()->PageActionExecuted(
1503 profile_, page_action_->extension_id(), page_action_->id(), 1321 profile_, page_action_->extension_id(), page_action_->id(),
1504 current_tab_id_, current_url_.spec(), button); 1322 current_tab_id_, current_url_.spec(), button);
1505 } 1323 }
1506 } 1324 }
1507 1325
1508 void LocationBarView::PageActionImageView::OnMouseMoved(
1509 const views::MouseEvent& event) {
1510 // PageActionImageView uses normal tooltips rather than the info bubble,
1511 // so just do nothing here rather than letting LocationBarImageView start
1512 // its hover timer.
1513 }
1514
1515 bool LocationBarView::PageActionImageView::OnMousePressed( 1326 bool LocationBarView::PageActionImageView::OnMousePressed(
1516 const views::MouseEvent& event) { 1327 const views::MouseEvent& event) {
1517 // We are interested in capturing mouse messages, but we want want to wait 1328 // We are interested in capturing mouse messages, but we want want to wait
1518 // until mouse-up because we might show a context menu. Doing so on mouse-down 1329 // until mouse-up because we might show a context menu. Doing so on mouse-down
1519 // causes weird bugs like http://crbug.com/33155. 1330 // causes weird bugs like http://crbug.com/33155.
1520 return true; 1331 return true;
1521 } 1332 }
1522 1333
1523 void LocationBarView::PageActionImageView::OnMouseReleased( 1334 void LocationBarView::PageActionImageView::OnMouseReleased(
1524 const views::MouseEvent& event, bool canceled) { 1335 const views::MouseEvent& event, bool canceled) {
(...skipping 20 matching lines...) Expand all
1545 context_menu_contents_.reset(new ExtensionContextMenuModel( 1356 context_menu_contents_.reset(new ExtensionContextMenuModel(
1546 extension, browser, this)); 1357 extension, browser, this));
1547 context_menu_menu_.reset(new views::Menu2(context_menu_contents_.get())); 1358 context_menu_menu_.reset(new views::Menu2(context_menu_contents_.get()));
1548 context_menu_menu_->RunContextMenuAt(point); 1359 context_menu_menu_->RunContextMenuAt(point);
1549 return; 1360 return;
1550 } 1361 }
1551 1362
1552 ExecuteAction(button, false); // inspect_with_devtools 1363 ExecuteAction(button, false); // inspect_with_devtools
1553 } 1364 }
1554 1365
1555 void LocationBarView::PageActionImageView::ShowInfoBubble() {
1556 ShowInfoBubbleImpl(ASCIIToWide(tooltip_), GetColor(false, TEXT));
1557 }
1558
1559 void LocationBarView::PageActionImageView::OnImageLoaded( 1366 void LocationBarView::PageActionImageView::OnImageLoaded(
1560 SkBitmap* image, ExtensionResource resource, int index) { 1367 SkBitmap* image, ExtensionResource resource, int index) {
1561 // We loaded icons()->size() icons, plus one extra if the page action had 1368 // We loaded icons()->size() icons, plus one extra if the page action had
1562 // a default icon. 1369 // a default icon.
1563 int total_icons = static_cast<int>(page_action_->icon_paths()->size()); 1370 int total_icons = static_cast<int>(page_action_->icon_paths()->size());
1564 if (!page_action_->default_icon_path().empty()) 1371 if (!page_action_->default_icon_path().empty())
1565 total_icons++; 1372 total_icons++;
1566 DCHECK(index < total_icons); 1373 DCHECK(index < total_icons);
1567 1374
1568 // Map the index of the loaded image back to its name. If we ever get an 1375 // Map the index of the loaded image back to its name. If we ever get an
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
1730 page_action_views_[i]->image_view()->ExecuteAction(kLeftMouseButton, 1537 page_action_views_[i]->image_view()->ExecuteAction(kLeftMouseButton,
1731 false); // inspect_with_devtools 1538 false); // inspect_with_devtools
1732 return; 1539 return;
1733 } 1540 }
1734 ++current; 1541 ++current;
1735 } 1542 }
1736 } 1543 }
1737 1544
1738 NOTREACHED(); 1545 NOTREACHED();
1739 } 1546 }
OLDNEW
« no previous file with comments | « chrome/browser/views/location_bar_view.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698