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

Unified Diff: chrome/browser/ui/gtk/location_bar_view_gtk.cc

Issue 231733005: Delete the GTK+ port of Chrome. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remerge to ToT Created 6 years, 8 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/gtk/location_bar_view_gtk.cc
diff --git a/chrome/browser/ui/gtk/location_bar_view_gtk.cc b/chrome/browser/ui/gtk/location_bar_view_gtk.cc
deleted file mode 100644
index a27280d8599a07f9d1346ab98a8a1c66438a7b22..0000000000000000000000000000000000000000
--- a/chrome/browser/ui/gtk/location_bar_view_gtk.cc
+++ /dev/null
@@ -1,1980 +0,0 @@
-// Copyright 2012 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/ui/gtk/location_bar_view_gtk.h"
-
-#include <algorithm>
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/bind.h"
-#include "base/command_line.h"
-#include "base/debug/trace_event.h"
-#include "base/i18n/rtl.h"
-#include "base/logging.h"
-#include "base/message_loop/message_loop.h"
-#include "base/prefs/pref_service.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_util.h"
-#include "base/strings/utf_string_conversions.h"
-#include "chrome/app/chrome_command_ids.h"
-#include "chrome/browser/accessibility/accessibility_events.h"
-#include "chrome/browser/accessibility/accessibility_extension_api.h"
-#include "chrome/browser/chrome_notification_types.h"
-#include "chrome/browser/command_updater.h"
-#include "chrome/browser/content_settings/tab_specific_content_settings.h"
-#include "chrome/browser/defaults.h"
-#include "chrome/browser/extensions/api/commands/command_service.h"
-#include "chrome/browser/extensions/api/omnibox/omnibox_api.h"
-#include "chrome/browser/extensions/extension_action.h"
-#include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/extensions/extension_tab_util.h"
-#include "chrome/browser/extensions/location_bar_controller.h"
-#include "chrome/browser/extensions/tab_helper.h"
-#include "chrome/browser/favicon/favicon_tab_helper.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/search/instant_service.h"
-#include "chrome/browser/search/instant_service_factory.h"
-#include "chrome/browser/search_engines/template_url.h"
-#include "chrome/browser/search_engines/template_url_service.h"
-#include "chrome/browser/search_engines/template_url_service_factory.h"
-#include "chrome/browser/themes/theme_properties.h"
-#include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/browser_command_controller.h"
-#include "chrome/browser/ui/browser_commands.h"
-#include "chrome/browser/ui/browser_content_setting_bubble_model_delegate.h"
-#include "chrome/browser/ui/browser_instant_controller.h"
-#include "chrome/browser/ui/browser_list.h"
-#include "chrome/browser/ui/content_settings/content_setting_bubble_model.h"
-#include "chrome/browser/ui/content_settings/content_setting_image_model.h"
-#include "chrome/browser/ui/gtk/bookmarks/bookmark_bubble_gtk.h"
-#include "chrome/browser/ui/gtk/bookmarks/bookmark_utils_gtk.h"
-#include "chrome/browser/ui/gtk/browser_window_gtk.h"
-#include "chrome/browser/ui/gtk/content_setting_bubble_gtk.h"
-#include "chrome/browser/ui/gtk/extensions/extension_popup_gtk.h"
-#include "chrome/browser/ui/gtk/first_run_bubble.h"
-#include "chrome/browser/ui/gtk/gtk_theme_service.h"
-#include "chrome/browser/ui/gtk/gtk_util.h"
-#include "chrome/browser/ui/gtk/manage_passwords_bubble_gtk.h"
-#include "chrome/browser/ui/gtk/nine_box.h"
-#include "chrome/browser/ui/gtk/omnibox/omnibox_view_gtk.h"
-#include "chrome/browser/ui/gtk/rounded_window.h"
-#include "chrome/browser/ui/gtk/view_id_util.h"
-#include "chrome/browser/ui/gtk/zoom_bubble_gtk.h"
-#include "chrome/browser/ui/omnibox/location_bar_util.h"
-#include "chrome/browser/ui/omnibox/omnibox_edit_model.h"
-#include "chrome/browser/ui/omnibox/omnibox_popup_model.h"
-#include "chrome/browser/ui/passwords/manage_passwords_bubble_ui_controller.h"
-#include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/browser/ui/webui/extensions/extension_info_ui.h"
-#include "chrome/browser/ui/zoom/zoom_controller.h"
-#include "chrome/common/badge_util.h"
-#include "chrome/common/chrome_switches.h"
-#include "chrome/common/pref_names.h"
-#include "content/public/browser/navigation_entry.h"
-#include "content/public/browser/notification_service.h"
-#include "content/public/browser/web_contents.h"
-#include "extensions/common/extension.h"
-#include "extensions/common/feature_switch.h"
-#include "extensions/common/manifest_handlers/icons_handler.h"
-#include "grit/generated_resources.h"
-#include "grit/theme_resources.h"
-#include "net/base/net_util.h"
-#include "ui/accessibility/ax_enums.h"
-#include "ui/base/accelerators/platform_accelerator_gtk.h"
-#include "ui/base/dragdrop/gtk_dnd_util.h"
-#include "ui/base/gtk/gtk_hig_constants.h"
-#include "ui/base/gtk/gtk_signal_registrar.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/base/resource/resource_bundle.h"
-#include "ui/base/window_open_disposition.h"
-#include "ui/gfx/canvas_skia_paint.h"
-#include "ui/gfx/font.h"
-#include "ui/gfx/gtk_util.h"
-#include "ui/gfx/image/image.h"
-
-using content::NavigationEntry;
-using content::OpenURLParams;
-using content::WebContents;
-using extensions::LocationBarController;
-using extensions::Extension;
-
-namespace {
-
-// We draw a border on the top and bottom (but not on left or right).
-const int kBorderThickness = 1;
-
-const int kPopupEdgeThickness = 1;
-const int kNormalEdgeThickness = 2;
-
-// Spacing needed to align the bubble with the left side of the omnibox.
-const int kFirstRunBubbleLeftSpacing = 4;
-
-// The padding around the top, bottom, and sides of the location bar hbox.
-// We don't want to edit control's text to be right against the edge,
-// as well the tab to search box and other widgets need to have the padding on
-// top and bottom to avoid drawing larger than the location bar space.
-const int kHboxBorder = 2;
-
-// Padding between the elements in the bar.
-const int kInnerPadding = 2;
-
-// Colors used to draw the EV certificate rounded bubble.
-const GdkColor kEvSecureTextColor = GDK_COLOR_RGB(0x07, 0x95, 0x00);
-const GdkColor kEvSecureBackgroundColor = GDK_COLOR_RGB(0xef, 0xfc, 0xef);
-const GdkColor kEvSecureBorderColor = GDK_COLOR_RGB(0x90, 0xc3, 0x90);
-
-// Colors used to draw the Tab to Search rounded bubble.
-const GdkColor kKeywordBackgroundColor = GDK_COLOR_RGB(0xf0, 0xf4, 0xfa);
-const GdkColor kKeywordBorderColor = GDK_COLOR_RGB(0xcb, 0xde, 0xf7);
-
-// Use weak gray for showing search and keyword hint text.
-const GdkColor kHintTextColor = GDK_COLOR_RGB(0x75, 0x75, 0x75);
-
-// Size of the rounding of the "Search site for:" box.
-const int kCornerSize = 3;
-
-// Default page tool animation time (open and close). In ms.
-const int kPageToolAnimationTime = 150;
-
-// The time, in ms, that the content setting label is fully displayed, for the
-// cases where we animate it into and out of view.
-const int kContentSettingImageDisplayTime = 3200;
-// The time, in ms, of the animation (open and close).
-const int kContentSettingImageAnimationTime = 150;
-
-// Color of border of content setting area (icon/label).
-const GdkColor kContentSettingBorderColor = GDK_COLOR_RGB(0xe9, 0xb9, 0x66);
-// Colors for the background gradient.
-const GdkColor kContentSettingTopColor = GDK_COLOR_RGB(0xff, 0xf8, 0xd4);
-const GdkColor kContentSettingBottomColor = GDK_COLOR_RGB(0xff, 0xe6, 0xaf);
-
-// If widget is visible, increment the int pointed to by count.
-// Suitible for use with gtk_container_foreach.
-void CountVisibleWidgets(GtkWidget* widget, gpointer count) {
- if (gtk_widget_get_visible(widget))
- *static_cast<int*>(count) += 1;
-}
-
-class ContentSettingImageViewGtk : public LocationBarViewGtk::PageToolViewGtk,
- public BubbleDelegateGtk {
- public:
- ContentSettingImageViewGtk(ContentSettingsType content_type,
- LocationBarViewGtk* parent);
- virtual ~ContentSettingImageViewGtk();
-
- // PageToolViewGtk
- virtual void Update(WebContents* web_contents) OVERRIDE;
-
- // gfx::AnimationDelegate
- virtual void AnimationEnded(const gfx::Animation* animation) OVERRIDE;
-
- private:
- // PageToolViewGtk
- virtual GdkColor GetButtonBorderColor() const OVERRIDE;
- virtual GdkColor GetGradientTopColor() const OVERRIDE;
- virtual GdkColor GetGradientBottomColor() const OVERRIDE;
- virtual void OnClick(GtkWidget* sender) OVERRIDE;
-
- // BubbleDelegateGtk
- virtual void BubbleClosing(BubbleGtk* bubble,
- bool closed_by_escape) OVERRIDE;
-
- // The owning LocationBarViewGtk.
- LocationBarViewGtk* parent_;
-
- scoped_ptr<ContentSettingImageModel> content_setting_image_model_;
-
- // The currently shown bubble if any.
- ContentSettingBubbleGtk* content_setting_bubble_;
-
- DISALLOW_COPY_AND_ASSIGN(ContentSettingImageViewGtk);
-};
-
-ContentSettingImageViewGtk::ContentSettingImageViewGtk(
- ContentSettingsType content_type,
- LocationBarViewGtk* parent)
- : PageToolViewGtk(),
- parent_(parent),
- content_setting_image_model_(
- ContentSettingImageModel::CreateContentSettingImageModel(
- content_type)),
- content_setting_bubble_(NULL) {
- animation_.SetSlideDuration(kContentSettingImageAnimationTime);
-}
-
-ContentSettingImageViewGtk::~ContentSettingImageViewGtk() {
- if (content_setting_bubble_)
- content_setting_bubble_->Close();
-}
-
-void ContentSettingImageViewGtk::Update(WebContents* web_contents) {
- if (web_contents)
- content_setting_image_model_->UpdateFromWebContents(web_contents);
-
- if (!content_setting_image_model_->is_visible()) {
- gtk_widget_hide(widget());
- return;
- }
-
- gtk_image_set_from_pixbuf(GTK_IMAGE(image_.get()),
- GtkThemeService::GetFrom(parent_->browser()->profile())->GetImageNamed(
- content_setting_image_model_->get_icon()).ToGdkPixbuf());
-
- gtk_widget_set_tooltip_text(widget(),
- content_setting_image_model_->get_tooltip().c_str());
- gtk_widget_show_all(widget());
-
- if (!web_contents)
- return;
-
- TabSpecificContentSettings* content_settings =
- TabSpecificContentSettings::FromWebContents(web_contents);
- if (!content_settings || content_settings->IsBlockageIndicated(
- content_setting_image_model_->get_content_settings_type()))
- return;
-
- // The content blockage was not yet indicated to the user. Start indication
- // animation and clear "not yet shown" flag.
- content_settings->SetBlockageHasBeenIndicated(
- content_setting_image_model_->get_content_settings_type());
-
- int label_string_id =
- content_setting_image_model_->explanatory_string_id();
- // If there's no string for the content type, we don't animate.
- if (!label_string_id)
- return;
-
- gtk_label_set_text(GTK_LABEL(label_.get()),
- l10n_util::GetStringUTF8(label_string_id).c_str());
- StartAnimating();
-}
-
-void ContentSettingImageViewGtk::AnimationEnded(
- const gfx::Animation* animation) {
- if (animation_.IsShowing()) {
- base::MessageLoop::current()->PostDelayedTask(
- FROM_HERE,
- base::Bind(&ContentSettingImageViewGtk::CloseAnimation,
- weak_factory_.GetWeakPtr()),
- base::TimeDelta::FromMilliseconds(kContentSettingImageDisplayTime));
- } else {
- gtk_widget_hide(label_.get());
- gtk_util::StopActingAsRoundedWindow(event_box_.get());
- gtk_event_box_set_visible_window(GTK_EVENT_BOX(event_box_.get()), FALSE);
- }
-}
-
-GdkColor ContentSettingImageViewGtk::GetButtonBorderColor() const {
- return kContentSettingBorderColor;
-}
-
-GdkColor ContentSettingImageViewGtk::GetGradientTopColor() const {
- return kContentSettingTopColor;
-}
-
-GdkColor ContentSettingImageViewGtk::GetGradientBottomColor() const {
- return kContentSettingBottomColor;
-}
-
-void ContentSettingImageViewGtk::OnClick(
- GtkWidget* sender) {
- WebContents* web_contents = parent_->GetWebContents();
- if (!web_contents)
- return;
- Profile* profile = parent_->browser()->profile();
- content_setting_bubble_ = new ContentSettingBubbleGtk(
- sender, this,
- ContentSettingBubbleModel::CreateContentSettingBubbleModel(
- parent_->browser()->content_setting_bubble_model_delegate(),
- web_contents,
- profile,
- content_setting_image_model_->get_content_settings_type()),
- profile);
- return;
-}
-
-void ContentSettingImageViewGtk::BubbleClosing(
- BubbleGtk* bubble,
- bool closed_by_escape) {
- content_setting_bubble_ = NULL;
-}
-
-gfx::Rect AllocationToRect(const GtkAllocation& allocation) {
- return gfx::Rect(allocation.x, allocation.y,
- allocation.width, allocation.height);
-}
-
-} // namespace
-
-////////////////////////////////////////////////////////////////////////////////
-// LocationBarViewGtk
-
-// static
-const GdkColor LocationBarViewGtk::kBackgroundColor =
- GDK_COLOR_RGB(255, 255, 255);
-
-LocationBarViewGtk::LocationBarViewGtk(Browser* browser)
- : OmniboxEditController(browser->command_controller()->command_updater()),
- LocationBar(browser->profile()),
- zoom_image_(NULL),
- manage_passwords_icon_image_(NULL),
- star_image_(NULL),
- starred_(false),
- star_sized_(false),
- site_type_alignment_(NULL),
- site_type_event_box_(NULL),
- location_icon_image_(NULL),
- drag_icon_(NULL),
- enable_location_drag_(false),
- security_info_label_(NULL),
- tab_to_search_alignment_(NULL),
- tab_to_search_box_(NULL),
- tab_to_search_full_label_(NULL),
- tab_to_search_partial_label_(NULL),
- tab_to_search_hint_(NULL),
- tab_to_search_hint_leading_label_(NULL),
- tab_to_search_hint_icon_(NULL),
- tab_to_search_hint_trailing_label_(NULL),
- browser_(browser),
- popup_window_mode_(false),
- theme_service_(NULL),
- hbox_width_(0),
- entry_box_width_(0),
- show_selected_keyword_(false),
- show_keyword_hint_(false),
- weak_ptr_factory_(this) {
-}
-
-LocationBarViewGtk::~LocationBarViewGtk() {
- // All of our widgets should be children of / owned by the alignment.
- zoom_.Destroy();
- manage_passwords_icon_.Destroy();
- star_.Destroy();
- hbox_.Destroy();
- content_setting_hbox_.Destroy();
- page_action_hbox_.Destroy();
-}
-
-void LocationBarViewGtk::Init(bool popup_window_mode) {
- popup_window_mode_ = popup_window_mode;
-
- theme_service_ = GtkThemeService::GetFrom(profile());
-
- // Create the widget first, so we can pass it to the OmniboxViewGtk.
- hbox_.Own(gtk_hbox_new(FALSE, kInnerPadding));
- gtk_container_set_border_width(GTK_CONTAINER(hbox_.get()), kHboxBorder);
- // We will paint for the alignment, to paint the background and border.
- gtk_widget_set_app_paintable(hbox_.get(), TRUE);
- // Redraw the whole location bar when it changes size (e.g., when toggling
- // the home button on/off.
- gtk_widget_set_redraw_on_allocate(hbox_.get(), TRUE);
-
- // Now initialize the OmniboxViewGtk.
- omnibox_view_.reset(new OmniboxViewGtk(this, browser_, profile(),
- command_updater(),
- popup_window_mode_, hbox_.get()));
- omnibox_view_->Init();
-
- g_signal_connect(hbox_.get(), "expose-event",
- G_CALLBACK(&HandleExposeThunk), this);
-
- BuildSiteTypeArea();
-
- // Put |tab_to_search_box_|, |omnibox_view_|, and |tab_to_search_hint_| into
- // a sub hbox, so that we can make this part horizontally shrinkable without
- // affecting other elements in the location bar.
- entry_box_ = gtk_hbox_new(FALSE, kInnerPadding);
- gtk_widget_show(entry_box_);
- gtk_widget_set_size_request(entry_box_, 0, -1);
- gtk_box_pack_start(GTK_BOX(hbox_.get()), entry_box_, TRUE, TRUE, 0);
-
- // We need to adjust the visibility of the search hint widgets according to
- // the horizontal space in the |entry_box_|.
- g_signal_connect(entry_box_, "size-allocate",
- G_CALLBACK(&OnEntryBoxSizeAllocateThunk), this);
-
- // Tab to search (the keyword box on the left hand side).
- tab_to_search_full_label_ =
- theme_service_->BuildLabel(std::string(), ui::kGdkBlack);
- tab_to_search_partial_label_ =
- theme_service_->BuildLabel(std::string(), ui::kGdkBlack);
- GtkWidget* tab_to_search_label_hbox = gtk_hbox_new(FALSE, 0);
- gtk_box_pack_start(GTK_BOX(tab_to_search_label_hbox),
- tab_to_search_full_label_, FALSE, FALSE, 0);
- gtk_box_pack_start(GTK_BOX(tab_to_search_label_hbox),
- tab_to_search_partial_label_, FALSE, FALSE, 0);
- GtkWidget* tab_to_search_hbox = gtk_hbox_new(FALSE, 0);
- ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
- tab_to_search_magnifier_ = gtk_image_new_from_pixbuf(
- rb.GetNativeImageNamed(IDR_KEYWORD_SEARCH_MAGNIFIER).ToGdkPixbuf());
- gtk_box_pack_start(GTK_BOX(tab_to_search_hbox), tab_to_search_magnifier_,
- FALSE, FALSE, 0);
- gtk_util::CenterWidgetInHBox(tab_to_search_hbox, tab_to_search_label_hbox,
- false, 0);
-
- // This creates a box around the keyword text with a border, background color,
- // and padding around the text.
- tab_to_search_box_ = gtk_util::CreateGtkBorderBin(
- tab_to_search_hbox, NULL, 1, 1, 1, 3);
- gtk_widget_set_name(tab_to_search_box_, "chrome-tab-to-search-box");
- gtk_util::ActAsRoundedWindow(tab_to_search_box_, kKeywordBorderColor,
- kCornerSize,
- gtk_util::ROUNDED_ALL, gtk_util::BORDER_ALL);
-
- // Put the event box in an alignment to get the padding correct.
- tab_to_search_alignment_ = gtk_alignment_new(0, 0, 1, 1);
- gtk_container_add(GTK_CONTAINER(tab_to_search_alignment_),
- tab_to_search_box_);
- gtk_box_pack_start(GTK_BOX(entry_box_), tab_to_search_alignment_,
- FALSE, FALSE, 0);
-
- // Show all children widgets of |tab_to_search_box_| initially, except
- // |tab_to_search_partial_label_|.
- gtk_widget_show_all(tab_to_search_box_);
- gtk_widget_hide(tab_to_search_partial_label_);
-
- omnibox_view_alignment_ = gtk_alignment_new(0.0, 0.0, 1.0, 1.0);
- gtk_container_add(GTK_CONTAINER(omnibox_view_alignment_),
- omnibox_view_->GetNativeView());
- gtk_box_pack_start(GTK_BOX(entry_box_), omnibox_view_alignment_,
- TRUE, TRUE, 0);
-
- // Tab to search notification (the hint on the right hand side).
- tab_to_search_hint_ = gtk_hbox_new(FALSE, 0);
- gtk_widget_set_name(tab_to_search_hint_, "chrome-tab-to-search-hint");
- tab_to_search_hint_leading_label_ =
- theme_service_->BuildLabel(std::string(), kHintTextColor);
- gtk_widget_set_sensitive(tab_to_search_hint_leading_label_, FALSE);
- tab_to_search_hint_icon_ = gtk_image_new_from_pixbuf(
- rb.GetNativeImageNamed(IDR_OMNIBOX_KEYWORD_HINT_TAB).ToGdkPixbuf());
- tab_to_search_hint_trailing_label_ =
- theme_service_->BuildLabel(std::string(), kHintTextColor);
- gtk_widget_set_sensitive(tab_to_search_hint_trailing_label_, FALSE);
- gtk_box_pack_start(GTK_BOX(tab_to_search_hint_),
- tab_to_search_hint_leading_label_,
- FALSE, FALSE, 0);
- gtk_box_pack_start(GTK_BOX(tab_to_search_hint_),
- tab_to_search_hint_icon_,
- FALSE, FALSE, 0);
- gtk_box_pack_start(GTK_BOX(tab_to_search_hint_),
- tab_to_search_hint_trailing_label_,
- FALSE, FALSE, 0);
- // Show all children widgets of |tab_to_search_hint_| initially.
- gtk_widget_show_all(tab_to_search_hint_);
- gtk_widget_hide(tab_to_search_hint_);
- // tab_to_search_hint_ gets hidden initially in OnChanged. Hiding it here
- // doesn't work, someone is probably calling show_all on our parent box.
- gtk_box_pack_end(GTK_BOX(entry_box_), tab_to_search_hint_, FALSE, FALSE, 0);
-
- if (browser_defaults::bookmarks_enabled && !ShouldOnlyShowLocation()) {
- // Hide the star icon in popups, app windows, etc.
- CreateStarButton();
- gtk_box_pack_end(GTK_BOX(hbox_.get()), star_.get(), FALSE, FALSE, 0);
- }
-
- CreateZoomButton();
- gtk_box_pack_end(GTK_BOX(hbox_.get()), zoom_.get(), FALSE, FALSE, 0);
-
- CreateManagePasswordsIconButton();
- gtk_box_pack_end(GTK_BOX(hbox_.get()), manage_passwords_icon_.get(), FALSE,
- FALSE, 0);
-
- content_setting_hbox_.Own(gtk_hbox_new(FALSE, kInnerPadding + 1));
- gtk_widget_set_name(content_setting_hbox_.get(),
- "chrome-content-setting-hbox");
- gtk_box_pack_end(GTK_BOX(hbox_.get()), content_setting_hbox_.get(),
- FALSE, FALSE, 1);
-
- for (int i = 0; i < CONTENT_SETTINGS_NUM_TYPES; ++i) {
- ContentSettingImageViewGtk* content_setting_view =
- new ContentSettingImageViewGtk(
- static_cast<ContentSettingsType>(i), this);
- content_setting_views_.push_back(content_setting_view);
- gtk_box_pack_end(GTK_BOX(content_setting_hbox_.get()),
- content_setting_view->widget(), FALSE, FALSE, 0);
- }
-
- page_action_hbox_.Own(gtk_hbox_new(FALSE, kInnerPadding));
- gtk_widget_set_name(page_action_hbox_.get(),
- "chrome-page-action-hbox");
- gtk_box_pack_end(GTK_BOX(hbox_.get()), page_action_hbox_.get(),
- FALSE, FALSE, 0);
-
- // Now that we've created the widget hierarchy, connect to the main |hbox_|'s
- // size-allocate so we can do proper resizing and eliding on
- // |security_info_label_|.
- g_signal_connect(hbox_.get(), "size-allocate",
- G_CALLBACK(&OnHboxSizeAllocateThunk), this);
-
- registrar_.Add(this,
- chrome::NOTIFICATION_BROWSER_THEME_CHANGED,
- content::Source<ThemeService>(theme_service_));
- registrar_.Add(this,
- chrome::NOTIFICATION_EXTENSION_LOCATION_BAR_UPDATED,
- content::Source<Profile>(profile()));
- edit_bookmarks_enabled_.Init(prefs::kEditBookmarksEnabled,
- profile()->GetPrefs(),
- base::Bind(&LocationBarViewGtk::UpdateStarIcon,
- base::Unretained(this)));
-
- theme_service_->InitThemesFor(this);
-}
-
-void LocationBarViewGtk::SetPreviewEnabledPageAction(
- ExtensionAction* page_action,
- bool preview_enabled) {
- DCHECK(page_action);
- for (ScopedVector<PageActionViewGtk>::iterator iter =
- page_action_views_.begin(); iter != page_action_views_.end();
- ++iter) {
- if ((*iter)->page_action() == page_action) {
- (*iter)->set_preview_enabled(preview_enabled);
- UpdatePageActions();
- return;
- }
- }
-}
-
-GtkWidget* LocationBarViewGtk::GetPageActionWidget(
- ExtensionAction* page_action) {
- DCHECK(page_action);
- for (ScopedVector<PageActionViewGtk>::iterator iter =
- page_action_views_.begin();
- iter != page_action_views_.end();
- ++iter) {
- if ((*iter)->page_action() == page_action)
- return (*iter)->widget();
- }
- return NULL;
-}
-
-void LocationBarViewGtk::ShowStarBubble(const GURL& url,
- bool newly_bookmarked) {
- if (!star_.get())
- return;
-
- if (star_sized_) {
- BookmarkBubbleGtk::Show(star_.get(), profile(), url, newly_bookmarked);
- } else {
- on_star_sized_ = base::Bind(&BookmarkBubbleGtk::Show, star_.get(),
- profile(), url, newly_bookmarked);
- }
-}
-
-void LocationBarViewGtk::ShowManagePasswordsBubble() {
- if (GetToolbarModel()->input_in_progress() || !GetWebContents())
- return;
-
- ManagePasswordsBubbleGtk::ShowBubble(GetWebContents());
-}
-
-void LocationBarViewGtk::ZoomChangedForActiveTab(bool can_show_bubble) {
- UpdateZoomIcon();
-
- if (can_show_bubble && gtk_widget_get_visible(zoom_.get()))
- ShowZoomBubble();
-}
-
-void LocationBarViewGtk::SetStarred(bool starred) {
- if (starred == starred_)
- return;
-
- starred_ = starred;
- UpdateStarIcon();
-}
-
-void LocationBarViewGtk::Update(const WebContents* contents) {
- UpdateZoomIcon();
- UpdateStarIcon();
- UpdateSiteTypeArea();
- UpdateContentSettingsIcons();
- UpdatePageActions();
- if (contents)
- omnibox_view_->OnTabChanged(contents);
- else
- omnibox_view_->Update();
- // The security level (background color) could have changed, etc.
- if (theme_service_->UsingNativeTheme()) {
- // In GTK mode, we need our parent to redraw, as it draws the text entry
- // border.
- gtk_widget_queue_draw(gtk_widget_get_parent(widget()));
- } else {
- gtk_widget_queue_draw(widget());
- }
- ZoomBubbleGtk::CloseBubble();
-}
-
-void LocationBarViewGtk::OnChanged() {
- UpdateSiteTypeArea();
-
- const base::string16 keyword(omnibox_view_->model()->keyword());
- const bool is_keyword_hint = omnibox_view_->model()->is_keyword_hint();
- show_selected_keyword_ = !keyword.empty() && !is_keyword_hint;
- show_keyword_hint_ = !keyword.empty() && is_keyword_hint;
-
- if (show_selected_keyword_)
- SetKeywordLabel(keyword);
-
- if (show_keyword_hint_)
- SetKeywordHintLabel(keyword);
-
- AdjustChildrenVisibility();
-}
-
-void LocationBarViewGtk::OnSetFocus() {
- AccessibilityTextBoxInfo info(profile(),
- l10n_util::GetStringUTF8(IDS_ACCNAME_LOCATION),
- std::string(), false);
- ExtensionAccessibilityEventRouter::GetInstance()->HandleControlEvent(
- ui::AX_EVENT_FOCUS, &info);
-
- // Update the keyword and search hint states.
- OnChanged();
-}
-
-void LocationBarViewGtk::ShowURL() {
- omnibox_view_->ShowURL();
-}
-
-InstantController* LocationBarViewGtk::GetInstant() {
- return browser_->instant_controller() ?
- browser_->instant_controller()->instant() : NULL;
-}
-
-WebContents* LocationBarViewGtk::GetWebContents() {
- return browser_->tab_strip_model()->GetActiveWebContents();
-}
-
-ToolbarModel* LocationBarViewGtk::GetToolbarModel() {
- return browser_->toolbar_model();
-}
-
-const ToolbarModel* LocationBarViewGtk::GetToolbarModel() const {
- return browser_->toolbar_model();
-}
-
-void LocationBarViewGtk::ShowFirstRunBubble() {
- // We need the browser window to be shown before we can show the bubble, but
- // we get called before that's happened.
- base::MessageLoop::current()->PostTask(
- FROM_HERE,
- base::Bind(&LocationBarViewGtk::ShowFirstRunBubbleInternal,
- weak_ptr_factory_.GetWeakPtr()));
-}
-
-GURL LocationBarViewGtk::GetDestinationURL() const {
- return destination_url();
-}
-
-WindowOpenDisposition LocationBarViewGtk::GetWindowOpenDisposition() const {
- return disposition();
-}
-
-content::PageTransition LocationBarViewGtk::GetPageTransition() const {
- return transition();
-}
-
-void LocationBarViewGtk::AcceptInput() {
- omnibox_view_->model()->AcceptInput(CURRENT_TAB, false);
-}
-
-void LocationBarViewGtk::FocusLocation(bool select_all) {
- omnibox_view_->SetFocus();
- if (select_all)
- omnibox_view_->SelectAll(true);
-}
-
-void LocationBarViewGtk::FocusSearch() {
- omnibox_view_->SetFocus();
- omnibox_view_->SetForcedQuery();
-}
-
-void LocationBarViewGtk::UpdateContentSettingsIcons() {
- bool any_visible = false;
- for (ScopedVector<PageToolViewGtk>::iterator i(
- content_setting_views_.begin());
- i != content_setting_views_.end(); ++i) {
- (*i)->Update(GetToolbarModel()->input_in_progress() ?
- NULL : GetWebContents());
- any_visible = (*i)->IsVisible() || any_visible;
- }
- // If there are no visible content things, hide the top level box so it
- // doesn't mess with padding.
- gtk_widget_set_visible(content_setting_hbox_.get(), any_visible);
-}
-
-void LocationBarViewGtk::UpdateManagePasswordsIconAndBubble() {
- UpdateManagePasswordsIcon();
-}
-
-void LocationBarViewGtk::UpdatePageActions() {
- std::vector<ExtensionAction*> new_page_actions;
-
- WebContents* contents = GetWebContents();
- if (contents) {
- LocationBarController* location_bar_controller =
- extensions::TabHelper::FromWebContents(contents)->
- location_bar_controller();
- new_page_actions = location_bar_controller->GetCurrentActions();
- }
-
- // Initialize on the first call, or re-initialize if more extensions have been
- // loaded or added after startup.
- if (new_page_actions != page_actions_) {
- page_actions_.swap(new_page_actions);
- page_action_views_.clear();
-
- for (size_t i = 0; i < page_actions_.size(); ++i) {
- page_action_views_.push_back(
- new PageActionViewGtk(this, page_actions_[i]));
- gtk_box_pack_end(GTK_BOX(page_action_hbox_.get()),
- page_action_views_[i]->widget(), FALSE, FALSE, 0);
- }
- content::NotificationService::current()->Notify(
- chrome::NOTIFICATION_EXTENSION_PAGE_ACTION_COUNT_CHANGED,
- content::Source<LocationBar>(this),
- content::NotificationService::NoDetails());
- }
-
- if (!page_action_views_.empty() && contents) {
- GURL url = GetWebContents()->GetURL();
-
- for (size_t i = 0; i < page_action_views_.size(); i++) {
- page_action_views_[i]->UpdateVisibility(
- GetToolbarModel()->input_in_progress() ? NULL : contents, url);
- }
- gtk_widget_queue_draw(hbox_.get());
- }
-
- // If there are no visible page actions, hide the hbox too, so that it does
- // not affect the padding in the location bar.
- gtk_widget_set_visible(page_action_hbox_.get(),
- PageActionVisibleCount() && !ShouldOnlyShowLocation());
-}
-
-void LocationBarViewGtk::InvalidatePageActions() {
- size_t count_before = page_action_views_.size();
- page_action_views_.clear();
- if (page_action_views_.size() != count_before) {
- content::NotificationService::current()->Notify(
- chrome::NOTIFICATION_EXTENSION_PAGE_ACTION_COUNT_CHANGED,
- content::Source<LocationBar>(this),
- content::NotificationService::NoDetails());
- }
-}
-
-void LocationBarViewGtk::UpdateOpenPDFInReaderPrompt() {
- // Not implemented on Gtk.
-}
-
-void LocationBarViewGtk::UpdateGeneratedCreditCardView() {
- NOTIMPLEMENTED();
-}
-
-void LocationBarViewGtk::SaveStateToContents(WebContents* contents) {
- omnibox_view_->SaveStateToTab(contents);
-}
-
-void LocationBarViewGtk::Revert() {
- omnibox_view_->RevertAll();
-}
-
-const OmniboxView* LocationBarViewGtk::GetOmniboxView() const {
- return omnibox_view_.get();
-}
-
-OmniboxView* LocationBarViewGtk::GetOmniboxView() {
- return omnibox_view_.get();
-}
-
-LocationBarTesting* LocationBarViewGtk::GetLocationBarForTesting() {
- return this;
-}
-
-int LocationBarViewGtk::PageActionCount() {
- return page_action_views_.size();
-}
-
-int LocationBarViewGtk::PageActionVisibleCount() {
- int count = 0;
- gtk_container_foreach(GTK_CONTAINER(page_action_hbox_.get()),
- CountVisibleWidgets, &count);
- return count;
-}
-
-ExtensionAction* LocationBarViewGtk::GetPageAction(size_t index) {
- if (index >= page_action_views_.size()) {
- NOTREACHED();
- return NULL;
- }
-
- return page_action_views_[index]->page_action();
-}
-
-ExtensionAction* LocationBarViewGtk::GetVisiblePageAction(size_t index) {
- size_t visible_index = 0;
- for (size_t i = 0; i < page_action_views_.size(); ++i) {
- if (page_action_views_[i]->IsVisible()) {
- if (index == visible_index++)
- return page_action_views_[i]->page_action();
- }
- }
-
- NOTREACHED();
- return NULL;
-}
-
-void LocationBarViewGtk::TestPageActionPressed(size_t index) {
- if (index >= page_action_views_.size()) {
- NOTREACHED();
- return;
- }
-
- page_action_views_[index]->TestActivatePageAction();
-}
-
-bool LocationBarViewGtk::GetBookmarkStarVisibility() {
- return starred_;
-}
-
-void LocationBarViewGtk::Observe(int type,
- const content::NotificationSource& source,
- const content::NotificationDetails& details) {
- switch (type) {
- case chrome::NOTIFICATION_EXTENSION_LOCATION_BAR_UPDATED: {
- // Only update if the updated action box was for the active tab contents.
- WebContents* target_tab = content::Details<WebContents>(details).ptr();
- if (target_tab == GetWebContents())
- UpdatePageActions();
- break;
- }
-
- case chrome::NOTIFICATION_BROWSER_THEME_CHANGED: {
- if (theme_service_->UsingNativeTheme()) {
- gtk_widget_modify_bg(tab_to_search_box_, GTK_STATE_NORMAL, NULL);
-
- GdkColor border_color = theme_service_->GetGdkColor(
- ThemeProperties::COLOR_FRAME);
- gtk_util::SetRoundedWindowBorderColor(tab_to_search_box_, border_color);
-
- gtk_util::UndoForceFontSize(security_info_label_);
- gtk_util::UndoForceFontSize(tab_to_search_full_label_);
- gtk_util::UndoForceFontSize(tab_to_search_partial_label_);
- gtk_util::UndoForceFontSize(tab_to_search_hint_leading_label_);
- gtk_util::UndoForceFontSize(tab_to_search_hint_trailing_label_);
-
- gtk_alignment_set_padding(GTK_ALIGNMENT(omnibox_view_alignment_),
- 0, 0, 0, 0);
- gtk_alignment_set_padding(GTK_ALIGNMENT(tab_to_search_alignment_),
- 1, 1, 1, 0);
- gtk_alignment_set_padding(GTK_ALIGNMENT(site_type_alignment_),
- 1, 1, 1, 0);
- } else {
- gtk_widget_modify_bg(tab_to_search_box_, GTK_STATE_NORMAL,
- &kKeywordBackgroundColor);
- gtk_util::SetRoundedWindowBorderColor(tab_to_search_box_,
- kKeywordBorderColor);
-
- // Until we switch to vector graphics, force the font size of labels.
- // 12.1px = 9pt @ 96dpi
- gtk_util::ForceFontSizePixels(security_info_label_, 12.1);
- gtk_util::ForceFontSizePixels(tab_to_search_full_label_,
- browser_defaults::kOmniboxFontPixelSize);
- gtk_util::ForceFontSizePixels(tab_to_search_partial_label_,
- browser_defaults::kOmniboxFontPixelSize);
- gtk_util::ForceFontSizePixels(tab_to_search_hint_leading_label_,
- browser_defaults::kOmniboxFontPixelSize);
- gtk_util::ForceFontSizePixels(tab_to_search_hint_trailing_label_,
- browser_defaults::kOmniboxFontPixelSize);
-
- const int left_right = popup_window_mode_ ? kPopupEdgeThickness : 0;
- gtk_alignment_set_padding(GTK_ALIGNMENT(omnibox_view_alignment_),
- kBorderThickness, kBorderThickness,
- left_right, left_right);
- gtk_alignment_set_padding(GTK_ALIGNMENT(tab_to_search_alignment_),
- 1, 1, 0, 0);
- gtk_alignment_set_padding(GTK_ALIGNMENT(site_type_alignment_),
- 1, 1, 0, 0);
- }
-
- UpdateZoomIcon();
- UpdateManagePasswordsIcon();
- UpdateStarIcon();
- UpdateSiteTypeArea();
- UpdateContentSettingsIcons();
- break;
- }
-
- default:
- NOTREACHED();
- }
-}
-
-void LocationBarViewGtk::BuildSiteTypeArea() {
- location_icon_image_ = gtk_image_new();
- gtk_widget_set_name(location_icon_image_, "chrome-location-icon");
-
- GtkWidget* icon_alignment = gtk_alignment_new(0, 0, 1, 1);
- gtk_alignment_set_padding(GTK_ALIGNMENT(icon_alignment), 0, 0, 2, 0);
- gtk_container_add(GTK_CONTAINER(icon_alignment), location_icon_image_);
- gtk_widget_show_all(icon_alignment);
-
- security_info_label_ = gtk_label_new(NULL);
- gtk_label_set_ellipsize(GTK_LABEL(security_info_label_),
- PANGO_ELLIPSIZE_MIDDLE);
- gtk_widget_modify_fg(GTK_WIDGET(security_info_label_), GTK_STATE_NORMAL,
- &kEvSecureTextColor);
- gtk_widget_set_name(security_info_label_,
- "chrome-location-bar-security-info-label");
-
- GtkWidget* site_type_hbox = gtk_hbox_new(FALSE, 1);
- gtk_box_pack_start(GTK_BOX(site_type_hbox), icon_alignment,
- FALSE, FALSE, 0);
- gtk_box_pack_start(GTK_BOX(site_type_hbox), security_info_label_,
- FALSE, FALSE, 2);
-
- site_type_event_box_ = gtk_event_box_new();
- gtk_widget_modify_bg(site_type_event_box_, GTK_STATE_NORMAL,
- &kEvSecureBackgroundColor);
- g_signal_connect(site_type_event_box_, "drag-data-get",
- G_CALLBACK(&OnIconDragDataThunk), this);
- g_signal_connect(site_type_event_box_, "drag-begin",
- G_CALLBACK(&OnIconDragBeginThunk), this);
- g_signal_connect(site_type_event_box_, "drag-end",
- G_CALLBACK(&OnIconDragEndThunk), this);
-
- // Make the event box not visible so it does not paint a background.
- gtk_event_box_set_visible_window(GTK_EVENT_BOX(site_type_event_box_),
- FALSE);
- gtk_widget_set_name(site_type_event_box_,
- "chrome-location-icon-eventbox");
- gtk_container_add(GTK_CONTAINER(site_type_event_box_),
- site_type_hbox);
-
- // Put the event box in an alignment to get the padding correct.
- site_type_alignment_ = gtk_alignment_new(0, 0, 1, 1);
- gtk_container_add(GTK_CONTAINER(site_type_alignment_),
- site_type_event_box_);
- gtk_box_pack_start(GTK_BOX(hbox_.get()), site_type_alignment_,
- FALSE, FALSE, 0);
-
- gtk_widget_set_tooltip_text(location_icon_image_,
- l10n_util::GetStringUTF8(IDS_TOOLTIP_LOCATION_ICON).c_str());
-
- g_signal_connect(site_type_event_box_, "button-release-event",
- G_CALLBACK(&OnIconReleasedThunk), this);
-}
-
-void LocationBarViewGtk::SetSiteTypeDragSource() {
- bool enable = !GetOmniboxView()->IsEditingOrEmpty();
- if (enable_location_drag_ == enable)
- return;
- enable_location_drag_ = enable;
-
- if (!enable) {
- gtk_drag_source_unset(site_type_event_box_);
- return;
- }
-
- gtk_drag_source_set(site_type_event_box_, GDK_BUTTON1_MASK,
- NULL, 0, GDK_ACTION_COPY);
- ui::SetSourceTargetListFromCodeMask(site_type_event_box_,
- ui::TEXT_PLAIN |
- ui::TEXT_URI_LIST |
- ui::CHROME_NAMED_URL);
-}
-
-gboolean LocationBarViewGtk::HandleExpose(GtkWidget* widget,
- GdkEventExpose* event) {
- // If we're not using GTK theming, draw our own border over the edge pixels
- // of the background.
- GtkThemeService* theme_service = GtkThemeService::GetFrom(profile());
- if (!theme_service->UsingNativeTheme()) {
- // Perform a scoped paint to fill in the background color.
- {
- gfx::CanvasSkiaPaint canvas(event, /*opaque=*/false);
-
- GtkAllocation allocation;
- gtk_widget_get_allocation(widget, &allocation);
-
- int thickness = popup_window_mode_ ?
- kPopupEdgeThickness : kNormalEdgeThickness;
- gfx::Rect bounds(allocation);
- bounds.Inset(thickness, thickness);
-
- const SkColor color = SK_ColorWHITE;
- if (popup_window_mode_) {
- canvas.FillRect(bounds, color);
- } else {
- SkPaint paint;
- paint.setStyle(SkPaint::kFill_Style);
- paint.setColor(color);
- const int kBorderCornerRadius = 2;
- canvas.DrawRoundRect(bounds, kBorderCornerRadius, paint);
- }
- }
-
- if (popup_window_mode_) {
- NineBox(IDR_OMNIBOX_POPUP_BORDER_AND_SHADOW_TOP_LEFT,
- IDR_OMNIBOX_POPUP_BORDER_AND_SHADOW_TOP,
- IDR_OMNIBOX_POPUP_BORDER_AND_SHADOW_TOP_RIGHT,
- IDR_OMNIBOX_POPUP_BORDER_AND_SHADOW_LEFT,
- IDR_OMNIBOX_POPUP_BORDER_AND_SHADOW_CENTER,
- IDR_OMNIBOX_POPUP_BORDER_AND_SHADOW_RIGHT,
- IDR_OMNIBOX_POPUP_BORDER_AND_SHADOW_BOTTOM_LEFT,
- IDR_OMNIBOX_POPUP_BORDER_AND_SHADOW_BOTTOM,
- IDR_OMNIBOX_POPUP_BORDER_AND_SHADOW_BOTTOM_RIGHT).
- RenderToWidget(widget);
- } else {
- NineBox(IDR_TEXTFIELD_TOP_LEFT,
- IDR_TEXTFIELD_TOP,
- IDR_TEXTFIELD_TOP_RIGHT,
- IDR_TEXTFIELD_LEFT,
- IDR_TEXTFIELD_CENTER,
- IDR_TEXTFIELD_RIGHT,
- IDR_TEXTFIELD_BOTTOM_LEFT,
- IDR_TEXTFIELD_BOTTOM,
- IDR_TEXTFIELD_BOTTOM_RIGHT).
- RenderToWidget(widget);
- }
- }
-
- return FALSE; // Continue propagating the expose.
-}
-
-gboolean LocationBarViewGtk::OnIconReleased(GtkWidget* sender,
- GdkEventButton* event) {
- WebContents* tab = GetWebContents();
-
- if (event->button == 1) {
- // Do not show page info if the user has been editing the location
- // bar, or the location bar is at the NTP.
- if (GetOmniboxView()->IsEditingOrEmpty())
- return FALSE;
-
- // (0,0) event coordinates indicates that the release came at the end of
- // a drag.
- if (event->x == 0 && event->y == 0)
- return FALSE;
-
- // Important to use GetVisibleEntry to match what's showing in the omnibox.
- NavigationEntry* nav_entry = tab->GetController().GetVisibleEntry();
- if (!nav_entry) {
- NOTREACHED();
- return FALSE;
- }
- chrome::ShowWebsiteSettings(browser_, tab, nav_entry->GetURL(),
- nav_entry->GetSSL());
- return TRUE;
- } else if (event->button == 2) {
- // When the user middle clicks on the location icon, try to open the
- // contents of the PRIMARY selection in the current tab.
- // If the click was outside our bounds, do nothing.
- if (!gtk_util::WidgetBounds(sender).Contains(
- gfx::Point(event->x, event->y))) {
- return FALSE;
- }
-
- GURL url;
- if (!gtk_util::URLFromPrimarySelection(profile(), &url))
- return FALSE;
-
- tab->OpenURL(OpenURLParams(
- url, content::Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED,
- false));
- return TRUE;
- }
-
- return FALSE;
-}
-
-void LocationBarViewGtk::OnIconDragData(GtkWidget* sender,
- GdkDragContext* context,
- GtkSelectionData* data,
- guint info, guint time) {
- ui::WriteURLWithName(data, drag_url_, drag_title_, info);
-}
-
-void LocationBarViewGtk::OnIconDragBegin(GtkWidget* sender,
- GdkDragContext* context) {
- content::WebContents* web_contents = GetWebContents();
- gfx::Image favicon =
- FaviconTabHelper::FromWebContents(web_contents)->GetFavicon();
- if (favicon.IsEmpty())
- return;
- drag_url_ = web_contents->GetURL();
- drag_title_ = web_contents->GetTitle();
- drag_icon_ = GetDragRepresentation(favicon.ToGdkPixbuf(), drag_title_,
- theme_service_);
- gtk_drag_set_icon_widget(context, drag_icon_, 0, 0);
-}
-
-void LocationBarViewGtk::OnIconDragEnd(GtkWidget* sender,
- GdkDragContext* context) {
- DCHECK(drag_icon_);
- gtk_widget_destroy(drag_icon_);
- drag_icon_ = NULL;
- drag_url_ = GURL::EmptyGURL();
- drag_title_.clear();
-}
-
-void LocationBarViewGtk::OnHboxSizeAllocate(GtkWidget* sender,
- GtkAllocation* allocation) {
- if (hbox_width_ != allocation->width) {
- hbox_width_ = allocation->width;
- UpdateEVCertificateLabelSize();
- }
- InstantService* instant_service =
- InstantServiceFactory::GetForProfile(profile());
- if (instant_service) {
- instant_service->OnOmniboxStartMarginChanged(
- AllocationToRect(*allocation).x());
- }
-}
-
-void LocationBarViewGtk::OnEntryBoxSizeAllocate(GtkWidget* sender,
- GtkAllocation* allocation) {
- if (entry_box_width_ != allocation->width) {
- entry_box_width_ = allocation->width;
- AdjustChildrenVisibility();
- }
-}
-
-gboolean LocationBarViewGtk::OnZoomButtonPress(GtkWidget* widget,
- GdkEventButton* event) {
- if (event->button == 1 && GetWebContents()) {
- // If the zoom icon is clicked, show the zoom bubble and keep it open until
- // it loses focus.
- ZoomBubbleGtk::ShowBubble(GetWebContents(), false);
- return TRUE;
- }
- return FALSE;
-}
-
-gboolean LocationBarViewGtk::OnManagePasswordsIconButtonPress(
- GtkWidget* widget, GdkEventButton* event) {
- if (event->button == 1 && GetWebContents()) {
- // If the manage passwords icon is clicked, show the manage passwords bubble
- // and keep it open until the user makes a choice or clicks outside the
- // bubble.
- ManagePasswordsBubbleGtk::ShowBubble(GetWebContents());
- return TRUE;
- }
- return FALSE;
-}
-
-void LocationBarViewGtk::OnStarButtonSizeAllocate(GtkWidget* sender,
- GtkAllocation* allocation) {
- if (!on_star_sized_.is_null()) {
- on_star_sized_.Run();
- on_star_sized_.Reset();
- }
- star_sized_ = true;
-}
-
-gboolean LocationBarViewGtk::OnStarButtonPress(GtkWidget* widget,
- GdkEventButton* event) {
- if (event->button != 1)
- return FALSE;
- chrome::ExecuteCommand(browser_, IDC_BOOKMARK_PAGE_FROM_STAR);
- return TRUE;
-}
-
-void LocationBarViewGtk::UpdateSiteTypeArea() {
- // The icon is always visible except when the |tab_to_search_alignment_| is
- // visible.
- if (!omnibox_view_->model()->keyword().empty() &&
- !omnibox_view_->model()->is_keyword_hint()) {
- gtk_widget_hide(site_type_area());
- return;
- }
-
- int resource_id = omnibox_view_->GetIcon();
- gtk_image_set_from_pixbuf(
- GTK_IMAGE(location_icon_image_),
- theme_service_->GetImageNamed(resource_id).ToGdkPixbuf());
-
- if (GetToolbarModel()->GetSecurityLevel(false) == ToolbarModel::EV_SECURE) {
- if (!gtk_util::IsActingAsRoundedWindow(site_type_event_box_)) {
- // Fun fact: If wee try to make |site_type_event_box_| act as a
- // rounded window while it doesn't have a visible window, GTK interprets
- // this as a sign that it should paint the skyline texture into the
- // omnibox.
- gtk_event_box_set_visible_window(GTK_EVENT_BOX(site_type_event_box_),
- TRUE);
-
- gtk_util::ActAsRoundedWindow(site_type_event_box_,
- kEvSecureBorderColor,
- kCornerSize,
- gtk_util::ROUNDED_ALL,
- gtk_util::BORDER_ALL);
- }
-
- base::string16 info_text = GetToolbarModel()->GetEVCertName();
- gtk_label_set_text(GTK_LABEL(security_info_label_),
- base::UTF16ToUTF8(info_text).c_str());
-
- UpdateEVCertificateLabelSize();
-
- gtk_widget_show(GTK_WIDGET(security_info_label_));
- } else {
- if (gtk_util::IsActingAsRoundedWindow(site_type_event_box_)) {
- gtk_util::StopActingAsRoundedWindow(site_type_event_box_);
-
- gtk_event_box_set_visible_window(GTK_EVENT_BOX(site_type_event_box_),
- FALSE);
- }
-
- gtk_widget_hide(GTK_WIDGET(security_info_label_));
- }
-
- if (GetOmniboxView()->IsEditingOrEmpty()) {
- // Do not show the tooltip if the user has been editing the location
- // bar, or the location bar is at the NTP.
- gtk_widget_set_tooltip_text(location_icon_image_, "");
- } else {
- gtk_widget_set_tooltip_text(location_icon_image_,
- l10n_util::GetStringUTF8(IDS_TOOLTIP_LOCATION_ICON).c_str());
- }
-
- gtk_widget_show(site_type_area());
-
- SetSiteTypeDragSource();
-}
-
-void LocationBarViewGtk::UpdateEVCertificateLabelSize() {
- // Figure out the width of the average character.
- PangoLayout* layout = gtk_label_get_layout(GTK_LABEL(security_info_label_));
- PangoContext* context = pango_layout_get_context(layout);
- PangoFontMetrics* metrics = pango_context_get_metrics(
- context,
- gtk_widget_get_style(security_info_label_)->font_desc,
- pango_context_get_language(context));
- int char_width =
- pango_font_metrics_get_approximate_char_width(metrics) / PANGO_SCALE;
-
- // The EV label should never take up more than half the hbox. We try to
- // correct our inaccurate measurement units ("the average character width")
- // by dividing more than an even 2.
- GtkAllocation security_label_allocation;
- gtk_widget_get_allocation(security_info_label_, &security_label_allocation);
- GtkAllocation entry_box_allocation;
- gtk_widget_get_allocation(entry_box_, &entry_box_allocation);
- int text_area = security_label_allocation.width +
- entry_box_allocation.width;
- int max_chars = static_cast<int>(static_cast<float>(text_area) /
- static_cast<float>(char_width) / 2.75);
- // Don't let the label be smaller than 10 characters so that the country
- // code is always visible.
- gtk_label_set_max_width_chars(GTK_LABEL(security_info_label_),
- std::max(10, max_chars));
-
- pango_font_metrics_unref(metrics);
-}
-
-void LocationBarViewGtk::SetKeywordLabel(const base::string16& keyword) {
- if (keyword.empty())
- return;
-
- TemplateURLService* template_url_service =
- TemplateURLServiceFactory::GetForProfile(profile());
- if (!template_url_service)
- return;
-
- bool is_extension_keyword;
- const base::string16 short_name = template_url_service->GetKeywordShortName(
- keyword, &is_extension_keyword);
- const base::string16 min_string =
- location_bar_util::CalculateMinString(short_name);
- const base::string16 full_name = is_extension_keyword ?
- short_name :
- l10n_util::GetStringFUTF16(IDS_OMNIBOX_KEYWORD_TEXT, short_name);
- const base::string16 partial_name = is_extension_keyword ?
- min_string :
- l10n_util::GetStringFUTF16(IDS_OMNIBOX_KEYWORD_TEXT, min_string);
- gtk_label_set_text(GTK_LABEL(tab_to_search_full_label_),
- base::UTF16ToUTF8(full_name).c_str());
- gtk_label_set_text(GTK_LABEL(tab_to_search_partial_label_),
- base::UTF16ToUTF8(partial_name).c_str());
-
- if (last_keyword_ != keyword) {
- last_keyword_ = keyword;
-
- if (is_extension_keyword) {
- const TemplateURL* template_url =
- template_url_service->GetTemplateURLForKeyword(keyword);
- gfx::Image image = extensions::OmniboxAPI::Get(profile())->
- GetOmniboxIcon(template_url->GetExtensionId());
- gtk_image_set_from_pixbuf(GTK_IMAGE(tab_to_search_magnifier_),
- image.ToGdkPixbuf());
- } else {
- ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
- gtk_image_set_from_pixbuf(GTK_IMAGE(tab_to_search_magnifier_),
- rb.GetNativeImageNamed(IDR_OMNIBOX_SEARCH).ToGdkPixbuf());
- }
- }
-}
-
-void LocationBarViewGtk::SetKeywordHintLabel(const base::string16& keyword) {
- if (keyword.empty())
- return;
-
- TemplateURLService* template_url_service =
- TemplateURLServiceFactory::GetForProfile(profile());
- if (!template_url_service)
- return;
-
- bool is_extension_keyword;
- const base::string16 short_name = template_url_service->
- GetKeywordShortName(keyword, &is_extension_keyword);
- int message_id = is_extension_keyword ?
- IDS_OMNIBOX_EXTENSION_KEYWORD_HINT : IDS_OMNIBOX_KEYWORD_HINT;
- std::vector<size_t> content_param_offsets;
- const base::string16 keyword_hint = l10n_util::GetStringFUTF16(
- message_id,
- base::string16(),
- short_name,
- &content_param_offsets);
- if (content_param_offsets.size() != 2) {
- // See comments on an identical NOTREACHED() in search_provider.cc.
- NOTREACHED();
- return;
- }
-
- std::string leading(base::UTF16ToUTF8(
- keyword_hint.substr(0, content_param_offsets.front())));
- std::string trailing(base::UTF16ToUTF8(
- keyword_hint.substr(content_param_offsets.front())));
- gtk_label_set_text(GTK_LABEL(tab_to_search_hint_leading_label_),
- leading.c_str());
- gtk_label_set_text(GTK_LABEL(tab_to_search_hint_trailing_label_),
- trailing.c_str());
-}
-
-void LocationBarViewGtk::ShowFirstRunBubbleInternal() {
- if (!omnibox_view_.get() || !gtk_widget_get_window(widget()))
- return;
-
- gfx::Rect bounds = gtk_util::WidgetBounds(location_icon_image_);
- bounds.set_x(bounds.x() + kFirstRunBubbleLeftSpacing);
- FirstRunBubble::Show(browser_, location_icon_image_, bounds);
-}
-
-void LocationBarViewGtk::ShowZoomBubble() {
- if (GetToolbarModel()->input_in_progress() || !GetWebContents())
- return;
-
- ZoomBubbleGtk::ShowBubble(GetWebContents(), true);
-}
-
-void LocationBarViewGtk::AdjustChildrenVisibility() {
- int text_width = omnibox_view_->GetTextWidth();
- int available_width = entry_box_width_ - text_width - kInnerPadding;
-
- // Only one of |tab_to_search_alignment_| and |tab_to_search_hint_| can be
- // visible at the same time.
- if (!show_selected_keyword_ &&
- gtk_widget_get_visible(tab_to_search_alignment_)) {
- gtk_widget_hide(tab_to_search_alignment_);
- } else if (!show_keyword_hint_ &&
- gtk_widget_get_visible(tab_to_search_hint_)) {
- gtk_widget_hide(tab_to_search_hint_);
- }
-
- if (show_selected_keyword_) {
- GtkRequisition box, full_label, partial_label;
- gtk_widget_size_request(tab_to_search_box_, &box);
- gtk_widget_size_request(tab_to_search_full_label_, &full_label);
- gtk_widget_size_request(tab_to_search_partial_label_, &partial_label);
- int full_partial_width_diff = full_label.width - partial_label.width;
- int full_box_width;
- int partial_box_width;
- if (gtk_widget_get_visible(tab_to_search_full_label_)) {
- full_box_width = box.width;
- partial_box_width = full_box_width - full_partial_width_diff;
- } else {
- partial_box_width = box.width;
- full_box_width = partial_box_width + full_partial_width_diff;
- }
-
- if (partial_box_width >= entry_box_width_ - kInnerPadding) {
- gtk_widget_hide(tab_to_search_alignment_);
- } else if (full_box_width >= available_width) {
- gtk_widget_hide(tab_to_search_full_label_);
- gtk_widget_show(tab_to_search_partial_label_);
- gtk_widget_show(tab_to_search_alignment_);
- } else if (full_box_width < available_width) {
- gtk_widget_hide(tab_to_search_partial_label_);
- gtk_widget_show(tab_to_search_full_label_);
- gtk_widget_show(tab_to_search_alignment_);
- }
- } else if (show_keyword_hint_) {
- GtkRequisition leading, icon, trailing;
- gtk_widget_size_request(tab_to_search_hint_leading_label_, &leading);
- gtk_widget_size_request(tab_to_search_hint_icon_, &icon);
- gtk_widget_size_request(tab_to_search_hint_trailing_label_, &trailing);
- int full_width = leading.width + icon.width + trailing.width;
-
- if (icon.width >= entry_box_width_ - kInnerPadding) {
- gtk_widget_hide(tab_to_search_hint_);
- } else if (full_width >= available_width) {
- gtk_widget_hide(tab_to_search_hint_leading_label_);
- gtk_widget_hide(tab_to_search_hint_trailing_label_);
- gtk_widget_show(tab_to_search_hint_);
- } else if (full_width < available_width) {
- gtk_widget_show(tab_to_search_hint_leading_label_);
- gtk_widget_show(tab_to_search_hint_trailing_label_);
- gtk_widget_show(tab_to_search_hint_);
- }
- }
-}
-
-GtkWidget* LocationBarViewGtk::CreateIconButton(
- GtkWidget** image,
- int image_id,
- ViewID debug_id,
- int tooltip_id,
- gboolean (click_callback)(GtkWidget*, GdkEventButton*, gpointer)) {
- *image = image_id ?
- gtk_image_new_from_pixbuf(
- theme_service_->GetImageNamed(image_id).ToGdkPixbuf()) :
- gtk_image_new();
-
- GtkWidget* alignment = gtk_alignment_new(0, 0, 1, 1);
- gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), 0, 0,
- 0, kInnerPadding);
- gtk_container_add(GTK_CONTAINER(alignment), *image);
-
- GtkWidget* result = gtk_event_box_new();
- gtk_event_box_set_visible_window(GTK_EVENT_BOX(result), FALSE);
- gtk_container_add(GTK_CONTAINER(result), alignment);
- gtk_widget_show_all(result);
-
- if (debug_id != VIEW_ID_NONE)
- ViewIDUtil::SetID(result, debug_id);
-
- if (tooltip_id) {
- gtk_widget_set_tooltip_text(result,
- l10n_util::GetStringUTF8(tooltip_id).c_str());
- }
-
- g_signal_connect(result, "button-press-event",
- G_CALLBACK(click_callback), this);
-
- return result;
-}
-
-void LocationBarViewGtk::CreateZoomButton() {
- zoom_.Own(CreateIconButton(&zoom_image_,
- 0,
- VIEW_ID_ZOOM_BUTTON,
- 0,
- OnZoomButtonPressThunk));
-}
-
-void LocationBarViewGtk::CreateManagePasswordsIconButton() {
- manage_passwords_icon_.Own(CreateIconButton(
- &manage_passwords_icon_image_, 0, VIEW_ID_MANAGE_PASSWORDS_ICON_BUTTON, 0,
- OnManagePasswordsIconButtonPressThunk));
-}
-
-void LocationBarViewGtk::CreateStarButton() {
- star_.Own(CreateIconButton(&star_image_,
- 0,
- VIEW_ID_STAR_BUTTON,
- IDS_TOOLTIP_STAR,
- OnStarButtonPressThunk));
- // We need to track when the star button is resized to show any bubble
- // attached to it at this time.
- g_signal_connect(star_image_, "size-allocate",
- G_CALLBACK(&OnStarButtonSizeAllocateThunk), this);
-}
-
-void LocationBarViewGtk::UpdateZoomIcon() {
- WebContents* web_contents = GetWebContents();
- if (!zoom_.get() || !web_contents)
- return;
-
- ZoomController* zoom_controller =
- ZoomController::FromWebContents(web_contents);
- if (!zoom_controller || zoom_controller->IsAtDefaultZoom() ||
- GetToolbarModel()->input_in_progress()) {
- gtk_widget_hide(zoom_.get());
- ZoomBubbleGtk::CloseBubble();
- return;
- }
-
- const int zoom_resource = zoom_controller->GetResourceForZoomLevel();
- gtk_image_set_from_pixbuf(GTK_IMAGE(zoom_image_),
- theme_service_->GetImageNamed(zoom_resource).ToGdkPixbuf());
-
- base::string16 tooltip = l10n_util::GetStringFUTF16Int(
- IDS_TOOLTIP_ZOOM, zoom_controller->zoom_percent());
- gtk_widget_set_tooltip_text(zoom_.get(), base::UTF16ToUTF8(tooltip).c_str());
-
- gtk_widget_show(zoom_.get());
-}
-
-void LocationBarViewGtk::UpdateManagePasswordsIcon() {
- WebContents* web_contents = GetWebContents();
- if (!manage_passwords_icon_.get() || !web_contents)
- return;
-
- ManagePasswordsBubbleUIController* manage_passwords_bubble_ui_controller =
- ManagePasswordsBubbleUIController::FromWebContents(web_contents);
- if (!manage_passwords_bubble_ui_controller ||
- !manage_passwords_bubble_ui_controller->password_to_be_saved() ||
- GetToolbarModel()->input_in_progress()) {
- gtk_widget_hide(manage_passwords_icon_.get());
- ManagePasswordsBubbleGtk::CloseBubble();
- return;
- }
-
- gtk_image_set_from_pixbuf(
- GTK_IMAGE(manage_passwords_icon_image_),
- theme_service_->GetImageNamed(IDR_SAVE_PASSWORD).ToGdkPixbuf());
-
- base::string16 tooltip =
- l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_TOOLTIP_SAVE);
- gtk_widget_set_tooltip_text(manage_passwords_icon_.get(),
- base::UTF16ToUTF8(tooltip).c_str());
-
- gtk_widget_show(manage_passwords_icon_.get());
- if (manage_passwords_bubble_ui_controller->
- manage_passwords_bubble_needs_showing()) {
- ShowManagePasswordsBubble();
- manage_passwords_bubble_ui_controller->OnBubbleShown();
- }
-}
-
-void LocationBarViewGtk::UpdateStarIcon() {
- if (!star_.get())
- return;
- // Indicate the star icon is not correctly sized. It will be marked as sized
- // when the next size-allocate signal is received by the star widget.
- star_sized_ = false;
- if (browser_defaults::bookmarks_enabled && !popup_window_mode_ &&
- !GetToolbarModel()->input_in_progress() &&
- edit_bookmarks_enabled_.GetValue() &&
- !IsBookmarkStarHiddenByExtension()) {
- gtk_widget_show_all(star_.get());
- int id = starred_ ? IDR_STAR_LIT : IDR_STAR;
- gtk_image_set_from_pixbuf(GTK_IMAGE(star_image_),
- theme_service_->GetImageNamed(id).ToGdkPixbuf());
- gtk_widget_set_tooltip_text(star_.get(), l10n_util::GetStringUTF8(
- starred_ ? IDS_TOOLTIP_STARRED : IDS_TOOLTIP_STAR).c_str());
- } else {
- gtk_widget_hide_all(star_.get());
- }
-}
-
-bool LocationBarViewGtk::ShouldOnlyShowLocation() {
- return !browser_->is_type_tabbed();
-}
-
-void LocationBarViewGtk::HideURL() {
- omnibox_view_->HideURL();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// LocationBarViewGtk::PageToolViewGtk
-
-LocationBarViewGtk::PageToolViewGtk::PageToolViewGtk()
- : alignment_(gtk_alignment_new(0, 0, 1, 1)),
- event_box_(gtk_event_box_new()),
- hbox_(gtk_hbox_new(FALSE, kInnerPadding)),
- image_(gtk_image_new()),
- label_(gtk_label_new(NULL)),
- animation_(this),
- weak_factory_(this) {
- gtk_alignment_set_padding(GTK_ALIGNMENT(alignment_.get()), 1, 1, 0, 0);
- gtk_container_add(GTK_CONTAINER(alignment_.get()), event_box_.get());
-
- // Make the event box not visible so it does not paint a background.
- gtk_event_box_set_visible_window(GTK_EVENT_BOX(event_box_.get()), FALSE);
- g_signal_connect(event_box_.get(), "button-press-event",
- G_CALLBACK(&OnButtonPressedThunk), this);
- g_signal_connect(event_box_.get(), "expose-event",
- G_CALLBACK(&OnExposeThunk), this);
-
- gtk_widget_set_no_show_all(label_.get(), TRUE);
- gtk_label_set_line_wrap(GTK_LABEL(label_.get()), FALSE);
-
- gtk_box_pack_start(GTK_BOX(hbox_), image_.get(), FALSE, FALSE, 0);
- gtk_box_pack_start(GTK_BOX(hbox_), label_.get(), FALSE, FALSE, 0);
-
- gtk_container_set_border_width(GTK_CONTAINER(hbox_), kHboxBorder);
-
- gtk_container_add(GTK_CONTAINER(event_box_.get()), hbox_);
- gtk_widget_hide(widget());
-
- animation_.SetSlideDuration(kPageToolAnimationTime);
-}
-
-LocationBarViewGtk::PageToolViewGtk::~PageToolViewGtk() {
- image_.Destroy();
- label_.Destroy();
- event_box_.Destroy();
- alignment_.Destroy();
-}
-
-bool LocationBarViewGtk::PageToolViewGtk::IsVisible() {
- return gtk_widget_get_visible(widget());
-}
-
-void LocationBarViewGtk::PageToolViewGtk::AnimationProgressed(
- const gfx::Animation* animation) {
- gtk_widget_set_size_request(
- label_.get(),
- animation->GetCurrentValue() * label_req_.width,
- -1);
-}
-
-void LocationBarViewGtk::PageToolViewGtk::AnimationEnded(
- const gfx::Animation* animation) {
-}
-
-void LocationBarViewGtk::PageToolViewGtk::AnimationCanceled(
- const gfx::Animation* animation) {
-}
-
-void LocationBarViewGtk::PageToolViewGtk::StartAnimating() {
- if (animation_.IsShowing() || animation_.IsClosing())
- return;
-
- gtk_event_box_set_visible_window(GTK_EVENT_BOX(event_box_.get()), TRUE);
- GdkColor border_color = GetButtonBorderColor();
- gtk_util::ActAsRoundedWindow(event_box_.get(), border_color,
- kCornerSize,
- gtk_util::ROUNDED_ALL, gtk_util::BORDER_ALL);
-
- gtk_widget_set_size_request(label_.get(), -1, -1);
- gtk_widget_size_request(label_.get(), &label_req_);
- gtk_widget_set_size_request(label_.get(), 0, -1);
- gtk_widget_show(label_.get());
-
- animation_.Show();
-}
-
-void LocationBarViewGtk::PageToolViewGtk::CloseAnimation() {
- animation_.Hide();
-}
-
-gboolean LocationBarViewGtk::PageToolViewGtk::OnButtonPressed(
- GtkWidget* sender, GdkEvent* event) {
- OnClick(sender);
- return TRUE;
-}
-
-gboolean LocationBarViewGtk::PageToolViewGtk::OnExpose(
- GtkWidget* sender, GdkEventExpose* event) {
- TRACE_EVENT0("ui::gtk", "LocationBarViewGtk::PageToolViewGtk::OnExpose");
-
- if (!(animation_.IsShowing() || animation_.IsClosing()))
- return FALSE;
-
- GtkAllocation allocation;
- gtk_widget_get_allocation(sender, &allocation);
- const int height = allocation.height;
-
- cairo_t* cr = gdk_cairo_create(gtk_widget_get_window(sender));
- gdk_cairo_rectangle(cr, &event->area);
- cairo_clip(cr);
-
- cairo_pattern_t* pattern = cairo_pattern_create_linear(0, 0, 0, height);
-
- const GdkColor top_color = GetGradientTopColor();
- const GdkColor bottom_color = GetGradientBottomColor();
- cairo_pattern_add_color_stop_rgb(
- pattern, 0.0,
- top_color.red/255.0,
- top_color.blue/255.0,
- top_color.green/255.0);
- cairo_pattern_add_color_stop_rgb(
- pattern, 1.0,
- bottom_color.red/255.0,
- bottom_color.blue/255.0,
- bottom_color.green/255.0);
-
- cairo_set_source(cr, pattern);
- cairo_paint(cr);
- cairo_pattern_destroy(pattern);
- cairo_destroy(cr);
-
- return FALSE;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// LocationBarViewGtk::PageActionViewGtk
-
-LocationBarViewGtk::PageActionViewGtk::PageActionViewGtk(
- LocationBarViewGtk* owner,
- ExtensionAction* page_action)
- : owner_(NULL),
- page_action_(page_action),
- current_tab_id_(-1),
- window_(NULL),
- accel_group_(NULL),
- preview_enabled_(false) {
- event_box_.Own(gtk_event_box_new());
- gtk_widget_set_size_request(event_box_.get(),
- ExtensionAction::kPageActionIconMaxSize,
- ExtensionAction::kPageActionIconMaxSize);
-
- // Make the event box not visible so it does not paint a background.
- gtk_event_box_set_visible_window(GTK_EVENT_BOX(event_box_.get()), FALSE);
- g_signal_connect(event_box_.get(), "button-press-event",
- G_CALLBACK(&OnButtonPressedThunk), this);
- g_signal_connect_after(event_box_.get(), "expose-event",
- G_CALLBACK(OnExposeEventThunk), this);
- g_signal_connect(event_box_.get(), "realize",
- G_CALLBACK(OnRealizeThunk), this);
-
- image_.Own(gtk_image_new());
- gtk_container_add(GTK_CONTAINER(event_box_.get()), image_.get());
-
- const Extension* extension =
- owner->profile()->GetExtensionService()->GetExtensionById(
- page_action->extension_id(), false);
- DCHECK(extension);
-
- icon_factory_.reset(new ExtensionActionIconFactory(
- owner->profile(), extension, page_action, this));
-
- // We set the owner last of all so that we can determine whether we are in
- // the process of initializing this class or not.
- owner_ = owner;
-}
-
-LocationBarViewGtk::PageActionViewGtk::~PageActionViewGtk() {
- DisconnectPageActionAccelerator();
-
- image_.Destroy();
- event_box_.Destroy();
-}
-
-bool LocationBarViewGtk::PageActionViewGtk::IsVisible() {
- return gtk_widget_get_visible(widget());
-}
-
-void LocationBarViewGtk::PageActionViewGtk::UpdateVisibility(
- WebContents* 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_ =
- contents ? extensions::ExtensionTabUtil::GetTabId(contents) : -1;
- current_url_ = url;
-
- bool visible = contents &&
- (preview_enabled_ || page_action_->GetIsVisible(current_tab_id_));
- if (visible) {
- // Set the tooltip.
- gtk_widget_set_tooltip_text(event_box_.get(),
- page_action_->GetTitle(current_tab_id_).c_str());
-
- // Set the image.
- gfx::Image icon = icon_factory_->GetIcon(current_tab_id_);
- if (!icon.IsEmpty()) {
- GdkPixbuf* pixbuf = icon.ToGdkPixbuf();
- DCHECK(pixbuf);
- gtk_image_set_from_pixbuf(GTK_IMAGE(image_.get()), pixbuf);
- }
- }
-
- bool old_visible = IsVisible();
- if (visible)
- gtk_widget_show_all(event_box_.get());
- else
- gtk_widget_hide_all(event_box_.get());
-
- if (visible != old_visible) {
- content::NotificationService::current()->Notify(
- chrome::NOTIFICATION_EXTENSION_PAGE_ACTION_VISIBILITY_CHANGED,
- content::Source<ExtensionAction>(page_action_),
- content::Details<WebContents>(contents));
- }
-}
-
-void LocationBarViewGtk::PageActionViewGtk::OnIconUpdated() {
- // If we have no owner, that means this class is still being constructed.
- WebContents* web_contents = owner_ ? owner_->GetWebContents() : NULL;
- if (web_contents)
- UpdateVisibility(web_contents, current_url_);
-}
-
-void LocationBarViewGtk::PageActionViewGtk::TestActivatePageAction() {
- GdkEventButton event = {};
- event.type = GDK_BUTTON_PRESS;
- event.button = 1;
- OnButtonPressed(widget(), &event);
-}
-
-void LocationBarViewGtk::PageActionViewGtk::Observe(
- int type,
- const content::NotificationSource& source,
- const content::NotificationDetails& details) {
- DCHECK_EQ(type, chrome::NOTIFICATION_WINDOW_CLOSED);
- DisconnectPageActionAccelerator();
-}
-
-void LocationBarViewGtk::PageActionViewGtk::InspectPopup(
- ExtensionAction* action) {
- ExtensionPopupGtk::Show(
- action->GetPopupUrl(current_tab_id_),
- owner_->browser_,
- event_box_.get(),
- ExtensionPopupGtk::SHOW_AND_INSPECT);
-}
-
-void LocationBarViewGtk::PageActionViewGtk::ConnectPageActionAccelerator() {
- const extensions::ExtensionSet* extensions =
- owner_->profile()->GetExtensionService()->extensions();
- const Extension* extension =
- extensions->GetByID(page_action_->extension_id());
- window_ = owner_->browser()->window()->GetNativeWindow();
-
- extensions::CommandService* command_service =
- extensions::CommandService::Get(owner_->profile());
-
- extensions::Command command_page_action;
- if (command_service->GetPageActionCommand(
- extension->id(),
- extensions::CommandService::ACTIVE_ONLY,
- &command_page_action,
- NULL)) {
- // Found the page action shortcut command, register it.
- page_action_keybinding_.reset(
- new ui::Accelerator(command_page_action.accelerator()));
- }
-
- if (page_action_keybinding_.get()) {
- accel_group_ = gtk_accel_group_new();
- gtk_window_add_accel_group(window_, accel_group_);
-
- gtk_accel_group_connect(
- accel_group_,
- ui::GetGdkKeyCodeForAccelerator(*page_action_keybinding_),
- ui::GetGdkModifierForAccelerator(*page_action_keybinding_),
- GtkAccelFlags(0),
- g_cclosure_new(G_CALLBACK(OnGtkAccelerator), this, NULL));
-
- // Since we've added an accelerator, we'll need to unregister it before
- // the window is closed, so we listen for the window being closed.
- registrar_.Add(this,
- chrome::NOTIFICATION_WINDOW_CLOSED,
- content::Source<GtkWindow>(window_));
- }
-}
-
-void LocationBarViewGtk::PageActionViewGtk::DisconnectPageActionAccelerator() {
- if (accel_group_) {
- if (page_action_keybinding_.get()) {
- gtk_accel_group_disconnect_key(
- accel_group_,
- ui::GetGdkKeyCodeForAccelerator(*page_action_keybinding_),
- ui::GetGdkModifierForAccelerator(*page_action_keybinding_));
- }
- gtk_window_remove_accel_group(window_, accel_group_);
- g_object_unref(accel_group_);
- accel_group_ = NULL;
- page_action_keybinding_.reset(NULL);
- }
-}
-
-gboolean LocationBarViewGtk::PageActionViewGtk::OnButtonPressed(
- GtkWidget* sender,
- GdkEventButton* event) {
- // Double and triple-clicks generate both a GDK_BUTTON_PRESS and a
- // GDK_[23]BUTTON_PRESS event. We don't want to double-trigger by acting on
- // both.
- if (event->type != GDK_BUTTON_PRESS)
- return TRUE;
-
- WebContents* web_contents = owner_->GetWebContents();
- if (!web_contents)
- return TRUE;
-
- ExtensionService* extension_service =
- owner_->profile()->GetExtensionService();
- if (!extension_service)
- return TRUE;
-
- const Extension* extension =
- extension_service->extensions()->GetByID(page_action()->extension_id());
- if (!extension)
- return TRUE;
-
- LocationBarController* controller =
- extensions::TabHelper::FromWebContents(web_contents)->
- location_bar_controller();
-
- switch (controller->OnClicked(extension->id(), event->button)) {
- case LocationBarController::ACTION_NONE:
- break;
-
- case LocationBarController::ACTION_SHOW_POPUP:
- ExtensionPopupGtk::Show(
- page_action_->GetPopupUrl(current_tab_id_),
- owner_->browser_,
- event_box_.get(),
- ExtensionPopupGtk::SHOW);
- break;
-
- case LocationBarController::ACTION_SHOW_CONTEXT_MENU:
- context_menu_model_ =
- new ExtensionContextMenuModel(extension, owner_->browser_, this);
- context_menu_.reset(
- new MenuGtk(NULL, context_menu_model_.get()));
- context_menu_->PopupForWidget(sender, event->button, event->time);
- break;
- }
-
- return TRUE;
-}
-
-gboolean LocationBarViewGtk::PageActionViewGtk::OnExposeEvent(
- GtkWidget* widget,
- GdkEventExpose* event) {
- TRACE_EVENT0("ui::gtk", "LocationBarViewGtk::PageActionViewGtk::OnExpose");
- WebContents* contents = owner_->GetWebContents();
- if (!contents)
- return FALSE;
-
- int tab_id = extensions::ExtensionTabUtil::GetTabId(contents);
- if (tab_id < 0)
- return FALSE;
-
- std::string badge_text = page_action_->GetBadgeText(tab_id);
- if (badge_text.empty())
- return FALSE;
-
- gfx::CanvasSkiaPaint canvas(event, false);
- GtkAllocation allocation;
- gtk_widget_get_allocation(widget, &allocation);
- page_action_->PaintBadge(&canvas, gfx::Rect(allocation), tab_id);
- return FALSE;
-}
-
-void LocationBarViewGtk::PageActionViewGtk::OnRealize(GtkWidget* widget) {
- ConnectPageActionAccelerator();
-}
-
-// static
-gboolean LocationBarViewGtk::PageActionViewGtk::OnGtkAccelerator(
- GtkAccelGroup* accel_group,
- GObject* acceleratable,
- guint keyval,
- GdkModifierType modifier,
- void* user_data) {
- PageActionViewGtk* view = static_cast<PageActionViewGtk*>(user_data);
- if (!gtk_widget_get_visible(view->widget()))
- return FALSE;
-
- GdkEventButton event = {};
- event.type = GDK_BUTTON_PRESS;
- event.button = 1;
- return view->OnButtonPressed(view->widget(), &event);
-}

Powered by Google App Engine
This is Rietveld 408576698