summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser')
-rw-r--r--chrome/browser/browser.cc17
-rw-r--r--chrome/browser/browser.h9
-rw-r--r--chrome/browser/browser_theme_pack.cc45
-rw-r--r--chrome/browser/browser_theme_provider.cc7
-rw-r--r--chrome/browser/browser_window.h4
-rw-r--r--chrome/browser/chromeos/compact_location_bar_view.cc2
-rw-r--r--chrome/browser/cocoa/browser_window_cocoa.h2
-rw-r--r--chrome/browser/cocoa/browser_window_cocoa.mm2
-rw-r--r--chrome/browser/cocoa/location_bar_view_mac.h1
-rw-r--r--chrome/browser/cocoa/location_bar_view_mac.mm5
-rw-r--r--chrome/browser/cocoa/side_tabs_toolbar_controller.h4
-rw-r--r--chrome/browser/cocoa/side_tabs_toolbar_controller.mm4
-rw-r--r--chrome/browser/cocoa/toolbar_controller.h1
-rw-r--r--chrome/browser/cocoa/toolbar_controller.mm141
-rw-r--r--chrome/browser/cocoa/toolbar_controller_unittest.mm20
-rw-r--r--chrome/browser/gtk/browser_toolbar_gtk.cc63
-rw-r--r--chrome/browser/gtk/browser_toolbar_gtk.h7
-rw-r--r--chrome/browser/gtk/browser_window_gtk.cc9
-rw-r--r--chrome/browser/gtk/browser_window_gtk.h2
-rw-r--r--chrome/browser/gtk/go_button_gtk.cc232
-rw-r--r--chrome/browser/gtk/go_button_gtk_unittest.cc133
-rw-r--r--chrome/browser/gtk/location_bar_view_gtk.cc7
-rw-r--r--chrome/browser/gtk/location_bar_view_gtk.h1
-rw-r--r--chrome/browser/gtk/reload_button_gtk.cc218
-rw-r--r--chrome/browser/gtk/reload_button_gtk.h (renamed from chrome/browser/gtk/go_button_gtk.h)42
-rw-r--r--chrome/browser/gtk/reload_button_gtk_unittest.cc138
-rw-r--r--chrome/browser/gtk/view_id_util.cc5
-rw-r--r--chrome/browser/location_bar.h3
-rw-r--r--chrome/browser/theme_resources_util_unittest.cc2
-rw-r--r--chrome/browser/view_ids.h1
-rw-r--r--chrome/browser/views/browser_views_accessibility_browsertest.cc8
-rw-r--r--chrome/browser/views/frame/browser_view.cc6
-rw-r--r--chrome/browser/views/frame/browser_view.h2
-rw-r--r--chrome/browser/views/go_button.cc135
-rw-r--r--chrome/browser/views/location_bar/location_bar_view.cc4
-rw-r--r--chrome/browser/views/location_bar/location_bar_view.h1
-rw-r--r--chrome/browser/views/reload_button.cc112
-rw-r--r--chrome/browser/views/reload_button.h (renamed from chrome/browser/views/go_button.h)33
-rw-r--r--chrome/browser/views/toolbar_view.cc84
-rw-r--r--chrome/browser/views/toolbar_view.h7
40 files changed, 655 insertions, 864 deletions
diff --git a/chrome/browser/browser.cc b/chrome/browser/browser.cc
index 63fbf03..82ddea5 100644
--- a/chrome/browser/browser.cc
+++ b/chrome/browser/browser.cc
@@ -1210,11 +1210,6 @@ void Browser::OpenCurrentURL() {
location_bar->GetPageTransition(), -1, true);
}
-void Browser::Go(WindowOpenDisposition disposition) {
- UserMetrics::RecordAction(UserMetricsAction("Go"), profile_);
- window_->GetLocationBar()->AcceptInputWithDisposition(disposition);
-}
-
void Browser::Stop() {
UserMetrics::RecordAction(UserMetricsAction("Stop"), profile_);
GetSelectedTabContents()->Stop();
@@ -1874,7 +1869,6 @@ void Browser::ExecuteCommandWithDisposition(
case IDC_RELOAD_IGNORING_CACHE: ReloadIgnoringCache(disposition); break;
case IDC_HOME: Home(disposition); break;
case IDC_OPEN_CURRENT_URL: OpenCurrentURL(); break;
- case IDC_GO: Go(disposition); break;
case IDC_STOP: Stop(); break;
// Window management commands
@@ -2308,8 +2302,8 @@ void Browser::TabSelectedAt(TabContents* old_contents,
// Propagate the profile to the location bar.
UpdateToolbar(true);
- // Update stop/go state.
- UpdateStopGoState(new_contents->is_loading(), true);
+ // Update reload/stop state.
+ UpdateReloadStopState(new_contents->is_loading(), true);
// Update commands to reflect current state.
UpdateCommandsForTabState();
@@ -2475,7 +2469,7 @@ void Browser::LoadingStateChanged(TabContents* source) {
window_->UpdateTitleBar();
if (source == GetSelectedTabContents()) {
- UpdateStopGoState(source->is_loading(), false);
+ UpdateReloadStopState(source->is_loading(), false);
if (GetStatusBubble())
GetStatusBubble()->SetStatus(GetSelectedTabContents()->GetStatusText());
@@ -3139,9 +3133,8 @@ void Browser::UpdateCommandsForTabState() {
#endif
}
-void Browser::UpdateStopGoState(bool is_loading, bool force) {
- window_->UpdateStopGoState(is_loading, force);
- command_updater_.UpdateCommandEnabled(IDC_GO, !is_loading);
+void Browser::UpdateReloadStopState(bool is_loading, bool force) {
+ window_->UpdateReloadStopState(is_loading, force);
command_updater_.UpdateCommandEnabled(IDC_STOP, is_loading);
}
diff --git a/chrome/browser/browser.h b/chrome/browser/browser.h
index 49329de..6f4ef76 100644
--- a/chrome/browser/browser.h
+++ b/chrome/browser/browser.h
@@ -435,7 +435,6 @@ class Browser : public TabStripModelDelegate,
void ReloadIgnoringCache(WindowOpenDisposition disposition); // Shift-reload.
void Home(WindowOpenDisposition disposition);
void OpenCurrentURL();
- void Go(WindowOpenDisposition disposition);
void Stop();
// Window management commands
void NewWindow();
@@ -753,10 +752,10 @@ class Browser : public TabStripModelDelegate,
// Update commands whose state depends on the tab's state.
void UpdateCommandsForTabState();
- // Ask the Stop/Go button to change its icon, and update the Go and Stop
- // command states. |is_loading| is true if the current TabContents is
- // loading. |force| is true if the button should change its icon immediately.
- void UpdateStopGoState(bool is_loading, bool force);
+ // Ask the Reload/Stop button to change its icon, and update the Stop command
+ // state. |is_loading| is true if the current TabContents is loading.
+ // |force| is true if the button should change its icon immediately.
+ void UpdateReloadStopState(bool is_loading, bool force);
// UI update coalescing and handling ////////////////////////////////////////
diff --git a/chrome/browser/browser_theme_pack.cc b/chrome/browser/browser_theme_pack.cc
index 31f2866..2d8c7f6 100644
--- a/chrome/browser/browser_theme_pack.cc
+++ b/chrome/browser/browser_theme_pack.cc
@@ -23,7 +23,7 @@ namespace {
// Version number of the current theme pack. We just throw out and rebuild
// theme packs that aren't int-equal to this.
-const int kThemePackVersion = 9;
+const int kThemePackVersion = 10;
// IDs that are in the DataPack won't clash with the positive integer
// int32_t. kHeaderID should always have the maximum value because we want the
@@ -119,30 +119,25 @@ PersistingImagesTable kPersistingImages[] = {
{ 20, IDR_FORWARD_D, NULL },
{ 21, IDR_FORWARD_H, NULL },
{ 22, IDR_FORWARD_P, NULL },
- { 23, IDR_RELOAD, NULL },
- { 24, IDR_RELOAD_H, NULL },
- { 25, IDR_RELOAD_P, NULL },
- { 26, IDR_HOME, NULL },
- { 27, IDR_HOME_H, NULL },
- { 28, IDR_HOME_P, NULL },
- { 29, IDR_GO, NULL },
- { 30, IDR_GO_NOBORDER_CENTER, NULL },
- { 31, IDR_GO_H, NULL },
- { 32, IDR_GO_P, NULL },
- { 33, IDR_STOP, NULL },
- { 34, IDR_STOP_NOBORDER_CENTER, NULL },
- { 35, IDR_STOP_H, NULL },
- { 36, IDR_STOP_P, NULL },
- { 37, IDR_MENU_BOOKMARK, NULL },
- { 38, IDR_MENU_PAGE, NULL },
- { 39, IDR_MENU_PAGE_RTL, NULL },
- { 40, IDR_MENU_CHROME, NULL },
- { 41, IDR_MENU_CHROME_RTL, NULL },
- { 42, IDR_MENU_DROPARROW, NULL },
- { 43, IDR_THROBBER, NULL },
- { 44, IDR_THROBBER_WAITING, NULL },
- { 45, IDR_THROBBER_LIGHT, NULL },
- { 46, IDR_LOCATIONBG, NULL }
+ { 23, IDR_HOME, NULL },
+ { 24, IDR_HOME_H, NULL },
+ { 25, IDR_HOME_P, NULL },
+ { 26, IDR_RELOAD, NULL },
+ { 27, IDR_RELOAD_H, NULL },
+ { 28, IDR_RELOAD_P, NULL },
+ { 29, IDR_STOP, NULL },
+ { 30, IDR_STOP_H, NULL },
+ { 31, IDR_STOP_P, NULL },
+ { 32, IDR_LOCATIONBG, NULL },
+ { 33, IDR_MENU_BOOKMARK, NULL },
+ { 34, IDR_MENU_PAGE, NULL },
+ { 35, IDR_MENU_PAGE_RTL, NULL },
+ { 36, IDR_MENU_CHROME, NULL },
+ { 37, IDR_MENU_CHROME_RTL, NULL },
+ { 38, IDR_MENU_DROPARROW, NULL },
+ { 39, IDR_THROBBER, NULL },
+ { 40, IDR_THROBBER_WAITING, NULL },
+ { 41, IDR_THROBBER_LIGHT, NULL },
};
int GetPersistentIDByName(const std::string& key) {
diff --git a/chrome/browser/browser_theme_provider.cc b/chrome/browser/browser_theme_provider.cc
index cea5568..244d2cf 100644
--- a/chrome/browser/browser_theme_provider.cc
+++ b/chrome/browser/browser_theme_provider.cc
@@ -142,16 +142,15 @@ bool HasThemeableImage(int themeable_image_id) {
const int kToolbarButtonIDs[] = {
IDR_BACK, IDR_BACK_D, IDR_BACK_H, IDR_BACK_P,
IDR_FORWARD, IDR_FORWARD_D, IDR_FORWARD_H, IDR_FORWARD_P,
- IDR_RELOAD, IDR_RELOAD_H, IDR_RELOAD_P,
IDR_HOME, IDR_HOME_H, IDR_HOME_P,
- IDR_GO, IDR_GO_NOBORDER_CENTER, IDR_GO_H, IDR_GO_P,
- IDR_STOP, IDR_STOP_NOBORDER_CENTER, IDR_STOP_H, IDR_STOP_P,
+ IDR_RELOAD, IDR_RELOAD_H, IDR_RELOAD_P,
+ IDR_STOP, IDR_STOP_H, IDR_STOP_P,
+ IDR_LOCATIONBG,
IDR_MENU_BOOKMARK,
IDR_MENU_PAGE, IDR_MENU_PAGE_RTL,
IDR_MENU_CHROME, IDR_MENU_CHROME_RTL,
IDR_MENU_DROPARROW,
IDR_THROBBER, IDR_THROBBER_WAITING, IDR_THROBBER_LIGHT,
- IDR_LOCATIONBG
};
// Writes the theme pack to disk on a separate thread.
diff --git a/chrome/browser/browser_window.h b/chrome/browser/browser_window.h
index ff80ab7..bc2305a 100644
--- a/chrome/browser/browser_window.h
+++ b/chrome/browser/browser_window.h
@@ -133,8 +133,8 @@ class BrowserWindow {
virtual void SetFocusToLocationBar(bool select_all) = 0;
// Informs the view whether or not a load is in progress for the current tab.
- // The view can use this notification to update the go/stop button.
- virtual void UpdateStopGoState(bool is_loading, bool force) = 0;
+ // The view can use this notification to update the reload/stop button.
+ virtual void UpdateReloadStopState(bool is_loading, bool force) = 0;
// Updates the toolbar with the state for the specified |contents|.
virtual void UpdateToolbar(TabContents* contents,
diff --git a/chrome/browser/chromeos/compact_location_bar_view.cc b/chrome/browser/chromeos/compact_location_bar_view.cc
index bec7646f..5456504 100644
--- a/chrome/browser/chromeos/compact_location_bar_view.cc
+++ b/chrome/browser/chromeos/compact_location_bar_view.cc
@@ -96,7 +96,7 @@ void CompactLocationBarView::Init() {
reload_->SetImage(views::CustomButton::BS_PUSHED,
tp->GetBitmapNamed(IDR_RELOAD_P));
reload_->SetBackground(color, background,
- tp->GetBitmapNamed(IDR_RELOAD_MASK));
+ tp->GetBitmapNamed(IDR_BUTTON_MASK));
AddChildView(reload_);
diff --git a/chrome/browser/cocoa/browser_window_cocoa.h b/chrome/browser/cocoa/browser_window_cocoa.h
index b6aa455..4d8f017 100644
--- a/chrome/browser/cocoa/browser_window_cocoa.h
+++ b/chrome/browser/cocoa/browser_window_cocoa.h
@@ -53,7 +53,7 @@ class BrowserWindowCocoa : public BrowserWindow,
virtual bool IsFullscreenBubbleVisible() const;
virtual LocationBar* GetLocationBar() const;
virtual void SetFocusToLocationBar(bool select_all);
- virtual void UpdateStopGoState(bool is_loading, bool force);
+ virtual void UpdateReloadStopState(bool is_loading, bool force);
virtual void UpdateToolbar(TabContents* contents,
bool should_restore_state);
virtual void FocusToolbar();
diff --git a/chrome/browser/cocoa/browser_window_cocoa.mm b/chrome/browser/cocoa/browser_window_cocoa.mm
index 78f2221..0b8111e 100644
--- a/chrome/browser/cocoa/browser_window_cocoa.mm
+++ b/chrome/browser/cocoa/browser_window_cocoa.mm
@@ -206,7 +206,7 @@ void BrowserWindowCocoa::SetFocusToLocationBar(bool select_all) {
[controller_ focusLocationBar:select_all ? YES : NO];
}
-void BrowserWindowCocoa::UpdateStopGoState(bool is_loading, bool force) {
+void BrowserWindowCocoa::UpdateReloadStopState(bool is_loading, bool force) {
[controller_ setIsLoading:is_loading ? YES : NO];
}
diff --git a/chrome/browser/cocoa/location_bar_view_mac.h b/chrome/browser/cocoa/location_bar_view_mac.h
index 2d8d57e..74c0451 100644
--- a/chrome/browser/cocoa/location_bar_view_mac.h
+++ b/chrome/browser/cocoa/location_bar_view_mac.h
@@ -54,7 +54,6 @@ class LocationBarViewMac : public AutocompleteEditController,
virtual WindowOpenDisposition GetWindowOpenDisposition() const;
virtual PageTransition::Type GetPageTransition() const;
virtual void AcceptInput();
- virtual void AcceptInputWithDisposition(WindowOpenDisposition disposition);
virtual void FocusLocation(bool select_all);
virtual void FocusSearch();
virtual void UpdateContentSettingsIcons();
diff --git a/chrome/browser/cocoa/location_bar_view_mac.mm b/chrome/browser/cocoa/location_bar_view_mac.mm
index ea02141..9be750a 100644
--- a/chrome/browser/cocoa/location_bar_view_mac.mm
+++ b/chrome/browser/cocoa/location_bar_view_mac.mm
@@ -124,11 +124,6 @@ PageTransition::Type LocationBarViewMac::GetPageTransition() const {
void LocationBarViewMac::AcceptInput() {
WindowOpenDisposition disposition =
event_utils::WindowOpenDispositionFromNSEvent([NSApp currentEvent]);
- AcceptInputWithDisposition(disposition);
-}
-
-void LocationBarViewMac::AcceptInputWithDisposition(
- WindowOpenDisposition disposition) {
edit_view_->model()->AcceptInput(disposition, false);
}
diff --git a/chrome/browser/cocoa/side_tabs_toolbar_controller.h b/chrome/browser/cocoa/side_tabs_toolbar_controller.h
index ce1ed7c..9516262 100644
--- a/chrome/browser/cocoa/side_tabs_toolbar_controller.h
+++ b/chrome/browser/cocoa/side_tabs_toolbar_controller.h
@@ -16,6 +16,10 @@
@interface SideTabsToolbarController : ToolbarController {
@private
+ // TODO(shess): |goButton_| no longer exists in ToolbarController.
+ // It's not clear to me that |goButton_| is the right name for this
+ // class to use.
+ IBOutlet NSButton* goButton_;
IBOutlet NSButton* starButton_;
IBOutlet NSTextField* title_;
IBOutlet NSProgressIndicator* loadingSpinner_;
diff --git a/chrome/browser/cocoa/side_tabs_toolbar_controller.mm b/chrome/browser/cocoa/side_tabs_toolbar_controller.mm
index 5e65111..989538d 100644
--- a/chrome/browser/cocoa/side_tabs_toolbar_controller.mm
+++ b/chrome/browser/cocoa/side_tabs_toolbar_controller.mm
@@ -35,6 +35,10 @@ NSString* const kSearchButtonImageName = @"omnibox_search.pdf";
- (void)awakeFromNib {
[super awakeFromNib];
+ // TODO(shess): |goButton_| is no longer in |ToolbarController|.
+ // AFAICT this code partially implements a new feature (see
+ // http://crbug.com/44773) which may be in conflict with
+ // http://crbug.com/45762 .
[goButton_ setImage:nsimage_cache::ImageNamed(kSearchButtonImageName)];
[[locationBar_ autocompleteTextFieldCell] setStarIconView:nil];
}
diff --git a/chrome/browser/cocoa/toolbar_controller.h b/chrome/browser/cocoa/toolbar_controller.h
index 1c81543..86574b5 100644
--- a/chrome/browser/cocoa/toolbar_controller.h
+++ b/chrome/browser/cocoa/toolbar_controller.h
@@ -52,7 +52,6 @@ class ToolbarModel;
IBOutlet DelayedMenuButton* forwardButton_;
IBOutlet NSButton* reloadButton_;
IBOutlet NSButton* homeButton_;
- IBOutlet NSButton* goButton_;
IBOutlet MenuButton* pageButton_;
IBOutlet MenuButton* wrenchButton_;
IBOutlet AutocompleteTextField* locationBar_;
diff --git a/chrome/browser/cocoa/toolbar_controller.mm b/chrome/browser/cocoa/toolbar_controller.mm
index 9d90a0c..a8974de 100644
--- a/chrome/browser/cocoa/toolbar_controller.mm
+++ b/chrome/browser/cocoa/toolbar_controller.mm
@@ -48,17 +48,17 @@ namespace {
// Names of images in the bundle for buttons.
NSString* const kBackButtonImageName = @"back_Template.pdf";
NSString* const kForwardButtonImageName = @"forward_Template.pdf";
-NSString* const kReloadButtonImageName = @"reload_Template.pdf";
+NSString* const kReloadButtonReloadImageName = @"reload_Template.pdf";
+NSString* const kReloadButtonStopImageName = @"stop_Template.pdf";
NSString* const kHomeButtonImageName = @"home_Template.pdf";
-NSString* const kGoButtonGoImageName = @"go_Template.pdf";
-NSString* const kGoButtonStopImageName = @"stop_Template.pdf";
NSString* const kPageButtonImageName = @"menu_page_Template.pdf";
NSString* const kWrenchButtonImageName = @"menu_chrome_Template.pdf";
// Height of the toolbar in pixels when the bookmark bar is closed.
const CGFloat kBaseToolbarHeight = 36.0;
-// The distance from the 'Go' button to the Browser Actions container in pixels.
+// The distance from the location bar to the Browser Actions container
+// in pixels.
const CGFloat kBrowserActionsContainerLeftPadding = 5.0;
// The minimum width of the location bar in pixels.
@@ -75,13 +75,13 @@ const CGFloat kAnimationDuration = 0.2;
- (void)prefChanged:(std::wstring*)prefName;
- (BackgroundGradientView*)backgroundGradientView;
- (void)toolbarFrameChanged;
-- (void)pinGoButtonToLeftOfBrowserActionsContainerAndAnimate:(BOOL)animate;
+- (void)pinLocationBarToLeftOfBrowserActionsContainerAndAnimate:(BOOL)animate;
- (void)maintainMinimumLocationBarWidth;
- (void)adjustBrowserActionsContainerForNewWindow:(NSNotification*)notification;
- (void)browserActionsContainerDragged:(NSNotification*)notification;
- (void)browserActionsContainerDragFinished:(NSNotification*)notification;
- (void)browserActionsVisibilityChanged:(NSNotification*)notification;
-- (void)adjustLocationAndGoPositionsBy:(CGFloat)dX animate:(BOOL)animate;
+- (void)adjustLocationSizeBy:(CGFloat)dX animate:(BOOL)animate;
@end
namespace ToolbarControllerInternal {
@@ -217,9 +217,9 @@ class PrefObserverBridge : public NotificationObserver {
// the xib, we must set them in code.
[backButton_ setImage:nsimage_cache::ImageNamed(kBackButtonImageName)];
[forwardButton_ setImage:nsimage_cache::ImageNamed(kForwardButtonImageName)];
- [reloadButton_ setImage:nsimage_cache::ImageNamed(kReloadButtonImageName)];
+ [reloadButton_
+ setImage:nsimage_cache::ImageNamed(kReloadButtonReloadImageName)];
[homeButton_ setImage:nsimage_cache::ImageNamed(kHomeButtonImageName)];
- [goButton_ setImage:nsimage_cache::ImageNamed(kGoButtonGoImageName)];
[pageButton_ setImage:nsimage_cache::ImageNamed(kPageButtonImageName)];
[wrenchButton_ setImage:nsimage_cache::ImageNamed(kWrenchButtonImageName)];
@@ -271,9 +271,9 @@ class PrefObserverBridge : public NotificationObserver {
NSView* toolbarView = [self view];
[toolbarView addTrackingArea:trackingArea_.get()];
- // We want a dynamic tooltip on the go button, so tell the go button to ask
- // us for the tooltip.
- [goButton_ addToolTipRect:[goButton_ bounds] owner:self userData:nil];
+ // We want a dynamic tooltip on the reload button, so tell the
+ // reload button to ask us for the tooltip.
+ [reloadButton_ addToolTipRect:[reloadButton_ bounds] owner:self userData:nil];
// If the user has any Browser Actions installed, the container view for them
// may have to be resized depending on the width of the toolbar frame.
@@ -307,10 +307,6 @@ class PrefObserverBridge : public NotificationObserver {
[[locationBar_ cell]
accessibilitySetOverrideValue:description
forAttribute:NSAccessibilityDescriptionAttribute];
- description = l10n_util::GetNSStringWithFixup(IDS_ACCNAME_GO);
- [[goButton_ cell]
- accessibilitySetOverrideValue:description
- forAttribute:NSAccessibilityDescriptionAttribute];
description = l10n_util::GetNSStringWithFixup(IDS_ACCNAME_PAGE);
[[pageButton_ cell]
accessibilitySetOverrideValue:description
@@ -410,15 +406,15 @@ class PrefObserverBridge : public NotificationObserver {
}
- (void)setIsLoading:(BOOL)isLoading {
- NSString* imageName = kGoButtonGoImageName;
- NSInteger tag = IDC_GO;
+ NSString* imageName = kReloadButtonReloadImageName;
+ NSInteger tag = IDC_RELOAD;
if (isLoading) {
- imageName = kGoButtonStopImageName;
+ imageName = kReloadButtonStopImageName;
tag = IDC_STOP;
}
NSImage* stopStartImage = nsimage_cache::ImageNamed(imageName);
- [goButton_ setImage:stopStartImage];
- [goButton_ setTag:tag];
+ [reloadButton_ setImage:stopStartImage];
+ [reloadButton_ setTag:tag];
}
- (void)setHasToolbar:(BOOL)toolbar hasLocationBar:(BOOL)locBar {
@@ -472,8 +468,8 @@ class PrefObserverBridge : public NotificationObserver {
// Returns an array of views in the order of the outlets above.
- (NSArray*)toolbarViews {
return [NSArray arrayWithObjects:backButton_, forwardButton_, reloadButton_,
- homeButton_, goButton_, pageButton_, wrenchButton_,
- locationBar_, browserActionsContainerView_, nil];
+ homeButton_, pageButton_, wrenchButton_, locationBar_,
+ browserActionsContainerView_, nil];
}
// Moves |rect| to the right by |delta|, keeping the right side fixed by
@@ -550,20 +546,18 @@ class PrefObserverBridge : public NotificationObserver {
if (hide == [pageButton_ isHidden])
return; // Nothing to do, view state matches pref state.
- // Shift the go button and resize the text field by the width of the
- // page/wrench buttons plus two times the gap width. If we're showing the
- // buttons, we have to reverse the direction of movement (to the left). Unlike
- // the home button above, we only ever have to resize the text field, we don't
- // have to move it.
- CGFloat moveX = 2 * [self interButtonSpacing] + NSWidth([pageButton_ frame]) +
+ // Resize the text field and move the browser actions by the width
+ // of the page/wrench buttons plus two times the gap width.
+ CGFloat dX = 2 * [self interButtonSpacing] + NSWidth([pageButton_ frame]) +
NSWidth([wrenchButton_ frame]);
+ // Larger if hiding menus, smaller if showing.
if (!hide)
- moveX *= -1; // Reverse the direction of the move.
+ dX *= -1;
- [self adjustLocationAndGoPositionsBy:moveX animate:NO];
+ [self adjustLocationSizeBy:dX animate:NO];
[browserActionsContainerView_ setFrame:NSOffsetRect(
- [browserActionsContainerView_ frame], moveX, 0)];
+ [browserActionsContainerView_ frame], dX, 0)];
[browserActionsContainerView_ setRightBorderShown:!hide];
[pageButton_ setHidden:hide];
@@ -608,7 +602,7 @@ class PrefObserverBridge : public NotificationObserver {
CGFloat containerWidth = [browserActionsContainerView_ isHidden] ? 0.0 :
NSWidth([browserActionsContainerView_ frame]);
if (containerWidth > 0.0)
- [self adjustLocationAndGoPositionsBy:(containerWidth * -1) animate:NO];
+ [self adjustLocationSizeBy:(containerWidth * -1) animate:NO];
BOOL rightBorderShown = !([pageButton_ isHidden] && [wrenchButton_ isHidden]);
[browserActionsContainerView_ setRightBorderShown:rightBorderShown];
}
@@ -627,37 +621,37 @@ class PrefObserverBridge : public NotificationObserver {
locationBarAtMinSize_ = locationBarWidth <= kMinimumLocationBarWidth;
[browserActionsContainerView_ setCanDragLeft:!locationBarAtMinSize_];
[browserActionsContainerView_ setGrippyPinned:locationBarAtMinSize_];
- [self adjustLocationAndGoPositionsBy:
+ [self adjustLocationSizeBy:
[browserActionsContainerView_ resizeDeltaX] animate:NO];
}
- (void)browserActionsContainerDragFinished:(NSNotification*)notification {
[browserActionsController_ resizeContainerAndAnimate:YES];
- [self pinGoButtonToLeftOfBrowserActionsContainerAndAnimate:YES];
+ [self pinLocationBarToLeftOfBrowserActionsContainerAndAnimate:YES];
}
- (void)browserActionsVisibilityChanged:(NSNotification*)notification {
- [self pinGoButtonToLeftOfBrowserActionsContainerAndAnimate:NO];
+ [self pinLocationBarToLeftOfBrowserActionsContainerAndAnimate:NO];
}
-- (void)pinGoButtonToLeftOfBrowserActionsContainerAndAnimate:(BOOL)animate {
- CGFloat goXPos = [goButton_ frame].origin.x + NSWidth([goButton_ frame]);
+- (void)pinLocationBarToLeftOfBrowserActionsContainerAndAnimate:(BOOL)animate {
+ CGFloat locationBarXPos = NSMaxX([locationBar_ frame]);
CGFloat leftPadding;
if ([browserActionsContainerView_ isHidden]) {
CGFloat edgeXPos = [pageButton_ isHidden] ?
- NSWidth([[goButton_ window] frame]) : [pageButton_ frame].origin.x;
- leftPadding = edgeXPos - goXPos;
+ NSWidth([[locationBar_ window] frame]) : [pageButton_ frame].origin.x;
+ leftPadding = edgeXPos - locationBarXPos;
} else {
NSRect containerFrame = animate ?
[browserActionsContainerView_ animationEndFrame] :
[browserActionsContainerView_ frame];
- leftPadding = containerFrame.origin.x - goXPos;
+ leftPadding = containerFrame.origin.x - locationBarXPos;
}
if (leftPadding != kBrowserActionsContainerLeftPadding) {
CGFloat dX = leftPadding - kBrowserActionsContainerLeftPadding;
- [self adjustLocationAndGoPositionsBy:dX animate:animate];
+ [self adjustLocationSizeBy:dX animate:animate];
}
}
@@ -666,7 +660,7 @@ class PrefObserverBridge : public NotificationObserver {
locationBarAtMinSize_ = locationBarWidth <= kMinimumLocationBarWidth;
if (locationBarAtMinSize_) {
CGFloat dX = kMinimumLocationBarWidth - locationBarWidth;
- [self adjustLocationAndGoPositionsBy:dX animate:NO];
+ [self adjustLocationSizeBy:dX animate:NO];
}
}
@@ -684,7 +678,7 @@ class PrefObserverBridge : public NotificationObserver {
NSRect containerFrame = [browserActionsContainerView_ frame];
// Determine how much the container needs to move in case it's overlapping
// with the location bar.
- CGFloat dX = ([goButton_ frame].origin.x + NSWidth([goButton_ frame])) -
+ CGFloat dX = NSMaxX([locationBar_ frame]) -
containerFrame.origin.x + kBrowserActionsContainerLeftPadding;
containerFrame = NSOffsetRect(containerFrame, dX, 0);
containerFrame.size.width -= dX;
@@ -707,31 +701,22 @@ class PrefObserverBridge : public NotificationObserver {
[browserActionsContainerView_ setGrippyPinned:NO];
}
[browserActionsContainerView_ setFrame:containerFrame];
- [self pinGoButtonToLeftOfBrowserActionsContainerAndAnimate:NO];
+ [self pinLocationBarToLeftOfBrowserActionsContainerAndAnimate:NO];
}
}
-- (void)adjustLocationAndGoPositionsBy:(CGFloat)dX animate:(BOOL)animate {
- // Ensure that the 'Go' button is in its proper place.
- NSRect goFrame = [goButton_ frame];
+- (void)adjustLocationSizeBy:(CGFloat)dX animate:(BOOL)animate {
+ // Ensure that the location bar is in its proper place.
NSRect locationFrame = [locationBar_ frame];
- CGFloat rightDelta = (locationFrame.origin.x + NSWidth(locationFrame)) -
- goFrame.origin.x;
- if (rightDelta != 0.0)
- [goButton_ setFrame:NSOffsetRect(goFrame, rightDelta, 0)];
-
- goFrame = NSOffsetRect([goButton_ frame], dX, 0);
locationFrame.size.width += dX;
if (!animate) {
- [goButton_ setFrame:goFrame];
[locationBar_ setFrame:locationFrame];
return;
}
[NSAnimationContext beginGrouping];
[[NSAnimationContext currentContext] setDuration:kAnimationDuration];
- [[goButton_ animator] setFrame:goFrame];
[[locationBar_ animator] setFrame:locationFrame];
[NSAnimationContext endGrouping];
}
@@ -766,50 +751,10 @@ class PrefObserverBridge : public NotificationObserver {
stringForToolTip:(NSToolTipTag)tag
point:(NSPoint)point
userData:(void*)userData {
- DCHECK(view == goButton_);
-
- // Following chrome/browser/views/go_button.cc: GoButton::GetTooltipText()
-
- // Is it currently 'stop'?
- if ([goButton_ tag] == IDC_STOP) {
- return l10n_util::GetNSStringWithFixup(IDS_TOOLTIP_STOP);
- }
-
- // It is 'go', so see what it would do...
-
- // Fetch the EditView and EditModel
- LocationBar* locationBar = [self locationBarBridge];
- DCHECK(locationBar);
- AutocompleteEditView* editView = locationBar->location_entry();
- DCHECK(editView);
- AutocompleteEditModel* editModel = editView->model();
- DCHECK(editModel);
-
- std::wstring currentText(editView->GetText());
- if (currentText.empty()) {
- return nil;
- }
- string16 currentText16(WideToUTF16Hack(currentText));
-
- // It is simply an url it is gonna go to, build the tip with the info.
- if (editModel->CurrentTextIsURL()) {
- return l10n_util::GetNSStringF(IDS_TOOLTIP_GO_SITE, currentText16);
- }
-
- // Build the tip based on what provide/template it will get.
- std::wstring keyword(editModel->keyword());
- TemplateURLModel* template_url_model =
- editModel->profile()->GetTemplateURLModel();
- const TemplateURL* provider =
- (keyword.empty() || editModel->is_keyword_hint()) ?
- template_url_model->GetDefaultSearchProvider() :
- template_url_model->GetTemplateURLForKeyword(keyword);
- if (!provider)
- return nil;
- std::wstring shortName(provider->AdjustedShortNameForLocaleDirection());
- return l10n_util::GetNSStringF(IDS_TOOLTIP_GO_SEARCH,
- WideToUTF16(shortName), currentText16);
+ DCHECK(view == reloadButton_);
+ return l10n_util::GetNSStringWithFixup(
+ [reloadButton_ tag] == IDC_STOP ? IDS_TOOLTIP_STOP : IDS_TOOLTIP_RELOAD);
}
// (URLDropTargetController protocol)
diff --git a/chrome/browser/cocoa/toolbar_controller_unittest.mm b/chrome/browser/cocoa/toolbar_controller_unittest.mm
index b02ec0f..b892759 100644
--- a/chrome/browser/cocoa/toolbar_controller_unittest.mm
+++ b/chrome/browser/cocoa/toolbar_controller_unittest.mm
@@ -43,9 +43,8 @@ class ToolbarControllerTest : public CocoaTest {
// Indexes that match the ordering returned by the private ToolbarController
// |-toolbarViews| method.
enum {
- kBackIndex, kForwardIndex, kReloadIndex, kHomeIndex, kGoIndex,
- kPageIndex, kWrenchIndex, kLocationIndex,
- kBrowserActionContainerViewIndex
+ kBackIndex, kForwardIndex, kReloadIndex, kHomeIndex, kPageIndex,
+ kWrenchIndex, kLocationIndex, kBrowserActionContainerViewIndex
};
ToolbarControllerTest() {
@@ -151,14 +150,14 @@ TEST_F(ToolbarControllerTest, FocusLocation) {
}
TEST_F(ToolbarControllerTest, LoadingState) {
- // In its initial state, the go button has a tag of IDC_GO. When loading,
- // it should be IDC_STOP.
- NSButton* go = [[bar_ toolbarViews] objectAtIndex:kGoIndex];
- EXPECT_EQ([go tag], IDC_GO);
+ // In its initial state, the reload button has a tag of
+ // IDC_RELOAD. When loading, it should be IDC_STOP.
+ NSButton* reload = [[bar_ toolbarViews] objectAtIndex:kReloadIndex];
+ EXPECT_EQ([reload tag], IDC_RELOAD);
[bar_ setIsLoading:YES];
- EXPECT_EQ([go tag], IDC_STOP);
+ EXPECT_EQ([reload tag], IDC_STOP);
[bar_ setIsLoading:NO];
- EXPECT_EQ([go tag], IDC_GO);
+ EXPECT_EQ([reload tag], IDC_RELOAD);
}
// Check that toggling the state of the home button changes the visible
@@ -191,9 +190,7 @@ TEST_F(ToolbarControllerTest, TogglePageWrench) {
EXPECT_EQ(showButtons, ![pageButton isHidden]);
EXPECT_EQ(showButtons, ![wrenchButton isHidden]);
- NSView* goButton = [[bar_ toolbarViews] objectAtIndex:kGoIndex];
NSView* locationBar = [[bar_ toolbarViews] objectAtIndex:kLocationIndex];
- NSRect originalGoFrame = [goButton frame];
NSRect originalLocationBarFrame = [locationBar frame];
// Toggle the pref and make sure the buttons changed state and the other
@@ -201,7 +198,6 @@ TEST_F(ToolbarControllerTest, TogglePageWrench) {
prefs->SetBoolean(prefs::kShowPageOptionsButtons, !showButtons);
EXPECT_EQ(showButtons, [pageButton isHidden]);
EXPECT_EQ(showButtons, [wrenchButton isHidden]);
- EXPECT_NE(NSMinX(originalGoFrame), NSMinX([goButton frame]));
EXPECT_NE(NSWidth(originalLocationBarFrame), NSWidth([locationBar frame]));
}
diff --git a/chrome/browser/gtk/browser_toolbar_gtk.cc b/chrome/browser/gtk/browser_toolbar_gtk.cc
index 30115f3..a3cd9cd 100644
--- a/chrome/browser/gtk/browser_toolbar_gtk.cc
+++ b/chrome/browser/gtk/browser_toolbar_gtk.cc
@@ -29,11 +29,11 @@
#include "chrome/browser/gtk/browser_window_gtk.h"
#include "chrome/browser/gtk/cairo_cached_surface.h"
#include "chrome/browser/gtk/custom_button.h"
-#include "chrome/browser/gtk/go_button_gtk.h"
#include "chrome/browser/gtk/gtk_chrome_button.h"
#include "chrome/browser/gtk/gtk_theme_provider.h"
#include "chrome/browser/gtk/gtk_util.h"
#include "chrome/browser/gtk/location_bar_view_gtk.h"
+#include "chrome/browser/gtk/reload_button_gtk.h"
#include "chrome/browser/gtk/rounded_window.h"
#include "chrome/browser/gtk/tabs/tab_strip_gtk.h"
#include "chrome/browser/gtk/view_id_util.h"
@@ -97,7 +97,6 @@ BrowserToolbarGtk::BrowserToolbarGtk(Browser* browser, BrowserWindowGtk* window)
upgrade_reminder_animation_(this) {
browser_->command_updater()->AddCommandObserver(IDC_BACK, this);
browser_->command_updater()->AddCommandObserver(IDC_FORWARD, this);
- browser_->command_updater()->AddCommandObserver(IDC_RELOAD, this);
browser_->command_updater()->AddCommandObserver(IDC_HOME, this);
browser_->command_updater()->AddCommandObserver(IDC_BOOKMARK_PAGE, this);
@@ -117,7 +116,6 @@ BrowserToolbarGtk::BrowserToolbarGtk(Browser* browser, BrowserWindowGtk* window)
BrowserToolbarGtk::~BrowserToolbarGtk() {
browser_->command_updater()->RemoveCommandObserver(IDC_BACK, this);
browser_->command_updater()->RemoveCommandObserver(IDC_FORWARD, this);
- browser_->command_updater()->RemoveCommandObserver(IDC_RELOAD, this);
browser_->command_updater()->RemoveCommandObserver(IDC_HOME, this);
browser_->command_updater()->RemoveCommandObserver(IDC_BOOKMARK_PAGE, this);
@@ -174,17 +172,16 @@ void BrowserToolbarGtk::Init(Profile* profile,
gtk_box_pack_start(GTK_BOX(toolbar_left_), back_forward_hbox_, FALSE,
FALSE, kToolbarWidgetSpacing);
+ reload_.reset(new ReloadButtonGtk(location_bar_.get(), browser_));
+ gtk_box_pack_start(GTK_BOX(toolbar_left_), reload_->widget(), FALSE, FALSE,
+ 0);
+
home_.reset(BuildToolbarButton(IDR_HOME, IDR_HOME_P, IDR_HOME_H, 0,
IDR_BUTTON_MASK,
l10n_util::GetStringUTF8(IDS_TOOLTIP_HOME),
GTK_STOCK_HOME, kToolbarWidgetSpacing));
gtk_util::SetButtonTriggersNavigation(home_->widget());
- reload_.reset(BuildToolbarButton(IDR_RELOAD, IDR_RELOAD_P, IDR_RELOAD_H, 0,
- IDR_RELOAD_MASK,
- l10n_util::GetStringUTF8(IDS_TOOLTIP_RELOAD),
- GTK_STOCK_REFRESH, 0));
-
gtk_box_pack_start(GTK_BOX(toolbar_), toolbar_left_, FALSE, FALSE, 0);
location_hbox_ = gtk_hbox_new(FALSE, 0);
@@ -199,9 +196,6 @@ void BrowserToolbarGtk::Init(Profile* profile,
toolbar_right_ = gtk_hbox_new(FALSE, 0);
- go_.reset(new GoButtonGtk(location_bar_.get(), browser_));
- gtk_box_pack_start(GTK_BOX(toolbar_right_), go_->widget(), FALSE, FALSE, 0);
-
if (!ShouldOnlyShowLocation()) {
actions_toolbar_.reset(new BrowserActionsToolbarGtk(browser_));
gtk_box_pack_start(GTK_BOX(toolbar_right_), actions_toolbar_->widget(),
@@ -255,7 +249,6 @@ void BrowserToolbarGtk::Init(Profile* profile,
gtk_widget_show(toolbar_);
gtk_widget_show_all(location_hbox_);
gtk_widget_hide(reload_->widget());
- gtk_widget_hide(go_->widget());
} else {
gtk_widget_show_all(event_box_);
if (actions_toolbar_->button_count() == 0)
@@ -279,7 +272,6 @@ void BrowserToolbarGtk::SetViewIDs() {
ViewIDUtil::SetID(reload_->widget(), VIEW_ID_RELOAD_BUTTON);
ViewIDUtil::SetID(home_->widget(), VIEW_ID_HOME_BUTTON);
ViewIDUtil::SetID(location_bar_->widget(), VIEW_ID_LOCATION_BAR);
- ViewIDUtil::SetID(go_->widget(), VIEW_ID_GO_BUTTON);
if (page_menu_button_.get())
ViewIDUtil::SetID(page_menu_button_.get(), VIEW_ID_PAGE_MENU);
ViewIDUtil::SetID(app_menu_button_.get(), VIEW_ID_APP_MENU);
@@ -325,12 +317,6 @@ void BrowserToolbarGtk::EnabledStateChangedForCommand(int id, bool enabled) {
case IDC_FORWARD:
widget = forward_->widget();
break;
- case IDC_RELOAD:
- widget = reload_->widget();
- break;
- case IDC_GO:
- widget = go_->widget();
- break;
case IDC_HOME:
if (home_.get())
widget = home_->widget();
@@ -430,19 +416,6 @@ void BrowserToolbarGtk::Observe(NotificationType type,
gtk_image_set_from_pixbuf(GTK_IMAGE(app_menu_image_),
theme_provider_->GetRTLEnabledPixbufNamed(IDR_MENU_CHROME));
- // Update the spacing between the reload button and the location bar.
- gtk_box_set_child_packing(
- GTK_BOX(toolbar_), reload_->widget(),
- FALSE, FALSE,
- theme_provider_->UseGtkTheme() ? kToolbarWidgetSpacing : 0,
- GTK_PACK_START);
- gtk_box_set_child_packing(
- GTK_BOX(toolbar_), location_hbox_,
- TRUE, TRUE,
- (theme_provider_->UseGtkTheme() ? kToolbarWidgetSpacing : 0) +
- (ShouldOnlyShowLocation() ? 1 : 0),
- GTK_PACK_START);
-
// Force the height of the toolbar so we get the right amount of padding
// above and below the location bar. We always force the size of the hboxes
// to either side of the location box, but we only force the location box
@@ -705,29 +678,9 @@ void BrowserToolbarGtk::OnButtonClick(GtkWidget* button) {
return;
}
- int command = -1;
- GdkModifierType modifier_state;
- gtk_get_current_event_state(&modifier_state);
- guint modifier_state_uint = modifier_state;
- if (button == reload_->widget()) {
- if (modifier_state_uint & GDK_SHIFT_MASK) {
- command = IDC_RELOAD_IGNORING_CACHE;
- // Mask off shift so it isn't interpreted as affecting the disposition
- // below.
- modifier_state_uint &= ~GDK_SHIFT_MASK;
- } else {
- command = IDC_RELOAD;
- }
- if (event_utils::DispositionFromEventFlags(modifier_state_uint) ==
- CURRENT_TAB)
- location_bar_->Revert();
- } else if (home_.get() && button == home_->widget()) {
- command = IDC_HOME;
- }
-
- DCHECK_NE(command, -1) << "Unexpected button click callback";
- browser_->ExecuteCommandWithDisposition(command,
- event_utils::DispositionFromEventFlags(modifier_state_uint));
+ DCHECK(home_.get() && button == home_->widget()) <<
+ "Unexpected button click callback";
+ browser_->Home(gtk_util::DispositionForCurrentButtonPressEvent());
}
gboolean BrowserToolbarGtk::OnMenuButtonPressEvent(GtkWidget* button,
diff --git a/chrome/browser/gtk/browser_toolbar_gtk.h b/chrome/browser/gtk/browser_toolbar_gtk.h
index 51a25d6..48d984a 100644
--- a/chrome/browser/gtk/browser_toolbar_gtk.h
+++ b/chrome/browser/gtk/browser_toolbar_gtk.h
@@ -30,10 +30,10 @@ class BrowserActionsToolbarGtk;
class BrowserWindowGtk;
class CustomDrawButton;
class GtkThemeProvider;
-class GoButtonGtk;
class LocationBar;
class LocationBarViewGtk;
class Profile;
+class ReloadButtonGtk;
class TabContents;
class ToolbarModel;
@@ -71,7 +71,7 @@ class BrowserToolbarGtk : public CommandUpdater::CommandObserver,
virtual LocationBar* GetLocationBar() const;
- GoButtonGtk* GetGoButton() { return go_.get(); }
+ ReloadButtonGtk* GetReloadButton() { return reload_.get(); }
GtkWidget* GetAppMenuButton() { return app_menu_button_.get(); }
@@ -219,8 +219,7 @@ class BrowserToolbarGtk : public CommandUpdater::CommandObserver,
// All the buttons in the toolbar.
scoped_ptr<BackForwardButtonGtk> back_, forward_;
scoped_ptr<CustomDrawButton> home_;
- scoped_ptr<CustomDrawButton> reload_;
- scoped_ptr<GoButtonGtk> go_;
+ scoped_ptr<ReloadButtonGtk> reload_;
scoped_ptr<BrowserActionsToolbarGtk> actions_toolbar_;
OwnedWidgetGtk page_menu_button_, app_menu_button_;
diff --git a/chrome/browser/gtk/browser_window_gtk.cc b/chrome/browser/gtk/browser_window_gtk.cc
index 5d2b7f0..f31b6e8a 100644
--- a/chrome/browser/gtk/browser_window_gtk.cc
+++ b/chrome/browser/gtk/browser_window_gtk.cc
@@ -47,7 +47,6 @@
#include "chrome/browser/gtk/edit_search_engine_dialog.h"
#include "chrome/browser/gtk/find_bar_gtk.h"
#include "chrome/browser/gtk/fullscreen_exit_bubble_gtk.h"
-#include "chrome/browser/gtk/go_button_gtk.h"
#include "chrome/browser/gtk/gtk_floating_container.h"
#include "chrome/browser/gtk/gtk_theme_provider.h"
#include "chrome/browser/gtk/gtk_util.h"
@@ -59,6 +58,7 @@
#include "chrome/browser/gtk/location_bar_view_gtk.h"
#include "chrome/browser/gtk/nine_box.h"
#include "chrome/browser/gtk/options/content_settings_window_gtk.h"
+#include "chrome/browser/gtk/reload_button_gtk.h"
#include "chrome/browser/gtk/repost_form_warning_gtk.h"
#include "chrome/browser/gtk/status_bubble_gtk.h"
#include "chrome/browser/gtk/tab_contents_container_gtk.h"
@@ -828,9 +828,10 @@ void BrowserWindowGtk::SetFocusToLocationBar(bool select_all) {
GetLocationBar()->FocusLocation(select_all);
}
-void BrowserWindowGtk::UpdateStopGoState(bool is_loading, bool force) {
- toolbar_->GetGoButton()->ChangeMode(
- is_loading ? GoButtonGtk::MODE_STOP : GoButtonGtk::MODE_GO, force);
+void BrowserWindowGtk::UpdateReloadStopState(bool is_loading, bool force) {
+ toolbar_->GetReloadButton()->ChangeMode(
+ is_loading ? ReloadButtonGtk::MODE_STOP : ReloadButtonGtk::MODE_RELOAD,
+ force);
}
void BrowserWindowGtk::UpdateToolbar(TabContents* contents,
diff --git a/chrome/browser/gtk/browser_window_gtk.h b/chrome/browser/gtk/browser_window_gtk.h
index 2a66f5f..3f86f43 100644
--- a/chrome/browser/gtk/browser_window_gtk.h
+++ b/chrome/browser/gtk/browser_window_gtk.h
@@ -71,7 +71,7 @@ class BrowserWindowGtk : public BrowserWindow,
virtual bool IsFullscreenBubbleVisible() const;
virtual LocationBar* GetLocationBar() const;
virtual void SetFocusToLocationBar(bool select_all);
- virtual void UpdateStopGoState(bool is_loading, bool force);
+ virtual void UpdateReloadStopState(bool is_loading, bool force);
virtual void UpdateToolbar(TabContents* contents,
bool should_restore_state);
virtual void FocusToolbar();
diff --git a/chrome/browser/gtk/go_button_gtk.cc b/chrome/browser/gtk/go_button_gtk.cc
deleted file mode 100644
index cf0d926..0000000
--- a/chrome/browser/gtk/go_button_gtk.cc
+++ /dev/null
@@ -1,232 +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/gtk/go_button_gtk.h"
-
-#include "app/l10n_util.h"
-#include "base/i18n/rtl.h"
-#include "base/logging.h"
-#include "base/message_loop.h"
-#include "chrome/app/chrome_dll_resource.h"
-#include "chrome/browser/browser.h"
-#include "chrome/browser/gtk/gtk_chrome_button.h"
-#include "chrome/browser/gtk/gtk_theme_provider.h"
-#include "chrome/browser/gtk/gtk_util.h"
-#include "chrome/browser/gtk/location_bar_view_gtk.h"
-#include "chrome/browser/profile.h"
-#include "chrome/browser/search_engines/template_url_model.h"
-#include "chrome/common/notification_service.h"
-#include "grit/generated_resources.h"
-#include "grit/theme_resources.h"
-
-// Limit the length of the tooltip text. This applies only to the text in the
-// omnibox (e.g. X in "Go to X");
-const size_t kMaxTooltipTextLength = 400;
-
-GoButtonGtk::GoButtonGtk(LocationBarViewGtk* location_bar, Browser* browser)
- : location_bar_(location_bar),
- browser_(browser),
- button_delay_(0),
- stop_timer_(this),
- intended_mode_(MODE_GO),
- visible_mode_(MODE_GO),
- theme_provider_(browser ?
- GtkThemeProvider::GetFrom(browser->profile()) : NULL),
- go_(theme_provider_, IDR_GO, IDR_GO_P, IDR_GO_H, 0, IDR_GO_MASK),
- stop_(theme_provider_, IDR_STOP, IDR_STOP_P, IDR_STOP_H, 0, IDR_GO_MASK),
- widget_(gtk_chrome_button_new()) {
- gtk_widget_set_size_request(widget_.get(), go_.Width(), go_.Height());
-
- gtk_widget_set_app_paintable(widget_.get(), TRUE);
-
- g_signal_connect(widget_.get(), "expose-event",
- G_CALLBACK(OnExposeThunk), this);
- g_signal_connect(widget_.get(), "leave-notify-event",
- G_CALLBACK(OnLeaveNotifyThunk), this);
- g_signal_connect(widget_.get(), "clicked",
- G_CALLBACK(OnClickedThunk), this);
- GTK_WIDGET_UNSET_FLAGS(widget_.get(), GTK_CAN_FOCUS);
-
- gtk_widget_set_has_tooltip(widget_.get(), TRUE);
- g_signal_connect(widget_.get(), "query-tooltip",
- G_CALLBACK(OnQueryTooltipThunk), this);
-
- hover_controller_.Init(widget());
- gtk_util::SetButtonTriggersNavigation(widget());
-
- if (theme_provider_) {
- theme_provider_->InitThemesFor(this);
- registrar_.Add(this,
- NotificationType::BROWSER_THEME_CHANGED,
- Source<GtkThemeProvider>(theme_provider_));
- }
-}
-
-GoButtonGtk::~GoButtonGtk() {
- widget_.Destroy();
-}
-
-void GoButtonGtk::ChangeMode(Mode mode, bool force) {
- intended_mode_ = mode;
-
- // If the change is forced, or the user isn't hovering the icon, or it's safe
- // to change it to the other image type, make the change immediately;
- // otherwise we'll let it happen later.
- if (force || GTK_WIDGET_STATE(widget()) == GTK_STATE_NORMAL ||
- ((mode == MODE_STOP) ?
- stop_timer_.empty() : (visible_mode_ != MODE_STOP))) {
- stop_timer_.RevokeAll();
- visible_mode_ = mode;
- gtk_widget_queue_draw(widget_.get());
-
- UpdateThemeButtons();
- }
-}
-
-void GoButtonGtk::Observe(NotificationType type,
- const NotificationSource& source, const NotificationDetails& details) {
- DCHECK(NotificationType::BROWSER_THEME_CHANGED == type);
-
- GtkThemeProvider* provider = static_cast<GtkThemeProvider*>(
- Source<GtkThemeProvider>(source).ptr());
- DCHECK(provider == theme_provider_);
- UpdateThemeButtons();
-}
-
-Task* GoButtonGtk::CreateButtonTimerTask() {
- return stop_timer_.NewRunnableMethod(&GoButtonGtk::OnButtonTimer);
-}
-
-void GoButtonGtk::OnButtonTimer() {
- stop_timer_.RevokeAll();
- ChangeMode(intended_mode_, true);
-}
-
-gboolean GoButtonGtk::OnExpose(GtkWidget* widget,
- GdkEventExpose* e) {
- if (theme_provider_ && theme_provider_->UseGtkTheme()) {
- return FALSE;
- } else {
- double hover_state = hover_controller_.GetCurrentValue();
- if (visible_mode_ == MODE_GO) {
- return go_.OnExpose(widget, e, hover_state);
- } else {
- return stop_.OnExpose(widget, e, hover_state);
- }
- }
-}
-
-gboolean GoButtonGtk::OnLeaveNotify(GtkWidget* widget,
- GdkEventCrossing* event) {
- ChangeMode(intended_mode_, true);
- return FALSE;
-}
-
-void GoButtonGtk::OnClicked(GtkWidget* sender) {
- if (visible_mode_ == MODE_STOP) {
- if (browser_)
- browser_->Stop();
-
- // The user has clicked, so we can feel free to update the button,
- // even if the mouse is still hovering.
- ChangeMode(MODE_GO, true);
- } else if (visible_mode_ == MODE_GO && stop_timer_.empty()) {
- // If the go button is visible and not within the double click timer, go.
- if (browser_) {
- browser_->ExecuteCommandWithDisposition(IDC_GO,
- gtk_util::DispositionForCurrentButtonPressEvent());
- }
-
- // Figure out the system double-click time.
- if (button_delay_ == 0) {
- GtkSettings* settings = gtk_settings_get_default();
- g_object_get(G_OBJECT(settings),
- "gtk-double-click-time",
- &button_delay_,
- NULL);
- }
-
- // Stop any existing timers.
- stop_timer_.RevokeAll();
-
- // Start a timer - while this timer is running, the go button
- // cannot be changed to a stop button. We do not set intended_mode_
- // to MODE_STOP here as we want to wait for the browser to tell
- // us that it has started loading (and this may occur only after
- // some delay).
- MessageLoop::current()->PostDelayedTask(FROM_HERE,
- CreateButtonTimerTask(),
- button_delay_);
- }
-}
-
-gboolean GoButtonGtk::OnQueryTooltip(GtkWidget* sender,
- gint x, gint y, gboolean keyboard_mode,
- GtkTooltip* tooltip) {
- // |location_bar_| can be NULL in tests.
- if (!location_bar_)
- return FALSE;
-
- std::string text;
- if (visible_mode_ == MODE_GO) {
- std::wstring current_text_wstr(location_bar_->location_entry()->GetText());
- base::i18n::GetDisplayStringInLTRDirectionality(&current_text_wstr);
- string16 current_text = WideToUTF16Hack(
- l10n_util::TruncateString(current_text_wstr, kMaxTooltipTextLength));
-
- AutocompleteEditModel* edit_model =
- location_bar_->location_entry()->model();
- if (edit_model->CurrentTextIsURL()) {
- text = l10n_util::GetStringFUTF8(IDS_TOOLTIP_GO_SITE, current_text);
- } else {
- std::wstring keyword(edit_model->keyword());
- TemplateURLModel* template_url_model =
- browser_->profile()->GetTemplateURLModel();
- const TemplateURL* provider =
- (keyword.empty() || edit_model->is_keyword_hint()) ?
- template_url_model->GetDefaultSearchProvider() :
- template_url_model->GetTemplateURLForKeyword(keyword);
- if (!provider)
- return FALSE; // Don't show a tooltip.
- text = l10n_util::GetStringFUTF8(IDS_TOOLTIP_GO_SEARCH,
- WideToUTF16Hack(provider->AdjustedShortNameForLocaleDirection()),
- current_text);
- }
- } else {
- text = l10n_util::GetStringUTF8(IDS_TOOLTIP_STOP);
- }
-
- gtk_tooltip_set_text(tooltip, text.c_str());
- return TRUE;
-}
-
-void GoButtonGtk::UpdateThemeButtons() {
- bool use_gtk = theme_provider_ && theme_provider_->UseGtkTheme();
-
- if (use_gtk) {
- GdkPixbuf* pixbuf = NULL;
- if (intended_mode_ == MODE_GO) {
- pixbuf = theme_provider_->GetPixbufNamed(IDR_GO_NOBORDER_CENTER);
- } else {
- pixbuf = theme_provider_->GetPixbufNamed(IDR_STOP_NOBORDER_CENTER);
- }
-
- gtk_button_set_image(
- GTK_BUTTON(widget_.get()),
- gtk_image_new_from_pixbuf(pixbuf));
-
- gtk_widget_set_size_request(widget_.get(), -1, -1);
- gtk_widget_set_app_paintable(widget_.get(), FALSE);
- gtk_widget_set_double_buffered(widget_.get(), TRUE);
- } else {
- gtk_widget_set_size_request(widget_.get(), go_.Width(), go_.Height());
-
- gtk_widget_set_app_paintable(widget_.get(), TRUE);
- // We effectively double-buffer by virtue of having only one image...
- gtk_widget_set_double_buffered(widget_.get(), FALSE);
- }
-
- gtk_chrome_button_set_use_gtk_rendering(
- GTK_CHROME_BUTTON(widget_.get()), use_gtk);
-}
diff --git a/chrome/browser/gtk/go_button_gtk_unittest.cc b/chrome/browser/gtk/go_button_gtk_unittest.cc
deleted file mode 100644
index b714193..0000000
--- a/chrome/browser/gtk/go_button_gtk_unittest.cc
+++ /dev/null
@@ -1,133 +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/gtk/go_button_gtk.h"
-#include "base/task.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-class GoButtonGtkPeer {
- public:
- explicit GoButtonGtkPeer(GoButtonGtk* go) : go_(go) { }
-
- // const accessors for internal state
- GoButtonGtk::Mode intended_mode() const { return go_->intended_mode_; }
- GoButtonGtk::Mode visible_mode() const { return go_->visible_mode_; }
-
- // mutable accessors for internal state
- ScopedRunnableMethodFactory<GoButtonGtk>* stop_timer() {
- return &go_->stop_timer_;
- }
-
- void SetState(GtkStateType state) {
- gtk_widget_set_state(go_->widget(), state);
- }
-
- // mutators for internal state
- void set_intended_mode(GoButtonGtk::Mode mode) { go_->intended_mode_ = mode; }
- void set_visible_mode(GoButtonGtk::Mode mode) { go_->visible_mode_ = mode; }
-
- // forwarders to private methods
- Task* CreateButtonTimerTask() { return go_->CreateButtonTimerTask(); }
- gboolean OnLeave() {
- return go_->OnLeaveNotify(go_->widget(), NULL);
- }
-
- void OnClicked() {
- go_->OnClicked(go_->widget());
- }
-
- private:
- GoButtonGtk* const go_;
-};
-
-namespace {
-
-class GoButtonGtkTest : public testing::Test {
- protected:
- GoButtonGtkTest() : go_(NULL, NULL), peer_(&go_) { }
-
- protected:
- GoButtonGtk go_;
- GoButtonGtkPeer peer_;
-};
-
-TEST_F(GoButtonGtkTest, ChangeModeGo) {
- go_.ChangeMode(GoButtonGtk::MODE_GO, true);
- EXPECT_EQ(GoButtonGtk::MODE_GO, peer_.intended_mode());
- EXPECT_EQ(GoButtonGtk::MODE_GO, peer_.visible_mode());
-}
-
-TEST_F(GoButtonGtkTest, ChangeModeStop) {
- go_.ChangeMode(GoButtonGtk::MODE_STOP, true);
- EXPECT_EQ(GoButtonGtk::MODE_STOP, peer_.intended_mode());
- EXPECT_EQ(GoButtonGtk::MODE_STOP, peer_.visible_mode());
-}
-
-TEST_F(GoButtonGtkTest, ScheduleChangeModeNormalGo) {
- peer_.set_visible_mode(GoButtonGtk::MODE_STOP);
- peer_.SetState(GTK_STATE_NORMAL);
- go_.ChangeMode(GoButtonGtk::MODE_GO, false);
- EXPECT_EQ(GoButtonGtk::MODE_GO, peer_.intended_mode());
- EXPECT_EQ(GoButtonGtk::MODE_GO, peer_.visible_mode());
-}
-
-TEST_F(GoButtonGtkTest, ScheduleChangeModeHotGo) {
- peer_.set_visible_mode(GoButtonGtk::MODE_STOP);
- peer_.SetState(GTK_STATE_PRELIGHT);
- go_.ChangeMode(GoButtonGtk::MODE_GO, false);
- EXPECT_EQ(GoButtonGtk::MODE_GO, peer_.intended_mode());
- EXPECT_EQ(GoButtonGtk::MODE_STOP, peer_.visible_mode());
-}
-
-TEST_F(GoButtonGtkTest, ScheduleChangeModeNormalStop) {
- peer_.set_visible_mode(GoButtonGtk::MODE_GO);
- peer_.SetState(GTK_STATE_NORMAL);
- go_.ChangeMode(GoButtonGtk::MODE_STOP, false);
- EXPECT_EQ(GoButtonGtk::MODE_STOP, peer_.intended_mode());
- EXPECT_EQ(GoButtonGtk::MODE_STOP, peer_.visible_mode());
-}
-
-TEST_F(GoButtonGtkTest, ScheduleChangeModeHotStop) {
- peer_.set_visible_mode(GoButtonGtk::MODE_GO);
- peer_.SetState(GTK_STATE_PRELIGHT);
- go_.ChangeMode(GoButtonGtk::MODE_STOP, false);
- EXPECT_EQ(GoButtonGtk::MODE_STOP, peer_.intended_mode());
- EXPECT_EQ(GoButtonGtk::MODE_STOP, peer_.visible_mode());
-}
-
-TEST_F(GoButtonGtkTest, ScheduleChangeModeTimerHotStop) {
- peer_.set_visible_mode(GoButtonGtk::MODE_GO);
- peer_.SetState(GTK_STATE_PRELIGHT);
- scoped_ptr<Task> task(peer_.CreateButtonTimerTask());
- go_.ChangeMode(GoButtonGtk::MODE_STOP, false);
- EXPECT_EQ(GoButtonGtk::MODE_STOP, peer_.intended_mode());
- EXPECT_EQ(GoButtonGtk::MODE_GO, peer_.visible_mode());
-}
-
-TEST_F(GoButtonGtkTest, OnLeaveIntendedStop) {
- peer_.SetState(GTK_STATE_PRELIGHT);
- peer_.set_visible_mode(GoButtonGtk::MODE_GO);
- peer_.set_intended_mode(GoButtonGtk::MODE_STOP);
- peer_.OnLeave();
- EXPECT_EQ(GoButtonGtk::MODE_STOP, peer_.visible_mode());
- EXPECT_EQ(GoButtonGtk::MODE_STOP, peer_.intended_mode());
-}
-
-TEST_F(GoButtonGtkTest, OnLeaveIntendedGo) {
- peer_.SetState(GTK_STATE_PRELIGHT);
- peer_.set_visible_mode(GoButtonGtk::MODE_STOP);
- peer_.set_intended_mode(GoButtonGtk::MODE_GO);
- peer_.OnLeave();
- EXPECT_EQ(GoButtonGtk::MODE_GO, peer_.visible_mode());
- EXPECT_EQ(GoButtonGtk::MODE_GO, peer_.intended_mode());
-}
-
-TEST_F(GoButtonGtkTest, OnClickedStop) {
- peer_.set_visible_mode(GoButtonGtk::MODE_STOP);
- peer_.OnClicked();
- EXPECT_EQ(GoButtonGtk::MODE_GO, peer_.visible_mode());
- EXPECT_EQ(GoButtonGtk::MODE_GO, peer_.intended_mode());
-}
-
-} // namespace
diff --git a/chrome/browser/gtk/location_bar_view_gtk.cc b/chrome/browser/gtk/location_bar_view_gtk.cc
index 1b89b07..3343615 100644
--- a/chrome/browser/gtk/location_bar_view_gtk.cc
+++ b/chrome/browser/gtk/location_bar_view_gtk.cc
@@ -540,12 +540,7 @@ PageTransition::Type LocationBarViewGtk::GetPageTransition() const {
}
void LocationBarViewGtk::AcceptInput() {
- AcceptInputWithDisposition(CURRENT_TAB);
-}
-
-void LocationBarViewGtk::AcceptInputWithDisposition(
- WindowOpenDisposition disposition) {
- location_entry_->model()->AcceptInput(disposition, false);
+ location_entry_->model()->AcceptInput(CURRENT_TAB, false);
}
void LocationBarViewGtk::FocusLocation(bool select_all) {
diff --git a/chrome/browser/gtk/location_bar_view_gtk.h b/chrome/browser/gtk/location_bar_view_gtk.h
index 4cd11f9..412adf0 100644
--- a/chrome/browser/gtk/location_bar_view_gtk.h
+++ b/chrome/browser/gtk/location_bar_view_gtk.h
@@ -101,7 +101,6 @@ class LocationBarViewGtk : public AutocompleteEditController,
virtual WindowOpenDisposition GetWindowOpenDisposition() const;
virtual PageTransition::Type GetPageTransition() const;
virtual void AcceptInput();
- virtual void AcceptInputWithDisposition(WindowOpenDisposition);
virtual void FocusLocation(bool select_all);
virtual void FocusSearch();
virtual void UpdateContentSettingsIcons();
diff --git a/chrome/browser/gtk/reload_button_gtk.cc b/chrome/browser/gtk/reload_button_gtk.cc
new file mode 100644
index 0000000..8e3cb8f
--- /dev/null
+++ b/chrome/browser/gtk/reload_button_gtk.cc
@@ -0,0 +1,218 @@
+// 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/gtk/reload_button_gtk.h"
+
+#include "app/l10n_util.h"
+#include "base/logging.h"
+#include "chrome/app/chrome_dll_resource.h"
+#include "chrome/browser/browser.h"
+#include "chrome/browser/gtk/gtk_chrome_button.h"
+#include "chrome/browser/gtk/gtk_theme_provider.h"
+#include "chrome/browser/gtk/gtk_util.h"
+#include "chrome/browser/gtk/location_bar_view_gtk.h"
+#include "chrome/common/notification_service.h"
+#include "grit/generated_resources.h"
+#include "grit/theme_resources.h"
+
+// The width of this button in GTK+ theme mode. The Stop and Refresh stock icons
+// can be different sizes; this variable is used to make sure that the button
+// doesn't change sizes when switching between the two.
+static int GtkButtonWidth = 0;
+
+ReloadButtonGtk::ReloadButtonGtk(LocationBarViewGtk* location_bar,
+ Browser* browser)
+ : location_bar_(location_bar),
+ browser_(browser),
+ button_delay_(0),
+ pretend_timer_is_running_for_unittest_(false),
+ intended_mode_(MODE_RELOAD),
+ visible_mode_(MODE_RELOAD),
+ theme_provider_(browser ?
+ GtkThemeProvider::GetFrom(browser->profile()) : NULL),
+ reload_(theme_provider_, IDR_RELOAD, IDR_RELOAD_P, IDR_RELOAD_H, 0,
+ IDR_BUTTON_MASK),
+ stop_(theme_provider_, IDR_STOP, IDR_STOP_P, IDR_STOP_H, 0,
+ IDR_BUTTON_MASK),
+ widget_(gtk_chrome_button_new()) {
+ gtk_widget_set_size_request(widget_.get(), reload_.Width(), reload_.Height());
+
+ gtk_widget_set_app_paintable(widget_.get(), TRUE);
+
+ g_signal_connect(widget_.get(), "expose-event",
+ G_CALLBACK(OnExposeThunk), this);
+ g_signal_connect(widget_.get(), "leave-notify-event",
+ G_CALLBACK(OnLeaveNotifyThunk), this);
+ g_signal_connect(widget_.get(), "clicked",
+ G_CALLBACK(OnClickedThunk), this);
+ GTK_WIDGET_UNSET_FLAGS(widget_.get(), GTK_CAN_FOCUS);
+
+ gtk_widget_set_has_tooltip(widget_.get(), TRUE);
+ g_signal_connect(widget_.get(), "query-tooltip",
+ G_CALLBACK(OnQueryTooltipThunk), this);
+
+ hover_controller_.Init(widget());
+ gtk_util::SetButtonTriggersNavigation(widget());
+
+ if (theme_provider_) {
+ theme_provider_->InitThemesFor(this);
+ registrar_.Add(this,
+ NotificationType::BROWSER_THEME_CHANGED,
+ Source<GtkThemeProvider>(theme_provider_));
+ }
+}
+
+ReloadButtonGtk::~ReloadButtonGtk() {
+ widget_.Destroy();
+}
+
+void ReloadButtonGtk::ChangeMode(Mode mode, bool force) {
+ intended_mode_ = mode;
+
+ // If the change is forced, or the user isn't hovering the icon, or it's safe
+ // to change it to the other image type, make the change immediately;
+ // otherwise we'll let it happen later.
+ if (force || GTK_WIDGET_STATE(widget()) == GTK_STATE_NORMAL ||
+ ((mode == MODE_STOP) ?
+ !timer_running() : (visible_mode_ != MODE_STOP))) {
+ timer_.Stop();
+ visible_mode_ = mode;
+ gtk_widget_queue_draw(widget_.get());
+
+ UpdateThemeButtons();
+ }
+}
+
+void ReloadButtonGtk::Observe(NotificationType type,
+ const NotificationSource& source,
+ const NotificationDetails& details) {
+ DCHECK(NotificationType::BROWSER_THEME_CHANGED == type);
+
+ GtkThemeProvider* provider = static_cast<GtkThemeProvider*>(
+ Source<GtkThemeProvider>(source).ptr());
+ DCHECK_EQ(provider, theme_provider_);
+ GtkButtonWidth = 0;
+ UpdateThemeButtons();
+}
+
+void ReloadButtonGtk::OnButtonTimer() {
+ ChangeMode(intended_mode_, true);
+}
+
+gboolean ReloadButtonGtk::OnExpose(GtkWidget* widget,
+ GdkEventExpose* e) {
+ if (theme_provider_ && theme_provider_->UseGtkTheme())
+ return FALSE;
+ return ((visible_mode_ == MODE_RELOAD) ? reload_ : stop_).OnExpose(
+ widget, e, hover_controller_.GetCurrentValue());
+}
+
+gboolean ReloadButtonGtk::OnLeaveNotify(GtkWidget* widget,
+ GdkEventCrossing* event) {
+ ChangeMode(intended_mode_, true);
+ return FALSE;
+}
+
+void ReloadButtonGtk::OnClicked(GtkWidget* sender) {
+ if (visible_mode_ == MODE_STOP) {
+ if (browser_)
+ browser_->Stop();
+
+ // The user has clicked, so we can feel free to update the button,
+ // even if the mouse is still hovering.
+ ChangeMode(MODE_RELOAD, true);
+ } else if (!timer_running()) {
+ // Shift-clicking or Ctrl-clicking the reload button means we should ignore
+ // any cached content.
+ int command;
+ GdkModifierType modifier_state;
+ gtk_get_current_event_state(&modifier_state);
+ guint modifier_state_uint = modifier_state;
+ if (modifier_state_uint & GDK_SHIFT_MASK) {
+ command = IDC_RELOAD_IGNORING_CACHE;
+ // Mask off shift so it isn't interpreted as affecting the disposition
+ // below.
+ modifier_state_uint &= ~GDK_SHIFT_MASK;
+ } else {
+ command = IDC_RELOAD;
+ }
+
+ WindowOpenDisposition disposition =
+ event_utils::DispositionFromEventFlags(modifier_state_uint);
+ if (disposition == CURRENT_TAB) {
+ // Forcibly reset the location bar, since otherwise it won't discard any
+ // ongoing user edits, since it doesn't realize this is a user-initiated
+ // action.
+ location_bar_->Revert();
+ }
+
+ if (browser_)
+ browser_->ExecuteCommandWithDisposition(command, disposition);
+
+ // Figure out the system double-click time.
+ if (button_delay_ == 0) {
+ GtkSettings* settings = gtk_settings_get_default();
+ g_object_get(G_OBJECT(settings), "gtk-double-click-time", &button_delay_,
+ NULL);
+ }
+
+ // Stop the timer.
+ timer_.Stop();
+
+ // Start a timer - while this timer is running, the reload button cannot be
+ // changed to a stop button. We do not set |intended_mode_| to MODE_STOP
+ // here as we want to wait for the browser to tell us that it has started
+ // loading (and this may occur only after some delay).
+ timer_.Start(base::TimeDelta::FromMilliseconds(button_delay_), this,
+ &ReloadButtonGtk::OnButtonTimer);
+ }
+}
+
+gboolean ReloadButtonGtk::OnQueryTooltip(GtkWidget* sender,
+ gint x,
+ gint y,
+ gboolean keyboard_mode,
+ GtkTooltip* tooltip) {
+ // |location_bar_| can be NULL in tests.
+ if (!location_bar_)
+ return FALSE;
+
+ gtk_tooltip_set_text(tooltip, l10n_util::GetStringUTF8(
+ (visible_mode_ == MODE_RELOAD) ?
+ IDS_TOOLTIP_RELOAD : IDS_TOOLTIP_STOP).c_str());
+ return TRUE;
+}
+
+void ReloadButtonGtk::UpdateThemeButtons() {
+ bool use_gtk = theme_provider_ && theme_provider_->UseGtkTheme();
+
+ if (use_gtk) {
+ GdkPixbuf* pixbuf = gtk_widget_render_icon(widget(),
+ (intended_mode_ == MODE_RELOAD) ? GTK_STOCK_REFRESH : GTK_STOCK_STOP,
+ GTK_ICON_SIZE_SMALL_TOOLBAR, NULL);
+
+ gtk_button_set_image(GTK_BUTTON(widget_.get()),
+ gtk_image_new_from_pixbuf(pixbuf));
+ g_object_unref(pixbuf);
+
+ gtk_widget_set_size_request(widget_.get(), -1, -1);
+ GtkRequisition req;
+ gtk_widget_size_request(widget(), &req);
+ GtkButtonWidth = std::max(GtkButtonWidth, req.width);
+ gtk_widget_set_size_request(widget_.get(), GtkButtonWidth, -1);
+
+ gtk_widget_set_app_paintable(widget_.get(), FALSE);
+ gtk_widget_set_double_buffered(widget_.get(), TRUE);
+ } else {
+ gtk_widget_set_size_request(widget_.get(), reload_.Width(),
+ reload_.Height());
+
+ gtk_widget_set_app_paintable(widget_.get(), TRUE);
+ // We effectively double-buffer by virtue of having only one image...
+ gtk_widget_set_double_buffered(widget_.get(), FALSE);
+ }
+
+ gtk_chrome_button_set_use_gtk_rendering(
+ GTK_CHROME_BUTTON(widget_.get()), use_gtk);
+}
diff --git a/chrome/browser/gtk/go_button_gtk.h b/chrome/browser/gtk/reload_button_gtk.h
index 9626256..6cc3a13 100644
--- a/chrome/browser/gtk/go_button_gtk.h
+++ b/chrome/browser/gtk/reload_button_gtk.h
@@ -2,14 +2,14 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef CHROME_BROWSER_GTK_GO_BUTTON_GTK_H_
-#define CHROME_BROWSER_GTK_GO_BUTTON_GTK_H_
+#ifndef CHROME_BROWSER_GTK_RELOAD_BUTTON_GTK_H_
+#define CHROME_BROWSER_GTK_RELOAD_BUTTON_GTK_H_
#include <gtk/gtk.h>
#include "app/gtk_signal.h"
#include "base/basictypes.h"
-#include "base/task.h"
+#include "base/timer.h"
#include "chrome/browser/gtk/custom_button.h"
#include "chrome/common/notification_observer.h"
#include "chrome/common/notification_registrar.h"
@@ -20,12 +20,12 @@ class GtkThemeProvider;
class LocationBarViewGtk;
class Task;
-class GoButtonGtk : public NotificationObserver {
+class ReloadButtonGtk : public NotificationObserver {
public:
- enum Mode { MODE_GO = 0, MODE_STOP };
+ enum Mode { MODE_RELOAD = 0, MODE_STOP };
- GoButtonGtk(LocationBarViewGtk* location_bar, Browser* browser);
- ~GoButtonGtk();
+ ReloadButtonGtk(LocationBarViewGtk* location_bar, Browser* browser);
+ ~ReloadButtonGtk();
GtkWidget* widget() const { return widget_.get(); }
@@ -39,18 +39,23 @@ class GoButtonGtk : public NotificationObserver {
const NotificationDetails& details);
private:
- friend class GoButtonGtkPeer;
+ friend class ReloadButtonGtkPeer;
- CHROMEGTK_CALLBACK_1(GoButtonGtk, gboolean, OnExpose, GdkEventExpose*);
- CHROMEGTK_CALLBACK_1(GoButtonGtk, gboolean, OnLeaveNotify, GdkEventCrossing*);
- CHROMEGTK_CALLBACK_0(GoButtonGtk, void, OnClicked);
- CHROMEGTK_CALLBACK_4(GoButtonGtk, gboolean, OnQueryTooltip,
- gint, gint, gboolean, GtkTooltip*);
+ CHROMEGTK_CALLBACK_1(ReloadButtonGtk, gboolean, OnExpose, GdkEventExpose*);
+ CHROMEGTK_CALLBACK_1(ReloadButtonGtk, gboolean, OnLeaveNotify,
+ GdkEventCrossing*);
+ CHROMEGTK_CALLBACK_0(ReloadButtonGtk, void, OnClicked);
+ CHROMEGTK_CALLBACK_4(ReloadButtonGtk, gboolean, OnQueryTooltip, gint, gint,
+ gboolean, GtkTooltip*);
void SetToggled();
- Task* CreateButtonTimerTask();
+ bool timer_running() const {
+ return timer_.IsRunning() || pretend_timer_is_running_for_unittest_;
+ }
+
void OnButtonTimer();
+
void UpdateThemeButtons();
// Used to listen for theme change notifications.
@@ -64,7 +69,8 @@ class GoButtonGtk : public NotificationObserver {
// Delay time to wait before allowing a mode change. This is to prevent a
// mode switch while the user is double clicking.
int button_delay_;
- ScopedRunnableMethodFactory<GoButtonGtk> stop_timer_;
+ base::OneShotTimer<ReloadButtonGtk> timer_;
+ bool pretend_timer_is_running_for_unittest_;
// The mode we should be in.
Mode intended_mode_;
@@ -74,13 +80,13 @@ class GoButtonGtk : public NotificationObserver {
GtkThemeProvider* theme_provider_;
- CustomDrawButtonBase go_;
+ CustomDrawButtonBase reload_;
CustomDrawButtonBase stop_;
CustomDrawHoverController hover_controller_;
OwnedWidgetGtk widget_;
- DISALLOW_COPY_AND_ASSIGN(GoButtonGtk);
+ DISALLOW_IMPLICIT_CONSTRUCTORS(ReloadButtonGtk);
};
-#endif // CHROME_BROWSER_GTK_GO_BUTTON_GTK_H_
+#endif // CHROME_BROWSER_GTK_RELOAD_BUTTON_GTK_H_
diff --git a/chrome/browser/gtk/reload_button_gtk_unittest.cc b/chrome/browser/gtk/reload_button_gtk_unittest.cc
new file mode 100644
index 0000000..12384b6
--- /dev/null
+++ b/chrome/browser/gtk/reload_button_gtk_unittest.cc
@@ -0,0 +1,138 @@
+// 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/gtk/reload_button_gtk.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+class ReloadButtonGtkPeer {
+ public:
+ explicit ReloadButtonGtkPeer(ReloadButtonGtk* reload) : reload_(reload) { }
+
+ // const accessors for internal state
+ ReloadButtonGtk::Mode intended_mode() const {
+ return reload_->intended_mode_;
+ }
+ ReloadButtonGtk::Mode visible_mode() const { return reload_->visible_mode_; }
+
+ // mutators for internal state
+ void SetState(GtkStateType state) {
+ gtk_widget_set_state(reload_->widget(), state);
+ }
+ void set_intended_mode(ReloadButtonGtk::Mode mode) {
+ reload_->intended_mode_ = mode;
+ }
+ void set_visible_mode(ReloadButtonGtk::Mode mode) {
+ reload_->visible_mode_ = mode;
+ }
+ void set_timer_running() {
+ reload_->pretend_timer_is_running_for_unittest_ = true;
+ }
+ void set_timer_stopped() {
+ reload_->pretend_timer_is_running_for_unittest_ = false;
+ }
+
+ // forwarders to private methods
+ gboolean OnLeave() {
+ return reload_->OnLeaveNotify(reload_->widget(), NULL);
+ }
+
+ void OnClicked() {
+ reload_->OnClicked(reload_->widget());
+ }
+
+ private:
+ ReloadButtonGtk* const reload_;
+};
+
+namespace {
+
+class ReloadButtonGtkTest : public testing::Test {
+ protected:
+ ReloadButtonGtkTest() : reload_(NULL, NULL), peer_(&reload_) { }
+
+ protected:
+ ReloadButtonGtk reload_;
+ ReloadButtonGtkPeer peer_;
+};
+
+TEST_F(ReloadButtonGtkTest, ChangeModeReload) {
+ reload_.ChangeMode(ReloadButtonGtk::MODE_RELOAD, true);
+ EXPECT_EQ(ReloadButtonGtk::MODE_RELOAD, peer_.intended_mode());
+ EXPECT_EQ(ReloadButtonGtk::MODE_RELOAD, peer_.visible_mode());
+}
+
+TEST_F(ReloadButtonGtkTest, ChangeModeStop) {
+ reload_.ChangeMode(ReloadButtonGtk::MODE_STOP, true);
+ EXPECT_EQ(ReloadButtonGtk::MODE_STOP, peer_.intended_mode());
+ EXPECT_EQ(ReloadButtonGtk::MODE_STOP, peer_.visible_mode());
+}
+
+TEST_F(ReloadButtonGtkTest, ScheduleChangeModeNormalReload) {
+ peer_.set_visible_mode(ReloadButtonGtk::MODE_STOP);
+ peer_.SetState(GTK_STATE_NORMAL);
+ reload_.ChangeMode(ReloadButtonGtk::MODE_RELOAD, false);
+ EXPECT_EQ(ReloadButtonGtk::MODE_RELOAD, peer_.intended_mode());
+ EXPECT_EQ(ReloadButtonGtk::MODE_RELOAD, peer_.visible_mode());
+}
+
+TEST_F(ReloadButtonGtkTest, ScheduleChangeModeHotReload) {
+ peer_.set_visible_mode(ReloadButtonGtk::MODE_STOP);
+ peer_.SetState(GTK_STATE_PRELIGHT);
+ reload_.ChangeMode(ReloadButtonGtk::MODE_RELOAD, false);
+ EXPECT_EQ(ReloadButtonGtk::MODE_RELOAD, peer_.intended_mode());
+ EXPECT_EQ(ReloadButtonGtk::MODE_STOP, peer_.visible_mode());
+}
+
+TEST_F(ReloadButtonGtkTest, ScheduleChangeModeNormalStop) {
+ peer_.set_visible_mode(ReloadButtonGtk::MODE_RELOAD);
+ peer_.SetState(GTK_STATE_NORMAL);
+ reload_.ChangeMode(ReloadButtonGtk::MODE_STOP, false);
+ EXPECT_EQ(ReloadButtonGtk::MODE_STOP, peer_.intended_mode());
+ EXPECT_EQ(ReloadButtonGtk::MODE_STOP, peer_.visible_mode());
+}
+
+TEST_F(ReloadButtonGtkTest, ScheduleChangeModeHotStop) {
+ peer_.set_visible_mode(ReloadButtonGtk::MODE_RELOAD);
+ peer_.SetState(GTK_STATE_PRELIGHT);
+ reload_.ChangeMode(ReloadButtonGtk::MODE_STOP, false);
+ EXPECT_EQ(ReloadButtonGtk::MODE_STOP, peer_.intended_mode());
+ EXPECT_EQ(ReloadButtonGtk::MODE_STOP, peer_.visible_mode());
+}
+
+TEST_F(ReloadButtonGtkTest, ScheduleChangeModeTimerHotStop) {
+ peer_.set_visible_mode(ReloadButtonGtk::MODE_RELOAD);
+ peer_.SetState(GTK_STATE_PRELIGHT);
+ peer_.set_timer_running();
+ reload_.ChangeMode(ReloadButtonGtk::MODE_STOP, false);
+ peer_.set_timer_stopped();
+ EXPECT_EQ(ReloadButtonGtk::MODE_STOP, peer_.intended_mode());
+ EXPECT_EQ(ReloadButtonGtk::MODE_RELOAD, peer_.visible_mode());
+}
+
+TEST_F(ReloadButtonGtkTest, OnLeaveIntendedStop) {
+ peer_.SetState(GTK_STATE_PRELIGHT);
+ peer_.set_visible_mode(ReloadButtonGtk::MODE_RELOAD);
+ peer_.set_intended_mode(ReloadButtonGtk::MODE_STOP);
+ peer_.OnLeave();
+ EXPECT_EQ(ReloadButtonGtk::MODE_STOP, peer_.visible_mode());
+ EXPECT_EQ(ReloadButtonGtk::MODE_STOP, peer_.intended_mode());
+}
+
+TEST_F(ReloadButtonGtkTest, OnLeaveIntendedReload) {
+ peer_.SetState(GTK_STATE_PRELIGHT);
+ peer_.set_visible_mode(ReloadButtonGtk::MODE_STOP);
+ peer_.set_intended_mode(ReloadButtonGtk::MODE_RELOAD);
+ peer_.OnLeave();
+ EXPECT_EQ(ReloadButtonGtk::MODE_RELOAD, peer_.visible_mode());
+ EXPECT_EQ(ReloadButtonGtk::MODE_RELOAD, peer_.intended_mode());
+}
+
+TEST_F(ReloadButtonGtkTest, OnClickedStop) {
+ peer_.set_visible_mode(ReloadButtonGtk::MODE_STOP);
+ peer_.OnClicked();
+ EXPECT_EQ(ReloadButtonGtk::MODE_RELOAD, peer_.visible_mode());
+ EXPECT_EQ(ReloadButtonGtk::MODE_RELOAD, peer_.intended_mode());
+}
+
+} // namespace
diff --git a/chrome/browser/gtk/view_id_util.cc b/chrome/browser/gtk/view_id_util.cc
index ad4328c..95ef79e 100644
--- a/chrome/browser/gtk/view_id_util.cc
+++ b/chrome/browser/gtk/view_id_util.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// 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.
@@ -83,9 +83,6 @@ const char* GetNameFromID(ViewID id) {
case VIEW_ID_LOCATION_BAR:
return "chrome-location-bar";
- case VIEW_ID_GO_BUTTON:
- return "chrome-toolbar-go-button";
-
case VIEW_ID_BROWSER_ACTION_TOOLBAR:
return "chrome-toolbar-browser-actions-container";
diff --git a/chrome/browser/location_bar.h b/chrome/browser/location_bar.h
index 0ceee05..8b18be6 100644
--- a/chrome/browser/location_bar.h
+++ b/chrome/browser/location_bar.h
@@ -41,9 +41,6 @@ class LocationBar {
// Accepts the current string of text entered in the location bar.
virtual void AcceptInput() = 0;
- // Accepts the current input, overriding the disposition.
- virtual void AcceptInputWithDisposition(WindowOpenDisposition) = 0;
-
// Focuses the location bar. Optionally also selects its contents.
virtual void FocusLocation(bool select_all) = 0;
diff --git a/chrome/browser/theme_resources_util_unittest.cc b/chrome/browser/theme_resources_util_unittest.cc
index 6153e75..84e9395 100644
--- a/chrome/browser/theme_resources_util_unittest.cc
+++ b/chrome/browser/theme_resources_util_unittest.cc
@@ -19,7 +19,7 @@ struct TestCase {
TEST(ThemeResourcesUtil, SpotCheckIds) {
const TestCase kTestCases[] = {
{"back", IDR_BACK},
- {"go", IDR_GO},
+ {"stop", IDR_STOP},
{"omnibox_star", IDR_OMNIBOX_STAR},
{"sad_tab", IDR_SAD_TAB},
};
diff --git a/chrome/browser/view_ids.h b/chrome/browser/view_ids.h
index 8e788dd..0ce057b 100644
--- a/chrome/browser/view_ids.h
+++ b/chrome/browser/view_ids.h
@@ -39,7 +39,6 @@ enum ViewID {
VIEW_ID_HOME_BUTTON,
VIEW_ID_STAR_BUTTON,
VIEW_ID_LOCATION_BAR,
- VIEW_ID_GO_BUTTON,
VIEW_ID_PAGE_MENU,
VIEW_ID_APP_MENU,
VIEW_ID_AUTOCOMPLETE,
diff --git a/chrome/browser/views/browser_views_accessibility_browsertest.cc b/chrome/browser/views/browser_views_accessibility_browsertest.cc
index 000bc0f..bebb693 100644
--- a/chrome/browser/views/browser_views_accessibility_browsertest.cc
+++ b/chrome/browser/views/browser_views_accessibility_browsertest.cc
@@ -241,14 +241,6 @@ IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest,
ROLE_SYSTEM_GROUPING);
}
-// Retrieve accessibility object for Go button and verify accessibility info.
-IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, TestGoButtonAccObj) {
- // Verify Go button MSAA name and role.
- TestViewAccessibilityObject(GetToolbarView()->GetViewByID(VIEW_ID_GO_BUTTON),
- l10n_util::GetString(IDS_ACCNAME_GO),
- ROLE_SYSTEM_PUSHBUTTON);
-}
-
// Retrieve accessibility object for Page menu button and verify accessibility
// info.
IN_PROC_BROWSER_TEST_F(BrowserViewsAccessibilityTest, TestPageMenuAccObj) {
diff --git a/chrome/browser/views/frame/browser_view.cc b/chrome/browser/views/frame/browser_view.cc
index 7bc300f..b6d5c94 100644
--- a/chrome/browser/views/frame/browser_view.cc
+++ b/chrome/browser/views/frame/browser_view.cc
@@ -858,9 +858,9 @@ void BrowserView::SetFocusToLocationBar(bool select_all) {
}
}
-void BrowserView::UpdateStopGoState(bool is_loading, bool force) {
- toolbar_->go_button()->ChangeMode(
- is_loading ? GoButton::MODE_STOP : GoButton::MODE_GO, force);
+void BrowserView::UpdateReloadStopState(bool is_loading, bool force) {
+ toolbar_->reload_button()->ChangeMode(
+ is_loading ? ReloadButton::MODE_STOP : ReloadButton::MODE_RELOAD, force);
}
void BrowserView::UpdateToolbar(TabContents* contents,
diff --git a/chrome/browser/views/frame/browser_view.h b/chrome/browser/views/frame/browser_view.h
index a4cdd57..6c6c4b4 100644
--- a/chrome/browser/views/frame/browser_view.h
+++ b/chrome/browser/views/frame/browser_view.h
@@ -283,7 +283,7 @@ class BrowserView : public BrowserBubbleHost,
virtual bool IsFullscreen() const;
virtual LocationBar* GetLocationBar() const;
virtual void SetFocusToLocationBar(bool select_all);
- virtual void UpdateStopGoState(bool is_loading, bool force);
+ virtual void UpdateReloadStopState(bool is_loading, bool force);
virtual void UpdateToolbar(TabContents* contents, bool should_restore_state);
virtual void FocusToolbar();
virtual void FocusPageAndAppMenus();
diff --git a/chrome/browser/views/go_button.cc b/chrome/browser/views/go_button.cc
deleted file mode 100644
index 80d993b..0000000
--- a/chrome/browser/views/go_button.cc
+++ /dev/null
@@ -1,135 +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/go_button.h"
-
-#include "app/l10n_util.h"
-#include "base/compiler_specific.h"
-#include "base/i18n/rtl.h"
-#include "base/message_loop.h"
-#include "chrome/app/chrome_dll_resource.h"
-#include "chrome/browser/browser.h"
-#include "chrome/browser/profile.h"
-#include "chrome/browser/search_engines/template_url_model.h"
-#include "chrome/browser/views/event_utils.h"
-#include "chrome/browser/views/location_bar/location_bar_view.h"
-#include "grit/generated_resources.h"
-
-////////////////////////////////////////////////////////////////////////////////
-// GoButton, public:
-
-GoButton::GoButton(LocationBarView* location_bar, Browser* browser)
- : ToggleImageButton(this),
- ALLOW_THIS_IN_INITIALIZER_LIST(stop_timer_(this)),
- location_bar_(location_bar),
- browser_(browser),
- intended_mode_(MODE_GO),
- visible_mode_(MODE_GO) {
- DCHECK(location_bar_);
- set_triggerable_event_flags(views::Event::EF_LEFT_BUTTON_DOWN |
- views::Event::EF_MIDDLE_BUTTON_DOWN);
-}
-
-GoButton::~GoButton() {
- stop_timer_.RevokeAll();
-}
-
-void GoButton::ChangeMode(Mode mode, bool force) {
- intended_mode_ = mode;
-
- // If the change is forced, or the user isn't hovering the icon, or it's safe
- // to change it to the other image type, make the change immediately;
- // otherwise we'll let it happen later.
- if (force || (state() != BS_HOT) || ((mode == MODE_STOP) ?
- stop_timer_.empty() : (visible_mode_ != MODE_STOP))) {
- stop_timer_.RevokeAll();
- SetToggled(mode == MODE_STOP);
- visible_mode_ = mode;
- }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// GoButton, views::ButtonListener implementation:
-
-void GoButton::ButtonPressed(views::Button* button, const views::Event& event) {
- if (visible_mode_ == MODE_STOP) {
- browser_->Stop();
-
- // The user has clicked, so we can feel free to update the button,
- // even if the mouse is still hovering.
- ChangeMode(MODE_GO, true);
- } else if (visible_mode_ == MODE_GO && stop_timer_.empty()) {
- // If the go button is visible and not within the double click timer, go.
- browser_->Go(event_utils::DispositionFromEventFlags(mouse_event_flags()));
-
- // Stop any existing timers.
- stop_timer_.RevokeAll();
-
- // Start a timer - while this timer is running, the go button
- // cannot be changed to a stop button. We do not set intended_mode_
- // to MODE_STOP here as we want to wait for the browser to tell
- // us that it has started loading (and this may occur only after
- // some delay).
- MessageLoop::current()->PostDelayedTask(FROM_HERE,
- stop_timer_.NewRunnableMethod(&GoButton::OnButtonTimer),
- GetDoubleClickTimeMS());
- }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// GoButton, View overrides:
-
-void GoButton::OnMouseExited(const views::MouseEvent& e) {
- ChangeMode(intended_mode_, true);
- if (state() != BS_DISABLED)
- SetState(BS_NORMAL);
-}
-
-bool GoButton::GetTooltipText(const gfx::Point& p, std::wstring* tooltip) {
- if (visible_mode_ == MODE_STOP) {
- tooltip->assign(l10n_util::GetString(IDS_TOOLTIP_STOP));
- return true;
- }
-
- std::wstring current_text(location_bar_->location_entry()->GetText());
- if (current_text.empty())
- return false;
-
- // Need to make sure the text direction is adjusted based on the locale so
- // that pure LTR strings are displayed appropriately on RTL locales. For
- // example, not adjusting the string will cause the URL
- // "http://www.google.com/" to be displayed in the tooltip as
- // "/http://www.google.com".
- //
- // Note that we mark the URL's text as LTR (instead of examining the
- // characters and guessing the text directionality) since URLs are always
- // treated as left-to-right text, even when they contain RTL characters.
- base::i18n::GetDisplayStringInLTRDirectionality(&current_text);
-
- AutocompleteEditModel* edit_model = location_bar_->location_entry()->model();
- if (edit_model->CurrentTextIsURL()) {
- tooltip->assign(l10n_util::GetStringF(IDS_TOOLTIP_GO_SITE, current_text));
- } else {
- std::wstring keyword(edit_model->keyword());
- TemplateURLModel* template_url_model =
- location_bar_->profile()->GetTemplateURLModel();
- const TemplateURL* provider =
- (keyword.empty() || edit_model->is_keyword_hint()) ?
- template_url_model->GetDefaultSearchProvider() :
- template_url_model->GetTemplateURLForKeyword(keyword);
- if (!provider)
- return false;
- tooltip->assign(l10n_util::GetStringF(IDS_TOOLTIP_GO_SEARCH,
- provider->AdjustedShortNameForLocaleDirection(), current_text));
- }
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// GoButton, private:
-
-void GoButton::OnButtonTimer() {
- stop_timer_.RevokeAll();
- ChangeMode(intended_mode_, true);
-}
diff --git a/chrome/browser/views/location_bar/location_bar_view.cc b/chrome/browser/views/location_bar/location_bar_view.cc
index 828ce02..59dab7e 100644
--- a/chrome/browser/views/location_bar/location_bar_view.cc
+++ b/chrome/browser/views/location_bar/location_bar_view.cc
@@ -892,10 +892,6 @@ 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)
diff --git a/chrome/browser/views/location_bar/location_bar_view.h b/chrome/browser/views/location_bar/location_bar_view.h
index 51fa80e..1e40e63 100644
--- a/chrome/browser/views/location_bar/location_bar_view.h
+++ b/chrome/browser/views/location_bar/location_bar_view.h
@@ -184,7 +184,6 @@ class LocationBarView : public LocationBar,
virtual WindowOpenDisposition GetWindowOpenDisposition() const;
virtual PageTransition::Type GetPageTransition() const;
virtual void AcceptInput();
- virtual void AcceptInputWithDisposition(WindowOpenDisposition);
virtual void FocusLocation(bool select_all);
virtual void FocusSearch();
virtual void UpdateContentSettingsIcons();
diff --git a/chrome/browser/views/reload_button.cc b/chrome/browser/views/reload_button.cc
new file mode 100644
index 0000000..5ebd9bd
--- /dev/null
+++ b/chrome/browser/views/reload_button.cc
@@ -0,0 +1,112 @@
+// 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/reload_button.h"
+
+#include "app/l10n_util.h"
+#include "chrome/app/chrome_dll_resource.h"
+#include "chrome/browser/browser.h"
+#include "chrome/browser/views/event_utils.h"
+#include "chrome/browser/views/location_bar/location_bar_view.h"
+#include "grit/generated_resources.h"
+
+////////////////////////////////////////////////////////////////////////////////
+// ReloadButton, public:
+
+ReloadButton::ReloadButton(LocationBarView* location_bar, Browser* browser)
+ : ALLOW_THIS_IN_INITIALIZER_LIST(ToggleImageButton(this)),
+ location_bar_(location_bar),
+ browser_(browser),
+ intended_mode_(MODE_RELOAD),
+ visible_mode_(MODE_RELOAD) {
+ DCHECK(location_bar_);
+}
+
+ReloadButton::~ReloadButton() {
+}
+
+void ReloadButton::ChangeMode(Mode mode, bool force) {
+ intended_mode_ = mode;
+
+ // If the change is forced, or the user isn't hovering the icon, or it's safe
+ // to change it to the other image type, make the change immediately;
+ // otherwise we'll let it happen later.
+ if (force || (state() != BS_HOT) || ((mode == MODE_STOP) ?
+ !timer_.IsRunning() : (visible_mode_ != MODE_STOP))) {
+ timer_.Stop();
+ SetToggled(mode == MODE_STOP);
+ visible_mode_ = mode;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// ReloadButton, views::ButtonListener implementation:
+
+void ReloadButton::ButtonPressed(views::Button* button,
+ const views::Event& event) {
+ if (visible_mode_ == MODE_STOP) {
+ browser_->Stop();
+ // The user has clicked, so we can feel free to update the button,
+ // even if the mouse is still hovering.
+ ChangeMode(MODE_RELOAD, true);
+ } else if (!timer_.IsRunning()) {
+ // Shift-clicking or ctrl-clicking the reload button means we should ignore
+ // any cached content.
+ // TODO(avayvod): eliminate duplication of this logic in
+ // CompactLocationBarView.
+ int command;
+ int flags = mouse_event_flags();
+ if (event.IsShiftDown() || event.IsControlDown()) {
+ command = IDC_RELOAD_IGNORING_CACHE;
+ // Mask off shift/ctrl so they aren't interpreted as affecting the
+ // disposition below.
+ flags &= ~(views::Event::EF_SHIFT_DOWN | views::Event::EF_CONTROL_DOWN);
+ } else {
+ command = IDC_RELOAD;
+ }
+
+ WindowOpenDisposition disposition =
+ event_utils::DispositionFromEventFlags(flags);
+ if (disposition == CURRENT_TAB) {
+ // Forcibly reset the location bar, since otherwise it won't discard any
+ // ongoing user edits, since it doesn't realize this is a user-initiated
+ // action.
+ location_bar_->Revert();
+ }
+
+ browser_->ExecuteCommandWithDisposition(command, disposition);
+
+ // Stop the timer.
+ timer_.Stop();
+
+ // Start a timer - while this timer is running, the reload button cannot be
+ // changed to a stop button. We do not set |intended_mode_| to MODE_STOP
+ // here as we want to wait for the browser to tell us that it has started
+ // loading (and this may occur only after some delay).
+ timer_.Start(base::TimeDelta::FromMilliseconds(GetDoubleClickTimeMS()),
+ this, &ReloadButton::OnButtonTimer);
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// ReloadButton, View overrides:
+
+void ReloadButton::OnMouseExited(const views::MouseEvent& e) {
+ ChangeMode(intended_mode_, true);
+ if (state() != BS_DISABLED)
+ SetState(BS_NORMAL);
+}
+
+bool ReloadButton::GetTooltipText(const gfx::Point& p, std::wstring* tooltip) {
+ tooltip->assign(l10n_util::GetString((visible_mode_ == MODE_RELOAD) ?
+ IDS_TOOLTIP_RELOAD : IDS_TOOLTIP_STOP));
+ return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// ReloadButton, private:
+
+void ReloadButton::OnButtonTimer() {
+ ChangeMode(intended_mode_, true);
+}
diff --git a/chrome/browser/views/go_button.h b/chrome/browser/views/reload_button.h
index 8855b5a..20991f9 100644
--- a/chrome/browser/views/go_button.h
+++ b/chrome/browser/views/reload_button.h
@@ -2,11 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef CHROME_BROWSER_VIEWS_GO_BUTTON_H__
-#define CHROME_BROWSER_VIEWS_GO_BUTTON_H__
+#ifndef CHROME_BROWSER_VIEWS_RELOAD_BUTTON_H__
+#define CHROME_BROWSER_VIEWS_RELOAD_BUTTON_H__
#include "base/basictypes.h"
-#include "base/task.h"
+#include "base/timer.h"
#include "views/controls/button/image_button.h"
class Browser;
@@ -14,23 +14,22 @@ class LocationBarView;
////////////////////////////////////////////////////////////////////////////////
//
-// GoButton
+// ReloadButton
//
-// The go button attached to the toolbar. It shows different tooltips
-// according to the content of the location bar and changes to a stop
-// button when a page load is in progress. Trickiness comes from the
-// desire to have the 'stop' button not change back to 'go' if the user's
-// mouse is hovering over it (to prevent mis-clicks).
+// The reload button in the toolbar, which changes to a stop button when a page
+// load is in progress. Trickiness comes from the desire to have the 'stop'
+// button not change back to 'reload' if the user's mouse is hovering over it
+// (to prevent mis-clicks).
//
////////////////////////////////////////////////////////////////////////////////
-class GoButton : public views::ToggleImageButton,
- public views::ButtonListener {
+class ReloadButton : public views::ToggleImageButton,
+ public views::ButtonListener {
public:
- enum Mode { MODE_GO = 0, MODE_STOP };
+ enum Mode { MODE_RELOAD = 0, MODE_STOP };
- GoButton(LocationBarView* location_bar, Browser* Browser);
- virtual ~GoButton();
+ ReloadButton(LocationBarView* location_bar, Browser* Browser);
+ virtual ~ReloadButton();
// Ask for a specified button state. If |force| is true this will be applied
// immediately.
@@ -46,7 +45,7 @@ class GoButton : public views::ToggleImageButton,
private:
void OnButtonTimer();
- ScopedRunnableMethodFactory<GoButton> stop_timer_;
+ base::OneShotTimer<ReloadButton> timer_;
LocationBarView* location_bar_;
Browser* browser_;
@@ -57,7 +56,7 @@ class GoButton : public views::ToggleImageButton,
// The currently-visible mode - this may different from the intended mode
Mode visible_mode_;
- DISALLOW_COPY_AND_ASSIGN(GoButton);
+ DISALLOW_IMPLICIT_CONSTRUCTORS(ReloadButton);
};
-#endif // CHROME_BROWSER_VIEWS_GO_BUTTON_H__
+#endif // CHROME_BROWSER_VIEWS_RELOAD_BUTTON_H__
diff --git a/chrome/browser/views/toolbar_view.cc b/chrome/browser/views/toolbar_view.cc
index ad6fd6a..2db68f8 100644
--- a/chrome/browser/views/toolbar_view.cc
+++ b/chrome/browser/views/toolbar_view.cc
@@ -74,7 +74,6 @@ ToolbarView::ToolbarView(Browser* browser)
home_(NULL),
reload_(NULL),
location_bar_(NULL),
- go_(NULL),
browser_actions_(NULL),
page_menu_(NULL),
app_menu_(NULL),
@@ -92,7 +91,6 @@ ToolbarView::ToolbarView(Browser* browser)
browser_->command_updater()->AddCommandObserver(IDC_BACK, this);
browser_->command_updater()->AddCommandObserver(IDC_FORWARD, this);
browser_->command_updater()->AddCommandObserver(IDC_HOME, this);
- browser_->command_updater()->AddCommandObserver(IDC_RELOAD, this);
display_mode_ = browser->SupportsWindowFeature(Browser::FEATURE_TABSTRIP) ?
DISPLAYMODE_NORMAL : DISPLAYMODE_LOCATION;
@@ -154,7 +152,13 @@ void ToolbarView::Init(Profile* profile) {
home_->SetAccessibleName(l10n_util::GetString(IDS_ACCNAME_HOME));
home_->SetID(VIEW_ID_HOME_BUTTON);
- reload_ = new views::ImageButton(this);
+ // Have to create this before |reload_| as |reload_|'s constructor needs it.
+ location_bar_ = new LocationBarView(profile, browser_->command_updater(),
+ model_, this, (display_mode_ == DISPLAYMODE_LOCATION) ?
+ LocationBarView::POPUP : LocationBarView::NORMAL);
+ location_bar_->SetAccessibleName(l10n_util::GetString(IDS_ACCNAME_LOCATION));
+
+ reload_ = new ReloadButton(location_bar_, browser_);
reload_->set_triggerable_event_flags(views::Event::EF_LEFT_BUTTON_DOWN |
views::Event::EF_MIDDLE_BUTTON_DOWN);
reload_->set_tag(IDC_RELOAD);
@@ -162,15 +166,6 @@ void ToolbarView::Init(Profile* profile) {
reload_->SetAccessibleName(l10n_util::GetString(IDS_ACCNAME_RELOAD));
reload_->SetID(VIEW_ID_RELOAD_BUTTON);
- location_bar_ = new LocationBarView(profile, browser_->command_updater(),
- model_, this, (display_mode_ == DISPLAYMODE_LOCATION) ?
- LocationBarView::POPUP : LocationBarView::NORMAL);
- location_bar_->SetAccessibleName(l10n_util::GetString(IDS_ACCNAME_LOCATION));
-
- go_ = new GoButton(location_bar_, browser_);
- go_->SetAccessibleName(l10n_util::GetString(IDS_ACCNAME_GO));
- go_->SetID(VIEW_ID_GO_BUTTON);
-
browser_actions_ = new BrowserActionsContainer(browser_, this, true);
bool use_wrench_menu =
@@ -203,7 +198,6 @@ void ToolbarView::Init(Profile* profile) {
AddChildView(home_);
AddChildView(reload_);
AddChildView(location_bar_);
- AddChildView(go_);
AddChildView(browser_actions_);
AddChildView(app_menu_);
@@ -403,9 +397,6 @@ void ToolbarView::EnabledStateChangedForCommand(int id, bool enabled) {
case IDC_HOME:
button = home_;
break;
- case IDC_RELOAD:
- button = reload_;
- break;
}
if (button)
button->SetEnabled(enabled);
@@ -417,31 +408,14 @@ void ToolbarView::EnabledStateChangedForCommand(int id, bool enabled) {
void ToolbarView::ButtonPressed(views::Button* sender,
const views::Event& event) {
int command = sender->tag();
- int flags = sender->mouse_event_flags();
- // Shift-clicking or Ctrl-clicking the reload button means we should ignore
- // any cached content.
- // TODO(avayvod): eliminate duplication of this logic in
- // CompactLocationBarView.
- if ((command == IDC_RELOAD) &&
- (event.IsShiftDown() || event.IsControlDown())) {
- command = IDC_RELOAD_IGNORING_CACHE;
- // Mask off shift/ctrl so they aren't interpreted as affecting the
- // disposition below.
- flags &= ~(views::Event::EF_SHIFT_DOWN | views::Event::EF_CONTROL_DOWN);
- }
WindowOpenDisposition disposition =
- event_utils::DispositionFromEventFlags(flags);
- switch (command) {
- case IDC_BACK:
- case IDC_FORWARD:
- case IDC_RELOAD:
- case IDC_RELOAD_IGNORING_CACHE:
- if (disposition == CURRENT_TAB) {
- // Forcibly reset the location bar, since otherwise it won't discard any
- // ongoing user edits, since it doesn't realize this is a user-initiated
- // action.
- location_bar_->Revert();
- }
+ event_utils::DispositionFromEventFlags(sender->mouse_event_flags());
+ if ((disposition == CURRENT_TAB) &&
+ ((command == IDC_BACK) || (command == IDC_FORWARD))) {
+ // Forcibly reset the location bar, since otherwise it won't discard any
+ // ongoing user edits, since it doesn't realize this is a user-initiated
+ // action.
+ location_bar_->Revert();
}
browser_->ExecuteCommandWithDisposition(command, disposition);
}
@@ -544,9 +518,8 @@ gfx::Size ToolbarView::GetPreferredSize() {
forward_->GetPreferredSize().width() + kControlHorizOffset +
(show_home_button_.GetValue() ?
(home_->GetPreferredSize().width() + kControlHorizOffset) : 0) +
- reload_->GetPreferredSize().width() +
+ reload_->GetPreferredSize().width() + kControlHorizOffset +
browser_actions_->GetPreferredSize().width() +
- go_->GetPreferredSize().width() +
kMenuButtonOffset +
(bookmark_menu_ ? bookmark_menu_->GetPreferredSize().width() : 0) +
(page_menu_ ? page_menu_->GetPreferredSize().width() : 0) +
@@ -620,24 +593,21 @@ void ToolbarView::Layout() {
reload_->SetBounds(home_->x() + home_->width() + kControlHorizOffset, child_y,
reload_->GetPreferredSize().width(), child_height);
- int go_button_width = go_->GetPreferredSize().width();
int browser_actions_width = browser_actions_->GetPreferredSize().width();
int page_menu_width =
page_menu_ ? page_menu_->GetPreferredSize().width() : 0;
int app_menu_width = app_menu_->GetPreferredSize().width();
int bookmark_menu_width = bookmark_menu_ ?
bookmark_menu_->GetPreferredSize().width() : 0;
- int location_x = reload_->x() + reload_->width();
+ int location_x = reload_->x() + reload_->width() + kControlHorizOffset;
int available_width = width() - kPaddingRight - bookmark_menu_width -
app_menu_width - page_menu_width - browser_actions_width -
- kMenuButtonOffset - go_button_width - location_x;
+ kMenuButtonOffset - location_x;
location_bar_->SetBounds(location_x, child_y, std::max(available_width, 0),
child_height);
-
- go_->SetBounds(location_bar_->x() + location_bar_->width(), child_y,
- go_button_width, child_height);
- int next_menu_x = go_->x() + go_->width() + kMenuButtonOffset;
+ int next_menu_x =
+ location_bar_->x() + location_bar_->width() + kMenuButtonOffset;
browser_actions_->SetBounds(next_menu_x, 0, browser_actions_width, height());
// The browser actions need to do a layout explicitly, because when an
@@ -737,20 +707,14 @@ void ToolbarView::LoadImages() {
tp->GetBitmapNamed(IDR_RELOAD_H));
reload_->SetImage(views::CustomButton::BS_PUSHED,
tp->GetBitmapNamed(IDR_RELOAD_P));
- reload_->SetBackground(color, background,
- tp->GetBitmapNamed(IDR_RELOAD_MASK));
-
- go_->SetImage(views::CustomButton::BS_NORMAL, tp->GetBitmapNamed(IDR_GO));
- go_->SetImage(views::CustomButton::BS_HOT, tp->GetBitmapNamed(IDR_GO_H));
- go_->SetImage(views::CustomButton::BS_PUSHED, tp->GetBitmapNamed(IDR_GO_P));
- go_->SetToggledImage(views::CustomButton::BS_NORMAL,
+ reload_->SetToggledImage(views::CustomButton::BS_NORMAL,
tp->GetBitmapNamed(IDR_STOP));
- go_->SetToggledImage(views::CustomButton::BS_HOT,
+ reload_->SetToggledImage(views::CustomButton::BS_HOT,
tp->GetBitmapNamed(IDR_STOP_H));
- go_->SetToggledImage(views::CustomButton::BS_PUSHED,
+ reload_->SetToggledImage(views::CustomButton::BS_PUSHED,
tp->GetBitmapNamed(IDR_STOP_P));
- go_->SetBackground(color, background,
- tp->GetBitmapNamed(IDR_GO_MASK));
+ reload_->SetBackground(color, background,
+ tp->GetBitmapNamed(IDR_BUTTON_MASK));
// We use different menu button images if the locale is right-to-left.
if (page_menu_) {
diff --git a/chrome/browser/views/toolbar_view.h b/chrome/browser/views/toolbar_view.h
index 60c985c..a99d658 100644
--- a/chrome/browser/views/toolbar_view.h
+++ b/chrome/browser/views/toolbar_view.h
@@ -16,8 +16,8 @@
#include "chrome/browser/page_menu_model.h"
#include "chrome/browser/pref_member.h"
#include "chrome/browser/views/accessible_toolbar_view.h"
-#include "chrome/browser/views/go_button.h"
#include "chrome/browser/views/location_bar/location_bar_view.h"
+#include "chrome/browser/views/reload_button.h"
#include "views/controls/button/menu_button.h"
#include "views/controls/menu/menu.h"
#include "views/controls/menu/menu_wrapper.h"
@@ -85,7 +85,7 @@ class ToolbarView : public AccessibleToolbarView,
// Accessors...
Browser* browser() const { return browser_; }
BrowserActionsContainer* browser_actions() const { return browser_actions_; }
- GoButton* go_button() const { return go_; }
+ ReloadButton* reload_button() const { return reload_; }
LocationBarView* location_bar() const { return location_bar_; }
views::MenuButton* page_menu() const { return page_menu_; }
views::MenuButton* app_menu() const { return app_menu_; }
@@ -194,9 +194,8 @@ class ToolbarView : public AccessibleToolbarView,
views::ImageButton* back_;
views::ImageButton* forward_;
views::ImageButton* home_;
- views::ImageButton* reload_;
+ ReloadButton* reload_;
LocationBarView* location_bar_;
- GoButton* go_;
BrowserActionsContainer* browser_actions_;
views::MenuButton* page_menu_;
views::MenuButton* app_menu_;