summaryrefslogtreecommitdiffstats
path: root/chrome/browser/views/location_bar_view.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/views/location_bar_view.cc')
-rw-r--r--chrome/browser/views/location_bar_view.cc1668
1 files changed, 0 insertions, 1668 deletions
diff --git a/chrome/browser/views/location_bar_view.cc b/chrome/browser/views/location_bar_view.cc
deleted file mode 100644
index 935598c..0000000
--- a/chrome/browser/views/location_bar_view.cc
+++ /dev/null
@@ -1,1668 +0,0 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/views/location_bar_view.h"
-
-#if defined(OS_LINUX)
-#include <gtk/gtk.h>
-#endif
-
-#include "app/drag_drop_types.h"
-#include "app/l10n_util.h"
-#include "app/resource_bundle.h"
-#include "app/theme_provider.h"
-#include "base/i18n/rtl.h"
-#include "base/stl_util-inl.h"
-#include "chrome/app/chrome_dll_resource.h"
-#include "chrome/browser/alternate_nav_url_fetcher.h"
-#include "chrome/browser/browser_list.h"
-#include "chrome/browser/command_updater.h"
-#include "chrome/browser/content_setting_bubble_model.h"
-#include "chrome/browser/content_setting_image_model.h"
-#include "chrome/browser/extensions/extension_browser_event_router.h"
-#include "chrome/browser/extensions/extensions_service.h"
-#include "chrome/browser/profile.h"
-#include "chrome/browser/search_engines/template_url_model.h"
-#include "chrome/browser/view_ids.h"
-#include "chrome/browser/views/browser_dialogs.h"
-#include "chrome/browser/views/content_blocked_bubble_contents.h"
-#include "chrome/browser/views/frame/browser_view.h"
-#include "chrome/common/platform_util.h"
-#include "gfx/canvas.h"
-#include "gfx/color_utils.h"
-#include "grit/generated_resources.h"
-#include "grit/theme_resources.h"
-#include "views/drag_utils.h"
-
-#if defined(OS_WIN)
-#include "chrome/browser/views/first_run_bubble.h"
-#endif
-
-using views::View;
-
-// static
-const int LocationBarView::kVertMargin = 2;
-
-// Padding between items in the location bar.
-static const int kViewPadding = 3;
-
-// Padding before the start of a bubble.
-static const int kBubblePadding = kViewPadding - 1;
-
-// Padding between the location icon and the edit, if they're adjacent.
-static const int kLocationIconEditPadding = kViewPadding - 1;
-
-static const int kEVBubbleBackgroundImages[] = {
- IDR_OMNIBOX_EV_BUBBLE_BACKGROUND_L,
- IDR_OMNIBOX_EV_BUBBLE_BACKGROUND_C,
- IDR_OMNIBOX_EV_BUBBLE_BACKGROUND_R,
-};
-
-static const int kSelectedKeywordBackgroundImages[] = {
- IDR_LOCATION_BAR_SELECTED_KEYWORD_BACKGROUND_L,
- IDR_LOCATION_BAR_SELECTED_KEYWORD_BACKGROUND_C,
- IDR_LOCATION_BAR_SELECTED_KEYWORD_BACKGROUND_R,
-};
-
-static const SkBitmap* kBackground = NULL;
-
-static const SkBitmap* kPopupBackground = NULL;
-
-// The tab key image.
-static const SkBitmap* kTabButtonBitmap = NULL;
-
-// Returns the short name for a keyword.
-static std::wstring GetKeywordName(Profile* profile,
- const std::wstring& keyword) {
- // Make sure the TemplateURL still exists.
- // TODO(sky): Once LocationBarView adds a listener to the TemplateURLModel
- // to track changes to the model, this should become a DCHECK.
- const TemplateURL* template_url =
- profile->GetTemplateURLModel()->GetTemplateURLForKeyword(keyword);
- if (template_url)
- return template_url->AdjustedShortNameForLocaleDirection();
- return std::wstring();
-}
-
-
-// PageActionWithBadgeView ----------------------------------------------------
-
-// A container for the PageActionImageView plus its badge.
-class LocationBarView::PageActionWithBadgeView : public views::View {
- public:
- explicit PageActionWithBadgeView(PageActionImageView* image_view);
-
- PageActionImageView* image_view() { return image_view_; }
-
- virtual gfx::Size GetPreferredSize() {
- return gfx::Size(Extension::kPageActionIconMaxSize,
- Extension::kPageActionIconMaxSize);
- }
-
- void UpdateVisibility(TabContents* contents, const GURL& url);
-
- private:
- virtual void Layout();
-
- // The button this view contains.
- PageActionImageView* image_view_;
-
- DISALLOW_COPY_AND_ASSIGN(PageActionWithBadgeView);
-};
-
-LocationBarView::PageActionWithBadgeView::PageActionWithBadgeView(
- PageActionImageView* image_view) {
- image_view_ = image_view;
- AddChildView(image_view_);
-}
-
-void LocationBarView::PageActionWithBadgeView::Layout() {
- // We have 25 pixels of vertical space in the Omnibox to play with, so even
- // sized icons (such as 16x16) have either a 5 or a 4 pixel whitespace
- // (padding) above and below. It looks better to have the extra pixel above
- // the icon than below it, so we add a pixel. http://crbug.com/25708.
- const SkBitmap& image = image_view()->GetImage();
- int y = (image.height() + 1) % 2; // Even numbers: 1px padding. Odd: 0px.
- image_view_->SetBounds(0, y, width(), height());
-}
-
-void LocationBarView::PageActionWithBadgeView::UpdateVisibility(
- TabContents* contents, const GURL& url) {
- image_view_->UpdateVisibility(contents, url);
- SetVisible(image_view_->IsVisible());
-}
-
-
-// LocationBarView -----------------------------------------------------------
-
-LocationBarView::LocationBarView(Profile* profile,
- CommandUpdater* command_updater,
- ToolbarModel* model,
- Delegate* delegate,
- bool popup_window_mode)
- : profile_(profile),
- command_updater_(command_updater),
- model_(model),
- delegate_(delegate),
- disposition_(CURRENT_TAB),
- ALLOW_THIS_IN_INITIALIZER_LIST(location_icon_view_(this)),
- ALLOW_THIS_IN_INITIALIZER_LIST(ev_bubble_view_(
- kEVBubbleBackgroundImages, IDR_OMNIBOX_HTTPS_VALID,
- GetColor(ToolbarModel::EV_SECURE, SECURITY_TEXT), this)),
- location_entry_view_(NULL),
- selected_keyword_view_(kSelectedKeywordBackgroundImages,
- IDR_OMNIBOX_SEARCH, SK_ColorBLACK, profile),
- keyword_hint_view_(profile),
- star_view_(command_updater),
- popup_window_mode_(popup_window_mode),
- ALLOW_THIS_IN_INITIALIZER_LIST(first_run_bubble_(this)) {
- DCHECK(profile_);
- SetID(VIEW_ID_LOCATION_BAR);
- SetFocusable(true);
-
- if (!kBackground) {
- ResourceBundle &rb = ResourceBundle::GetSharedInstance();
- kBackground = rb.GetBitmapNamed(IDR_LOCATIONBG);
- kPopupBackground = rb.GetBitmapNamed(IDR_LOCATIONBG_POPUPMODE_CENTER);
- }
-}
-
-LocationBarView::~LocationBarView() {
-}
-
-void LocationBarView::Init() {
- if (popup_window_mode_) {
- font_ = ResourceBundle::GetSharedInstance().GetFont(
- ResourceBundle::BaseFont);
- } else {
- // Use a larger version of the system font.
- font_ = font_.DeriveFont(3);
- }
-
- AddChildView(&location_icon_view_);
- location_icon_view_.SetVisible(true);
- location_icon_view_.SetDragController(this);
- location_icon_view_.set_parent_owned(false);
-
- AddChildView(&ev_bubble_view_);
- ev_bubble_view_.SetVisible(false);
- ev_bubble_view_.SetDragController(this);
- ev_bubble_view_.set_parent_owned(false);
-
- // URL edit field.
- // View container for URL edit field.
-#if defined(OS_WIN)
- location_entry_.reset(new AutocompleteEditViewWin(font_, this, model_, this,
- GetWidget()->GetNativeView(), profile_, command_updater_,
- popup_window_mode_, this));
-#else
- location_entry_.reset(new AutocompleteEditViewGtk(this, model_, profile_,
- command_updater_, popup_window_mode_, this));
- location_entry_->Init();
- // Make all the children of the widget visible. NOTE: this won't display
- // anything, it just toggles the visible flag.
- gtk_widget_show_all(location_entry_->GetNativeView());
- // Hide the widget. NativeViewHostGtk will make it visible again as
- // necessary.
- gtk_widget_hide(location_entry_->GetNativeView());
-#endif
- location_entry_view_ = new views::NativeViewHost;
- location_entry_view_->SetID(VIEW_ID_AUTOCOMPLETE);
- AddChildView(location_entry_view_);
- location_entry_view_->set_focus_view(this);
- location_entry_view_->Attach(location_entry_->GetNativeView());
-
- AddChildView(&selected_keyword_view_);
- selected_keyword_view_.SetFont(font_);
- selected_keyword_view_.SetVisible(false);
- selected_keyword_view_.set_parent_owned(false);
-
- SkColor dimmed_text = GetColor(ToolbarModel::NONE, DEEMPHASIZED_TEXT);
-
- AddChildView(&keyword_hint_view_);
- keyword_hint_view_.SetVisible(false);
- keyword_hint_view_.SetFont(font_);
- keyword_hint_view_.SetColor(dimmed_text);
- keyword_hint_view_.set_parent_owned(false);
-
- for (int i = 0; i < CONTENT_SETTINGS_NUM_TYPES; ++i) {
- ContentSettingImageView* content_blocked_view = new ContentSettingImageView(
- static_cast<ContentSettingsType>(i), this, profile_);
- content_setting_views_.push_back(content_blocked_view);
- AddChildView(content_blocked_view);
- content_blocked_view->SetVisible(false);
- }
-
- if (!popup_window_mode_) {
- AddChildView(&star_view_);
- star_view_.SetVisible(true);
- star_view_.set_parent_owned(false);
- }
-
- // Notify us when any ancestor is resized. In this case we want to tell the
- // AutocompleteEditView to close its popup.
- SetNotifyWhenVisibleBoundsInRootChanges(true);
-
- // Initialize the location entry. We do this to avoid a black flash which is
- // visible when the location entry has just been initialized.
- Update(NULL);
-
- OnChanged();
-}
-
-bool LocationBarView::IsInitialized() const {
- return location_entry_view_ != NULL;
-}
-
-// static
-SkColor LocationBarView::GetColor(ToolbarModel::SecurityLevel security_level,
- ColorKind kind) {
- switch (kind) {
-#if defined(OS_WIN)
- case BACKGROUND: return color_utils::GetSysSkColor(COLOR_WINDOW);
- case TEXT: return color_utils::GetSysSkColor(COLOR_WINDOWTEXT);
- case SELECTED_TEXT: return color_utils::GetSysSkColor(COLOR_HIGHLIGHTTEXT);
-#else
- // TODO(beng): source from theme provider.
- case BACKGROUND: return SK_ColorWHITE;
- case TEXT: return SK_ColorBLACK;
- case SELECTED_TEXT: return SK_ColorWHITE;
-#endif
-
- case DEEMPHASIZED_TEXT:
- return color_utils::AlphaBlend(GetColor(security_level, TEXT),
- GetColor(security_level, BACKGROUND), 128);
-
- case SECURITY_TEXT: {
- SkColor color;
- switch (security_level) {
- case ToolbarModel::EV_SECURE:
- case ToolbarModel::SECURE:
- color = SkColorSetRGB(7, 149, 0);
- break;
-
- case ToolbarModel::SECURITY_WARNING:
- return GetColor(security_level, DEEMPHASIZED_TEXT);
- break;
-
- case ToolbarModel::SECURITY_ERROR:
- color = SkColorSetRGB(162, 0, 0);
- break;
-
- default:
- NOTREACHED();
- return GetColor(security_level, TEXT);
- }
- return color_utils::GetReadableColor(color, GetColor(security_level,
- BACKGROUND));
- }
-
- default:
- NOTREACHED();
- return GetColor(security_level, TEXT);
- }
-}
-
-void LocationBarView::Update(const TabContents* tab_for_state_restoring) {
- RefreshContentSettingViews();
- RefreshPageActionViews();
- location_entry_->Update(tab_for_state_restoring);
- OnChanged();
-}
-
-void LocationBarView::UpdateContentSettingsIcons() {
- RefreshContentSettingViews();
-
- Layout();
- SchedulePaint();
-}
-
-void LocationBarView::UpdatePageActions() {
- size_t count_before = page_action_views_.size();
- RefreshPageActionViews();
- if (page_action_views_.size() != count_before) {
- NotificationService::current()->Notify(
- NotificationType::EXTENSION_PAGE_ACTION_COUNT_CHANGED,
- Source<LocationBar>(this),
- NotificationService::NoDetails());
- }
-
- Layout();
- SchedulePaint();
-}
-
-void LocationBarView::InvalidatePageActions() {
- size_t count_before = page_action_views_.size();
- DeletePageActionViews();
- if (page_action_views_.size() != count_before) {
- NotificationService::current()->Notify(
- NotificationType::EXTENSION_PAGE_ACTION_COUNT_CHANGED,
- Source<LocationBar>(this),
- NotificationService::NoDetails());
- }
-}
-
-void LocationBarView::Focus() {
- // Focus the location entry native view.
- location_entry_->SetFocus();
-}
-
-void LocationBarView::SetProfile(Profile* profile) {
- DCHECK(profile);
- if (profile_ != profile) {
- profile_ = profile;
- location_entry_->model()->SetProfile(profile);
- selected_keyword_view_.set_profile(profile);
- keyword_hint_view_.set_profile(profile);
- for (ContentSettingViews::const_iterator i(content_setting_views_.begin());
- i != content_setting_views_.end(); ++i)
- (*i)->set_profile(profile);
- }
-}
-
-TabContents* LocationBarView::GetTabContents() const {
- return delegate_->GetTabContents();
-}
-
-void LocationBarView::SetPreviewEnabledPageAction(ExtensionAction* page_action,
- bool preview_enabled) {
- if (popup_window_mode_)
- return;
-
- DCHECK(page_action);
- TabContents* contents = delegate_->GetTabContents();
-
- RefreshPageActionViews();
- PageActionWithBadgeView* page_action_view =
- static_cast<PageActionWithBadgeView*>(GetPageActionView(page_action));
- DCHECK(page_action_view);
- if (!page_action_view)
- return;
-
- page_action_view->image_view()->set_preview_enabled(preview_enabled);
- page_action_view->UpdateVisibility(contents,
- GURL(WideToUTF8(model_->GetText())));
- Layout();
- SchedulePaint();
-}
-
-views::View* LocationBarView::GetPageActionView(
- ExtensionAction *page_action) {
- DCHECK(page_action);
- for (PageActionViews::const_iterator i(page_action_views_.begin());
- i != page_action_views_.end(); ++i) {
- if ((*i)->image_view()->page_action() == page_action)
- return *i;
- }
- return NULL;
-}
-
-void LocationBarView::SetStarToggled(bool on) {
- star_view_.SetToggled(on);
-}
-
-void LocationBarView::ShowStarBubble(const GURL& url, bool newly_bookmarked) {
- gfx::Rect screen_bounds(star_view_.GetImageBounds());
- // Compensate for some built-in padding in the Star image.
- screen_bounds.Inset(1, 1, 1, 2);
- gfx::Point origin(screen_bounds.origin());
- views::View::ConvertPointToScreen(&star_view_, &origin);
- screen_bounds.set_origin(origin);
- browser::ShowBookmarkBubbleView(GetWindow(), screen_bounds, &star_view_,
- profile_, url, newly_bookmarked);
-}
-
-gfx::Size LocationBarView::GetPreferredSize() {
- return gfx::Size(0,
- (popup_window_mode_ ? kPopupBackground : kBackground)->height());
-}
-
-void LocationBarView::Layout() {
- if (!location_entry_.get())
- return;
-
- int entry_width = width() - kViewPadding;
-
- // |location_icon_view_| is visible except when |ev_bubble_view_| or
- // |selected_keyword_view_| are visible.
- int location_icon_width = 0;
- int ev_bubble_width = 0;
- location_icon_view_.SetVisible(false);
- ev_bubble_view_.SetVisible(false);
- const std::wstring keyword(location_entry_->model()->keyword());
- const bool is_keyword_hint(location_entry_->model()->is_keyword_hint());
- const bool show_selected_keyword = !keyword.empty() && !is_keyword_hint;
- if (show_selected_keyword) {
- entry_width -= kViewPadding; // Assume the keyword might be hidden.
- } else if (model_->GetSecurityLevel() == ToolbarModel::EV_SECURE) {
- ev_bubble_view_.SetVisible(true);
- ev_bubble_view_.SetLabel(model_->GetEVCertName());
- ev_bubble_width = ev_bubble_view_.GetPreferredSize().width();
- entry_width -= kBubblePadding + ev_bubble_width + kViewPadding;
- } else {
- location_icon_view_.SetVisible(true);
- location_icon_width = location_icon_view_.GetPreferredSize().width();
- entry_width -=
- kViewPadding + location_icon_width + kLocationIconEditPadding;
- }
-
- entry_width -= star_view_.GetPreferredSize().width() + kViewPadding;
- for (PageActionViews::const_iterator i(page_action_views_.begin());
- i != page_action_views_.end(); ++i) {
- if ((*i)->IsVisible())
- entry_width -= (*i)->GetPreferredSize().width() + kViewPadding;
- }
- for (ContentSettingViews::const_iterator i(content_setting_views_.begin());
- i != content_setting_views_.end(); ++i) {
- if ((*i)->IsVisible())
- entry_width -= (*i)->GetPreferredSize().width() + kViewPadding;
- }
-
-#if defined(OS_WIN)
- RECT formatting_rect;
- location_entry_->GetRect(&formatting_rect);
- RECT edit_bounds;
- location_entry_->GetClientRect(&edit_bounds);
- int max_edit_width = entry_width - formatting_rect.left -
- (edit_bounds.right - formatting_rect.right);
-#else
- int max_edit_width = entry_width;
-#endif
-
- if (max_edit_width < 0)
- return;
- const int available_width = AvailableWidth(max_edit_width);
-
- const bool show_keyword_hint = !keyword.empty() && is_keyword_hint;
- selected_keyword_view_.SetVisible(show_selected_keyword);
- keyword_hint_view_.SetVisible(show_keyword_hint);
- if (show_selected_keyword) {
- if (selected_keyword_view_.keyword() != keyword)
- selected_keyword_view_.SetKeyword(keyword);
- } else if (show_keyword_hint) {
- if (keyword_hint_view_.keyword() != keyword)
- keyword_hint_view_.SetKeyword(keyword);
- }
-
- // TODO(sky): baseline layout.
- int location_y = TopMargin();
- int location_height = std::max(height() - location_y - kVertMargin, 0);
-
- // Lay out items to the right of the edit field.
- int offset = width() - kViewPadding;
- int star_width = star_view_.GetPreferredSize().width();
- offset -= star_width;
- star_view_.SetBounds(offset, location_y, star_width, location_height);
- offset -= kViewPadding;
-
- for (PageActionViews::const_iterator i(page_action_views_.begin());
- i != page_action_views_.end(); ++i) {
- if ((*i)->IsVisible()) {
- int page_action_width = (*i)->GetPreferredSize().width();
- offset -= page_action_width;
- (*i)->SetBounds(offset, location_y, page_action_width, location_height);
- offset -= kViewPadding;
- }
- }
- // We use a reverse_iterator here because we're laying out the views from
- // right to left but in the vector they're ordered left to right.
- for (ContentSettingViews::const_reverse_iterator
- i(content_setting_views_.rbegin()); i != content_setting_views_.rend();
- ++i) {
- if ((*i)->IsVisible()) {
- int content_blocked_width = (*i)->GetPreferredSize().width();
- offset -= content_blocked_width;
- (*i)->SetBounds(offset, location_y, content_blocked_width,
- location_height);
- offset -= kViewPadding;
- }
- }
-
- // Now lay out items to the left of the edit field.
- if (location_icon_view_.IsVisible()) {
- location_icon_view_.SetBounds(kViewPadding, location_y, location_icon_width,
- location_height);
- offset = location_icon_view_.bounds().right() + kLocationIconEditPadding;
- } else if (ev_bubble_view_.IsVisible()) {
- ev_bubble_view_.SetBounds(kBubblePadding, location_y, ev_bubble_width,
- location_height);
- offset = ev_bubble_view_.bounds().right() + kViewPadding;
- } else {
- offset = show_selected_keyword ? kBubblePadding : kViewPadding;
- }
-
- // Now lay out the edit field and views that autocollapse to give it more
- // room.
- gfx::Rect location_bounds(offset, location_y, entry_width, location_height);
- if (show_selected_keyword) {
- LayoutView(true, &selected_keyword_view_, available_width,
- &location_bounds);
- if (!selected_keyword_view_.IsVisible()) {
- location_bounds.set_x(
- location_bounds.x() + kViewPadding - kBubblePadding);
- }
- } else if (show_keyword_hint) {
- LayoutView(false, &keyword_hint_view_, available_width,
- &location_bounds);
- }
-
- location_entry_view_->SetBounds(location_bounds);
-}
-
-void LocationBarView::Paint(gfx::Canvas* canvas) {
- View::Paint(canvas);
-
- const SkBitmap* background =
- popup_window_mode_ ?
- kPopupBackground :
- GetThemeProvider()->GetBitmapNamed(IDR_LOCATIONBG);
-
- canvas->TileImageInt(*background, 0, 0, 0, 0, width(), height());
- int top_margin = TopMargin();
- canvas->FillRectInt(GetColor(ToolbarModel::NONE, BACKGROUND), 0,
- top_margin, width(),
- std::max(height() - top_margin - kVertMargin, 0));
-}
-
-void LocationBarView::VisibleBoundsInRootChanged() {
- location_entry_->ClosePopup();
-}
-
-#if defined(OS_WIN)
-bool LocationBarView::OnMousePressed(const views::MouseEvent& event) {
- UINT msg;
- if (event.IsLeftMouseButton()) {
- msg = (event.GetFlags() & views::MouseEvent::EF_IS_DOUBLE_CLICK) ?
- WM_LBUTTONDBLCLK : WM_LBUTTONDOWN;
- } else if (event.IsMiddleMouseButton()) {
- msg = (event.GetFlags() & views::MouseEvent::EF_IS_DOUBLE_CLICK) ?
- WM_MBUTTONDBLCLK : WM_MBUTTONDOWN;
- } else if (event.IsRightMouseButton()) {
- msg = (event.GetFlags() & views::MouseEvent::EF_IS_DOUBLE_CLICK) ?
- WM_RBUTTONDBLCLK : WM_RBUTTONDOWN;
- } else {
- NOTREACHED();
- return false;
- }
- OnMouseEvent(event, msg);
- return true;
-}
-
-bool LocationBarView::OnMouseDragged(const views::MouseEvent& event) {
- OnMouseEvent(event, WM_MOUSEMOVE);
- return true;
-}
-
-void LocationBarView::OnMouseReleased(const views::MouseEvent& event,
- bool canceled) {
- UINT msg;
- if (canceled) {
- msg = WM_CAPTURECHANGED;
- } else if (event.IsLeftMouseButton()) {
- msg = WM_LBUTTONUP;
- } else if (event.IsMiddleMouseButton()) {
- msg = WM_MBUTTONUP;
- } else if (event.IsRightMouseButton()) {
- msg = WM_RBUTTONUP;
- } else {
- NOTREACHED();
- return;
- }
- OnMouseEvent(event, msg);
-}
-#endif
-
-void LocationBarView::OnAutocompleteAccept(
- const GURL& url,
- WindowOpenDisposition disposition,
- PageTransition::Type transition,
- const GURL& alternate_nav_url) {
- if (!url.is_valid())
- return;
-
- 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);
- return;
- }
-
- scoped_ptr<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; we can simply let the fetcher get deleted here and it will
- // clean itself up properly.
- } else {
- fetcher.release(); // The navigation controller will delete the fetcher.
- }
- }
-}
-
-void LocationBarView::OnChanged() {
- location_icon_view_.SetImage(
- ResourceBundle::GetSharedInstance().GetBitmapNamed(
- location_entry_->GetIcon()));
- Layout();
- SchedulePaint();
-}
-
-void LocationBarView::OnInputInProgress(bool in_progress) {
- delegate_->OnInputInProgress(in_progress);
-}
-
-void LocationBarView::OnKillFocus() {
-}
-
-void LocationBarView::OnSetFocus() {
- views::FocusManager* focus_manager = GetFocusManager();
- if (!focus_manager) {
- NOTREACHED();
- return;
- }
- focus_manager->SetFocusedView(this);
-}
-
-SkBitmap LocationBarView::GetFavIcon() const {
- DCHECK(delegate_);
- DCHECK(delegate_->GetTabContents());
- return delegate_->GetTabContents()->GetFavIcon();
-}
-
-std::wstring LocationBarView::GetTitle() const {
- DCHECK(delegate_);
- DCHECK(delegate_->GetTabContents());
- return UTF16ToWideHack(delegate_->GetTabContents()->GetTitle());
-}
-
-int LocationBarView::TopMargin() const {
- return std::min(kVertMargin, height());
-}
-
-int LocationBarView::AvailableWidth(int location_bar_width) {
-#if defined(OS_WIN)
- // Use font_.GetStringWidth() instead of
- // PosFromChar(location_entry_->GetTextLength()) because PosFromChar() is
- // apparently buggy. In both LTR UI and RTL UI with left-to-right layout,
- // PosFromChar(i) might return 0 when i is greater than 1.
- return std::max(
- location_bar_width - font_.GetStringWidth(location_entry_->GetText()), 0);
-#else
- return location_bar_width - location_entry_->TextWidth();
-#endif
-}
-
-bool LocationBarView::UsePref(int pref_width, int available_width) {
- return (pref_width + kViewPadding <= available_width);
-}
-
-void LocationBarView::LayoutView(bool leading,
- views::View* view,
- int available_width,
- gfx::Rect* bounds) {
- DCHECK(view && bounds);
- gfx::Size view_size = view->GetPreferredSize();
- if (!UsePref(view_size.width(), available_width))
- view_size = view->GetMinimumSize();
- if (view_size.width() + kViewPadding >= bounds->width()) {
- view->SetVisible(false);
- return;
- }
- if (leading) {
- view->SetBounds(bounds->x(), bounds->y(), view_size.width(),
- bounds->height());
- bounds->Offset(view_size.width() + kViewPadding, 0);
- } else {
- view->SetBounds(bounds->right() - view_size.width(), bounds->y(),
- view_size.width(), bounds->height());
- }
- bounds->set_width(bounds->width() - view_size.width() - kViewPadding);
- view->SetVisible(true);
-}
-
-void LocationBarView::RefreshContentSettingViews() {
- const TabContents* tab_contents = delegate_->GetTabContents();
- for (ContentSettingViews::const_iterator i(content_setting_views_.begin());
- i != content_setting_views_.end(); ++i) {
- (*i)->UpdateFromTabContents(
- model_->input_in_progress() ? NULL : tab_contents);
- }
-}
-
-void LocationBarView::DeletePageActionViews() {
- for (PageActionViews::const_iterator i(page_action_views_.begin());
- i != page_action_views_.end(); ++i)
- RemoveChildView(*i);
- STLDeleteElements(&page_action_views_);
-}
-
-void LocationBarView::RefreshPageActionViews() {
- if (popup_window_mode_)
- return;
-
- ExtensionsService* service = profile_->GetExtensionsService();
- if (!service)
- return;
-
- std::map<ExtensionAction*, bool> old_visibility;
- for (PageActionViews::const_iterator i(page_action_views_.begin());
- i != page_action_views_.end(); ++i)
- old_visibility[(*i)->image_view()->page_action()] = (*i)->IsVisible();
-
- // Remember the previous visibility of the page actions so that we can
- // notify when this changes.
- std::vector<ExtensionAction*> page_actions;
- for (size_t i = 0; i < service->extensions()->size(); ++i) {
- if (service->extensions()->at(i)->page_action())
- page_actions.push_back(service->extensions()->at(i)->page_action());
- }
-
- // On startup we sometimes haven't loaded any extensions. This makes sure
- // we catch up when the extensions (and any page actions) load.
- if (page_actions.size() != page_action_views_.size()) {
- DeletePageActionViews(); // Delete the old views (if any).
-
- page_action_views_.resize(page_actions.size());
-
- for (size_t i = 0; i < page_actions.size(); ++i) {
- page_action_views_[i] = new PageActionWithBadgeView(
- new PageActionImageView(this, profile_, page_actions[i]));
- page_action_views_[i]->SetVisible(false);
- AddChildView(page_action_views_[i]);
- }
- }
-
- TabContents* contents = delegate_->GetTabContents();
- if (!page_action_views_.empty() && contents) {
- GURL url = GURL(WideToUTF8(model_->GetText()));
-
- for (PageActionViews::const_iterator i(page_action_views_.begin());
- i != page_action_views_.end(); ++i) {
- (*i)->UpdateVisibility(contents, url);
-
- // Check if the visibility of the action changed and notify if it did.
- ExtensionAction* action = (*i)->image_view()->page_action();
- if (old_visibility.find(action) == old_visibility.end() ||
- old_visibility[action] != (*i)->IsVisible()) {
- NotificationService::current()->Notify(
- NotificationType::EXTENSION_PAGE_ACTION_VISIBILITY_CHANGED,
- Source<ExtensionAction>(action),
- Details<TabContents>(contents));
- }
- }
- }
-}
-
-#if defined(OS_WIN)
-void LocationBarView::OnMouseEvent(const views::MouseEvent& event, UINT msg) {
- UINT flags = 0;
- if (event.IsControlDown())
- flags |= MK_CONTROL;
- if (event.IsShiftDown())
- flags |= MK_SHIFT;
- if (event.IsLeftMouseButton())
- flags |= MK_LBUTTON;
- if (event.IsMiddleMouseButton())
- flags |= MK_MBUTTON;
- if (event.IsRightMouseButton())
- flags |= MK_RBUTTON;
-
- gfx::Point screen_point(event.location());
- ConvertPointToScreen(this, &screen_point);
- location_entry_->HandleExternalMsg(msg, flags, screen_point.ToPOINT());
-}
-#endif
-
-void LocationBarView::ShowFirstRunBubbleInternal(
- FirstRun::BubbleType bubble_type) {
-#if defined(OS_WIN) // First run bubble doesn't make sense for Chrome OS.
- // If the browser is no longer active, let's not show the info bubble, as this
- // would make the browser the active window again.
- if (!location_entry_view_ || !location_entry_view_->GetWidget()->IsActive())
- return;
-
- // Point at the start of the edit control; adjust to look as good as possible.
- const int kXOffset = 1; // Text looks like it actually starts 1 px in.
- const int kYOffset = -4; // Point into the omnibox, not just at its edge.
- gfx::Point origin(location_entry_view_->bounds().x() + kXOffset,
- y() + height() + kYOffset);
- // If the UI layout is RTL, the coordinate system is not transformed and
- // therefore we need to adjust the X coordinate so that bubble appears on the
- // right hand side of the location bar.
- if (UILayoutIsRightToLeft())
- origin.set_x(width() - origin.x());
- views::View::ConvertPointToScreen(this, &origin);
- FirstRunBubble::Show(profile_, GetWindow(), gfx::Rect(origin, gfx::Size()),
- bubble_type);
-#endif
-}
-
-bool LocationBarView::SkipDefaultKeyEventProcessing(const views::KeyEvent& e) {
- if (keyword_hint_view_.IsVisible() &&
- views::FocusManager::IsTabTraversalKeyEvent(e)) {
- // We want to receive tab key events when the hint is showing.
- return true;
- }
-
-#if defined(OS_WIN)
- return location_entry_->SkipDefaultKeyEventProcessing(e);
-#else
- // TODO(jcampan): We need to refactor the code of
- // AutocompleteEditViewWin::SkipDefaultKeyEventProcessing into this class so
- // it can be shared between Windows and Linux.
- // For now, we just override back-space as it is the accelerator for back
- // navigation.
- if (e.GetKeyCode() == base::VKEY_BACK)
- return true;
- return false;
-#endif
-}
-
-bool LocationBarView::GetAccessibleRole(AccessibilityTypes::Role* role) {
- DCHECK(role);
-
- *role = AccessibilityTypes::ROLE_GROUPING;
- return true;
-}
-
-
-void LocationBarView::WriteDragData(views::View* sender,
- const gfx::Point& press_pt,
- OSExchangeData* data) {
- DCHECK(GetDragOperations(sender, press_pt) != DragDropTypes::DRAG_NONE);
-
- TabContents* tab_contents = delegate_->GetTabContents();
- DCHECK(tab_contents);
- drag_utils::SetURLAndDragImage(tab_contents->GetURL(),
- UTF16ToWideHack(tab_contents->GetTitle()),
- tab_contents->GetFavIcon(), data);
-}
-
-int LocationBarView::GetDragOperations(views::View* sender,
- const gfx::Point& p) {
- DCHECK((sender == &location_icon_view_) || (sender == &ev_bubble_view_));
- TabContents* tab_contents = delegate_->GetTabContents();
- return (tab_contents && tab_contents->GetURL().is_valid() &&
- !location_entry()->IsEditingOrEmpty()) ?
- (DragDropTypes::DRAG_COPY | DragDropTypes::DRAG_LINK) :
- DragDropTypes::DRAG_NONE;
-}
-
-bool LocationBarView::CanStartDrag(View* sender,
- const gfx::Point& press_pt,
- const gfx::Point& p) {
- return true;
-}
-
-// ClickHandler ----------------------------------------------------------------
-
-LocationBarView::ClickHandler::ClickHandler(const views::View* owner,
- const LocationBarView* location_bar)
- : owner_(owner),
- location_bar_(location_bar) {
-}
-
-void LocationBarView::ClickHandler::OnMouseReleased(
- const views::MouseEvent& event,
- bool canceled) {
- if (canceled || !owner_->HitTest(event.location()))
- return;
-
- // Do not show page info if the user has been editing the location
- // bar, or the location bar is at the NTP.
- if (location_bar_->location_entry()->IsEditingOrEmpty())
- return;
-
- TabContents* tab = location_bar_->GetTabContents();
- NavigationEntry* nav_entry = tab->controller().GetActiveEntry();
- if (!nav_entry) {
- NOTREACHED();
- return;
- }
- tab->ShowPageInfo(nav_entry->url(), nav_entry->ssl(), true);
-}
-
-// LocationIconView ------------------------------------------------------------
-
-LocationBarView::LocationIconView::LocationIconView(
- const LocationBarView* location_bar)
- : ALLOW_THIS_IN_INITIALIZER_LIST(click_handler_(this, location_bar)) {
-}
-
-LocationBarView::LocationIconView::~LocationIconView() {
-}
-
-bool LocationBarView::LocationIconView::OnMousePressed(
- const views::MouseEvent& event) {
- // We want to show the dialog on mouse release; that is the standard behavior
- // for buttons.
- return true;
-}
-
-void LocationBarView::LocationIconView::OnMouseReleased(
- const views::MouseEvent& event,
- bool canceled) {
- click_handler_.OnMouseReleased(event, canceled);
-}
-
-// IconLabelBubbleView ---------------------------------------------------------
-
-// Amount to offset the image.
-static const int kImageOffset = 1;
-
-// Amount to offset the label from the image.
-static const int kLabelOffset = 3;
-
-// Amount of padding after the label.
-static const int kLabelPadding = 4;
-
-LocationBarView::IconLabelBubbleView::IconLabelBubbleView(
- const int background_images[],
- int contained_image,
- const SkColor& color)
- : background_painter_(background_images) {
- AddChildView(&image_);
- image_.set_parent_owned(false);
- image_.SetImage(
- ResourceBundle::GetSharedInstance().GetBitmapNamed(contained_image));
- AddChildView(&label_);
- label_.set_parent_owned(false);
- label_.SetColor(color);
-}
-
-LocationBarView::IconLabelBubbleView::~IconLabelBubbleView() {
-}
-
-void LocationBarView::IconLabelBubbleView::SetFont(const gfx::Font& font) {
- label_.SetFont(font);
-}
-
-void LocationBarView::IconLabelBubbleView::SetLabel(const std::wstring& label) {
- label_.SetText(label);
-}
-
-void LocationBarView::IconLabelBubbleView::Paint(gfx::Canvas* canvas) {
- int y_offset = (GetParent()->height() - height()) / 2;
- canvas->TranslateInt(0, y_offset);
- background_painter_.Paint(width(), height(), canvas);
- canvas->TranslateInt(0, -y_offset);
-}
-
-gfx::Size LocationBarView::IconLabelBubbleView::GetPreferredSize() {
- gfx::Size size(GetNonLabelSize());
- size.Enlarge(label_.GetPreferredSize().width(), 0);
- return size;
-}
-
-void LocationBarView::IconLabelBubbleView::Layout() {
- image_.SetBounds(kImageOffset, 0, image_.GetPreferredSize().width(),
- height());
- gfx::Size label_size(label_.GetPreferredSize());
- label_.SetBounds(image_.x() + image_.width() + kLabelOffset,
- (height() - label_size.height()) / 2, label_size.width(),
- label_size.height());
-}
-
-gfx::Size LocationBarView::IconLabelBubbleView::GetNonLabelSize() {
- return gfx::Size(kImageOffset + image_.GetPreferredSize().width() +
- kLabelOffset + kLabelPadding, background_painter_.height());
-}
-
-// EVBubbleView ----------------------------------------------------------------
-
-LocationBarView::EVBubbleView::EVBubbleView(const int background_images[],
- int contained_image,
- const SkColor& color,
- const LocationBarView* location_bar)
- : IconLabelBubbleView(background_images, contained_image, color),
- ALLOW_THIS_IN_INITIALIZER_LIST(click_handler_(this, location_bar)) {
-}
-
-LocationBarView::EVBubbleView::~EVBubbleView() {
-}
-
-bool LocationBarView::EVBubbleView::OnMousePressed(
- const views::MouseEvent& event) {
- // We want to show the dialog on mouse release; that is the standard behavior
- // for buttons.
- return true;
-}
-
-void LocationBarView::EVBubbleView::OnMouseReleased(
- const views::MouseEvent& event,
- bool canceled) {
- click_handler_.OnMouseReleased(event, canceled);
-}
-
-// SelectedKeywordView ---------------------------------------------------------
-
-LocationBarView::SelectedKeywordView::SelectedKeywordView(
- const int background_images[],
- int contained_image,
- const SkColor& color,
- Profile* profile)
- : IconLabelBubbleView(background_images, contained_image, color),
- profile_(profile) {
- full_label_.SetVisible(false);
- partial_label_.SetVisible(false);
-}
-
-LocationBarView::SelectedKeywordView::~SelectedKeywordView() {
-}
-
-void LocationBarView::SelectedKeywordView::SetFont(const gfx::Font& font) {
- IconLabelBubbleView::SetFont(font);
- full_label_.SetFont(font);
- partial_label_.SetFont(font);
-}
-
-gfx::Size LocationBarView::SelectedKeywordView::GetPreferredSize() {
- gfx::Size size(GetNonLabelSize());
- size.Enlarge(full_label_.GetPreferredSize().width(), 0);
- return size;
-}
-
-gfx::Size LocationBarView::SelectedKeywordView::GetMinimumSize() {
- gfx::Size size(GetNonLabelSize());
- size.Enlarge(partial_label_.GetMinimumSize().width(), 0);
- return size;
-}
-
-void LocationBarView::SelectedKeywordView::Layout() {
- SetLabel((width() == GetPreferredSize().width()) ?
- full_label_.GetText() : partial_label_.GetText());
- IconLabelBubbleView::Layout();
-}
-
-void LocationBarView::SelectedKeywordView::SetKeyword(
- const std::wstring& keyword) {
- keyword_ = keyword;
- if (keyword.empty())
- return;
- DCHECK(profile_);
- if (!profile_->GetTemplateURLModel())
- return;
-
- const std::wstring short_name = GetKeywordName(profile_, keyword);
- full_label_.SetText(l10n_util::GetStringF(IDS_OMNIBOX_KEYWORD_TEXT,
- short_name));
- const std::wstring min_string = CalculateMinString(short_name);
- partial_label_.SetText(min_string.empty() ?
- full_label_.GetText() :
- l10n_util::GetStringF(IDS_OMNIBOX_KEYWORD_TEXT, min_string));
-}
-
-std::wstring LocationBarView::SelectedKeywordView::CalculateMinString(
- const std::wstring& description) {
- // Chop at the first '.' or whitespace.
- const size_t dot_index = description.find(L'.');
- const size_t ws_index = description.find_first_of(kWhitespaceWide);
- size_t chop_index = std::min(dot_index, ws_index);
- std::wstring min_string;
- if (chop_index == std::wstring::npos) {
- // No dot or whitespace, truncate to at most 3 chars.
- min_string = l10n_util::TruncateString(description, 3);
- } else {
- min_string = description.substr(0, chop_index);
- }
- base::i18n::AdjustStringForLocaleDirection(min_string, &min_string);
- return min_string;
-}
-
-// KeywordHintView -------------------------------------------------------------
-
-// Amount of space to offset the tab image from the top of the view by.
-static const int kTabImageYOffset = 4;
-
-LocationBarView::KeywordHintView::KeywordHintView(Profile* profile)
- : profile_(profile) {
- AddChildView(&leading_label_);
- AddChildView(&trailing_label_);
-
- if (!kTabButtonBitmap) {
- kTabButtonBitmap = ResourceBundle::GetSharedInstance().
- GetBitmapNamed(IDR_LOCATION_BAR_KEYWORD_HINT_TAB);
- }
-}
-
-LocationBarView::KeywordHintView::~KeywordHintView() {
- // Labels are freed by us. Remove them so that View doesn't
- // try to free them too.
- RemoveChildView(&leading_label_);
- RemoveChildView(&trailing_label_);
-}
-
-void LocationBarView::KeywordHintView::SetFont(const gfx::Font& font) {
- leading_label_.SetFont(font);
- trailing_label_.SetFont(font);
-}
-
-void LocationBarView::KeywordHintView::SetColor(const SkColor& color) {
- leading_label_.SetColor(color);
- trailing_label_.SetColor(color);
-}
-
-void LocationBarView::KeywordHintView::SetKeyword(const std::wstring& keyword) {
- keyword_ = keyword;
- if (keyword_.empty())
- return;
- DCHECK(profile_);
- if (!profile_->GetTemplateURLModel())
- return;
-
- std::vector<size_t> content_param_offsets;
- const std::wstring keyword_hint(l10n_util::GetStringF(
- IDS_OMNIBOX_KEYWORD_HINT, std::wstring(),
- GetKeywordName(profile_, keyword), &content_param_offsets));
- if (content_param_offsets.size() == 2) {
- leading_label_.SetText(keyword_hint.substr(0,
- content_param_offsets.front()));
- trailing_label_.SetText(keyword_hint.substr(content_param_offsets.front()));
- } else {
- // See comments on an identical NOTREACHED() in search_provider.cc.
- NOTREACHED();
- }
-}
-
-void LocationBarView::KeywordHintView::Paint(gfx::Canvas* canvas) {
- int image_x = leading_label_.IsVisible() ? leading_label_.width() : 0;
-
- // Since we paint the button image directly on the canvas (instead of using a
- // child view), we must mirror the button's position manually if the locale
- // is right-to-left.
- gfx::Rect tab_button_bounds(image_x,
- kTabImageYOffset,
- kTabButtonBitmap->width(),
- kTabButtonBitmap->height());
- tab_button_bounds.set_x(MirroredLeftPointForRect(tab_button_bounds));
- canvas->DrawBitmapInt(*kTabButtonBitmap,
- tab_button_bounds.x(),
- tab_button_bounds.y());
-}
-
-gfx::Size LocationBarView::KeywordHintView::GetPreferredSize() {
- // TODO(sky): currently height doesn't matter, once baseline support is
- // added this should check baselines.
- gfx::Size prefsize = leading_label_.GetPreferredSize();
- int width = prefsize.width();
- width += kTabButtonBitmap->width();
- prefsize = trailing_label_.GetPreferredSize();
- width += prefsize.width();
- return gfx::Size(width, prefsize.height());
-}
-
-gfx::Size LocationBarView::KeywordHintView::GetMinimumSize() {
- // TODO(sky): currently height doesn't matter, once baseline support is
- // added this should check baselines.
- return gfx::Size(kTabButtonBitmap->width(), 0);
-}
-
-void LocationBarView::KeywordHintView::Layout() {
- // TODO(sky): baseline layout.
- bool show_labels = (width() != kTabButtonBitmap->width());
-
- leading_label_.SetVisible(show_labels);
- trailing_label_.SetVisible(show_labels);
- int x = 0;
- gfx::Size pref;
-
- if (show_labels) {
- pref = leading_label_.GetPreferredSize();
- leading_label_.SetBounds(x, 0, pref.width(), height());
-
- x += pref.width() + kTabButtonBitmap->width();
- pref = trailing_label_.GetPreferredSize();
- trailing_label_.SetBounds(x, 0, pref.width(), height());
- }
-}
-
-// ContentSettingImageView------------------------------------------------------
-
-LocationBarView::ContentSettingImageView::ContentSettingImageView(
- ContentSettingsType content_type,
- const LocationBarView* parent,
- Profile* profile)
- : content_setting_image_model_(
- ContentSettingImageModel::CreateContentSettingImageModel(
- content_type)),
- parent_(parent),
- profile_(profile),
- info_bubble_(NULL) {
-}
-
-LocationBarView::ContentSettingImageView::~ContentSettingImageView() {
- if (info_bubble_)
- info_bubble_->Close();
-}
-
-void LocationBarView::ContentSettingImageView::UpdateFromTabContents(
- const TabContents* tab_contents) {
- int old_icon = content_setting_image_model_->get_icon();
- content_setting_image_model_->UpdateFromTabContents(tab_contents);
- if (!content_setting_image_model_->is_visible()) {
- SetVisible(false);
- return;
- }
- if (old_icon != content_setting_image_model_->get_icon()) {
- SetImage(ResourceBundle::GetSharedInstance().GetBitmapNamed(
- content_setting_image_model_->get_icon()));
- }
- SetTooltipText(UTF8ToWide(content_setting_image_model_->get_tooltip()));
- SetVisible(true);
-}
-
-bool LocationBarView::ContentSettingImageView::OnMousePressed(
- const views::MouseEvent& event) {
- // We want to show the bubble on mouse release; that is the standard behavior
- // for buttons.
- return true;
-}
-
-void LocationBarView::ContentSettingImageView::OnMouseReleased(
- const views::MouseEvent& event,
- bool canceled) {
- if (canceled || !HitTest(event.location()))
- return;
-
- TabContents* tab_contents = parent_->GetTabContents();
- if (!tab_contents)
- return;
-
- gfx::Rect screen_bounds(GetImageBounds());
- gfx::Point origin(screen_bounds.origin());
- views::View::ConvertPointToScreen(this, &origin);
- screen_bounds.set_origin(origin);
- ContentSettingBubbleContents* bubble_contents =
- new ContentSettingBubbleContents(
- ContentSettingBubbleModel::CreateContentSettingBubbleModel(
- tab_contents, profile_,
- content_setting_image_model_->get_content_settings_type()),
- profile_, tab_contents);
- DCHECK(!info_bubble_);
- info_bubble_ =
- InfoBubble::Show(GetWindow(), screen_bounds, bubble_contents, this);
- bubble_contents->set_info_bubble(info_bubble_);
-}
-
-void LocationBarView::ContentSettingImageView::VisibilityChanged(
- View* starting_from,
- bool is_visible) {
- if (!is_visible && info_bubble_)
- info_bubble_->Close();
-}
-
-void LocationBarView::ContentSettingImageView::InfoBubbleClosing(
- InfoBubble* info_bubble,
- bool closed_by_escape) {
- info_bubble_ = NULL;
-}
-
-bool LocationBarView::ContentSettingImageView::CloseOnEscape() {
- return true;
-}
-
-// PageActionImageView----------------------------------------------------------
-
-LocationBarView::PageActionImageView::PageActionImageView(
- LocationBarView* owner,
- Profile* profile,
- ExtensionAction* page_action)
- : owner_(owner),
- profile_(profile),
- page_action_(page_action),
- ALLOW_THIS_IN_INITIALIZER_LIST(tracker_(this)),
- current_tab_id_(-1),
- preview_enabled_(false),
- popup_(NULL) {
- Extension* extension = profile->GetExtensionsService()->GetExtensionById(
- page_action->extension_id(), false);
- DCHECK(extension);
-
- // Load all the icons declared in the manifest. This is the contents of the
- // icons array, plus the default_icon property, if any.
- std::vector<std::string> icon_paths(*page_action->icon_paths());
- if (!page_action_->default_icon_path().empty())
- icon_paths.push_back(page_action_->default_icon_path());
-
- for (std::vector<std::string>::iterator iter = icon_paths.begin();
- iter != icon_paths.end(); ++iter) {
- tracker_.LoadImage(extension, extension->GetResource(*iter),
- gfx::Size(Extension::kPageActionIconMaxSize,
- Extension::kPageActionIconMaxSize),
- ImageLoadingTracker::DONT_CACHE);
- }
-}
-
-LocationBarView::PageActionImageView::~PageActionImageView() {
- if (popup_)
- HidePopup();
-}
-
-void LocationBarView::PageActionImageView::ExecuteAction(int button,
- bool inspect_with_devtools) {
- if (current_tab_id_ < 0) {
- NOTREACHED() << "No current tab.";
- return;
- }
-
- if (page_action_->HasPopup(current_tab_id_)) {
- // In tests, GetLastActive could return NULL, so we need to have
- // a fallback.
- // TODO(erikkay): Find a better way to get the Browser that this
- // button is in.
- Browser* browser = BrowserList::GetLastActiveWithProfile(profile_);
- if (!browser)
- browser = BrowserList::FindBrowserWithProfile(profile_);
- DCHECK(browser);
-
- bool popup_showing = popup_ != NULL;
-
- // Always hide the current popup. Only one popup at a time.
- HidePopup();
-
- // If we were already showing, then treat this click as a dismiss.
- if (popup_showing)
- return;
-
- gfx::Rect screen_bounds(GetImageBounds());
- gfx::Point origin(screen_bounds.origin());
- View::ConvertPointToScreen(this, &origin);
- screen_bounds.set_origin(origin);
-
- popup_ = ExtensionPopup::Show(
- page_action_->GetPopupUrl(current_tab_id_),
- browser,
- browser->profile(),
- browser->window()->GetNativeHandle(),
- screen_bounds,
- BubbleBorder::TOP_RIGHT,
- true, // Activate the popup window.
- inspect_with_devtools,
- ExtensionPopup::BUBBLE_CHROME,
- this); // ExtensionPopup::Observer
- } else {
- ExtensionBrowserEventRouter::GetInstance()->PageActionExecuted(
- profile_, page_action_->extension_id(), page_action_->id(),
- current_tab_id_, current_url_.spec(), button);
- }
-}
-
-bool LocationBarView::PageActionImageView::OnMousePressed(
- const views::MouseEvent& event) {
- // We want to show the bubble on mouse release; that is the standard behavior
- // for buttons. (Also, triggering on mouse press causes bugs like
- // http://crbug.com/33155.)
- return true;
-}
-
-void LocationBarView::PageActionImageView::OnMouseReleased(
- const views::MouseEvent& event, bool canceled) {
- if (canceled || !HitTest(event.location()))
- return;
-
- int button = -1;
- if (event.IsLeftMouseButton()) {
- button = 1;
- } else if (event.IsMiddleMouseButton()) {
- button = 2;
- } else if (event.IsRightMouseButton()) {
- // Get the top left point of this button in screen coordinates.
- gfx::Point menu_origin;
- ConvertPointToScreen(this, &menu_origin);
-
- // Make the menu appear below the button.
- menu_origin.Offset(0, height());
-
- Extension* extension = profile_->GetExtensionsService()->GetExtensionById(
- page_action()->extension_id(), false);
- Browser* browser = BrowserView::GetBrowserViewForNativeWindow(
- platform_util::GetTopLevel(GetWidget()->GetNativeView()))->browser();
- context_menu_contents_ =
- new ExtensionContextMenuModel(extension, browser, this);
- context_menu_menu_.reset(new views::Menu2(context_menu_contents_.get()));
- context_menu_menu_->RunContextMenuAt(menu_origin);
- return;
- }
-
- ExecuteAction(button, false); // inspect_with_devtools
-}
-
-void LocationBarView::PageActionImageView::OnImageLoaded(
- SkBitmap* image, ExtensionResource resource, int index) {
- // We loaded icons()->size() icons, plus one extra if the page action had
- // a default icon.
- int total_icons = static_cast<int>(page_action_->icon_paths()->size());
- if (!page_action_->default_icon_path().empty())
- total_icons++;
- DCHECK(index < total_icons);
-
- // Map the index of the loaded image back to its name. If we ever get an
- // index greater than the number of icons, it must be the default icon.
- if (image) {
- if (index < static_cast<int>(page_action_->icon_paths()->size()))
- page_action_icons_[page_action_->icon_paths()->at(index)] = *image;
- else
- page_action_icons_[page_action_->default_icon_path()] = *image;
- }
-
- owner_->UpdatePageActions();
-}
-
-void LocationBarView::PageActionImageView::UpdateVisibility(
- TabContents* contents, const GURL& url) {
- // Save this off so we can pass it back to the extension when the action gets
- // executed. See PageActionImageView::OnMousePressed.
- current_tab_id_ = ExtensionTabUtil::GetTabId(contents);
- current_url_ = url;
-
- bool visible =
- preview_enabled_ || page_action_->GetIsVisible(current_tab_id_);
- if (visible) {
- // Set the tooltip.
- tooltip_ = page_action_->GetTitle(current_tab_id_);
- SetTooltipText(UTF8ToWide(tooltip_));
-
- // Set the image.
- // It can come from three places. In descending order of priority:
- // - The developer can set it dynamically by path or bitmap. It will be in
- // page_action_->GetIcon().
- // - The developer can set it dynamically by index. It will be in
- // page_action_->GetIconIndex().
- // - It can be set in the manifest by path. It will be in page_action_->
- // default_icon_path().
-
- // First look for a dynamically set bitmap.
- SkBitmap icon = page_action_->GetIcon(current_tab_id_);
- if (icon.isNull()) {
- int icon_index = page_action_->GetIconIndex(current_tab_id_);
- std::string icon_path;
- if (icon_index >= 0)
- icon_path = page_action_->icon_paths()->at(icon_index);
- else
- icon_path = page_action_->default_icon_path();
-
- if (!icon_path.empty()) {
- PageActionMap::iterator iter = page_action_icons_.find(icon_path);
- if (iter != page_action_icons_.end())
- icon = iter->second;
- }
- }
-
- if (!icon.isNull())
- SetImage(&icon);
- }
- SetVisible(visible);
-}
-
-void LocationBarView::PageActionImageView::InspectPopup(
- ExtensionAction* action) {
- ExecuteAction(1, // left-click
- true); // inspect_with_devtools
-}
-
-void LocationBarView::PageActionImageView::ExtensionPopupClosed(
- ExtensionPopup* popup) {
- DCHECK_EQ(popup_, popup);
- // ExtensionPopup is ref-counted, so we don't need to delete it.
- popup_ = NULL;
-}
-
-void LocationBarView::PageActionImageView::HidePopup() {
- if (popup_)
- popup_->Close();
-}
-
-// StarView---------------------------------------------------------------------
-
-LocationBarView::StarView::StarView(CommandUpdater* command_updater)
- : command_updater_(command_updater) {
- SetID(VIEW_ID_STAR_BUTTON);
- SetToggled(false);
-}
-
-LocationBarView::StarView::~StarView() {
-}
-
-void LocationBarView::StarView::SetToggled(bool on) {
- SetTooltipText(l10n_util::GetString(
- on ? IDS_TOOLTIP_STARRED : IDS_TOOLTIP_STAR));
- // Since StarView is an ImageView, the SetTooltipText changes the accessible
- // name. To keep the accessible name unchanged, we need to set the accessible
- // name right after we modify the tooltip text for this view.
- SetAccessibleName(l10n_util::GetString(IDS_ACCNAME_STAR));
- SetImage(ResourceBundle::GetSharedInstance().GetBitmapNamed(
- on ? IDR_OMNIBOX_STAR_LIT : IDR_OMNIBOX_STAR));
-}
-
-bool LocationBarView::StarView::GetAccessibleRole(
- AccessibilityTypes::Role* role) {
- *role = AccessibilityTypes::ROLE_PUSHBUTTON;
- return true;
-}
-
-bool LocationBarView::StarView::OnMousePressed(const views::MouseEvent& event) {
- // We want to show the bubble on mouse release; that is the standard behavior
- // for buttons.
- return true;
-}
-
-void LocationBarView::StarView::OnMouseReleased(const views::MouseEvent& event,
- bool canceled) {
- if (!canceled && HitTest(event.location()))
- command_updater_->ExecuteCommand(IDC_BOOKMARK_PAGE);
-}
-
-void LocationBarView::StarView::InfoBubbleClosing(InfoBubble* info_bubble,
- bool closed_by_escape) {
-}
-
-bool LocationBarView::StarView::CloseOnEscape() {
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// LocationBarView, LocationBar implementation:
-
-void LocationBarView::ShowFirstRunBubble(FirstRun::BubbleType bubble_type) {
- // We wait 30 milliseconds to open. It allows less flicker.
- Task* task = first_run_bubble_.NewRunnableMethod(
- &LocationBarView::ShowFirstRunBubbleInternal, bubble_type);
- MessageLoop::current()->PostDelayedTask(FROM_HERE, task, 30);
-}
-
-std::wstring LocationBarView::GetInputString() const {
- return location_input_;
-}
-
-WindowOpenDisposition LocationBarView::GetWindowOpenDisposition() const {
- return disposition_;
-}
-
-PageTransition::Type LocationBarView::GetPageTransition() const {
- return transition_;
-}
-
-void LocationBarView::AcceptInput() {
- location_entry_->model()->AcceptInput(CURRENT_TAB, false);
-}
-
-void LocationBarView::AcceptInputWithDisposition(WindowOpenDisposition disp) {
- location_entry_->model()->AcceptInput(disp, false);
-}
-
-void LocationBarView::FocusLocation(bool select_all) {
- location_entry_->SetFocus();
- if (select_all)
- location_entry_->SelectAll(true);
-}
-
-void LocationBarView::FocusSearch() {
- location_entry_->SetFocus();
- location_entry_->SetForcedQuery();
-}
-
-void LocationBarView::SaveStateToContents(TabContents* contents) {
- location_entry_->SaveStateToTab(contents);
-}
-
-void LocationBarView::Revert() {
- location_entry_->RevertAll();
-}
-
-int LocationBarView::PageActionVisibleCount() {
- int result = 0;
- for (size_t i = 0; i < page_action_views_.size(); i++) {
- if (page_action_views_[i]->IsVisible())
- ++result;
- }
- return result;
-}
-
-ExtensionAction* LocationBarView::GetPageAction(size_t index) {
- if (index < page_action_views_.size())
- return page_action_views_[index]->image_view()->page_action();
-
- NOTREACHED();
- return NULL;
-}
-
-ExtensionAction* LocationBarView::GetVisiblePageAction(size_t index) {
- size_t current = 0;
- for (size_t i = 0; i < page_action_views_.size(); ++i) {
- if (page_action_views_[i]->IsVisible()) {
- if (current == index)
- return page_action_views_[i]->image_view()->page_action();
-
- ++current;
- }
- }
-
- NOTREACHED();
- return NULL;
-}
-
-void LocationBarView::TestPageActionPressed(size_t index) {
- size_t current = 0;
- for (size_t i = 0; i < page_action_views_.size(); ++i) {
- if (page_action_views_[i]->IsVisible()) {
- if (current == index) {
- const int kLeftMouseButton = 1;
- page_action_views_[i]->image_view()->ExecuteAction(kLeftMouseButton,
- false); // inspect_with_devtools
- return;
- }
- ++current;
- }
- }
-
- NOTREACHED();
-}