diff options
Diffstat (limited to 'chrome/browser')
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(¤t_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(¤t_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_; |