diff options
-rw-r--r-- | build/filename_rules.gypi | 2 | ||||
-rw-r--r-- | chrome/browser/ui/gtk/location_bar_view_gtk.cc | 3 | ||||
-rw-r--r-- | chrome/browser/ui/gtk/location_bar_view_gtk_browsertest.cc | 172 | ||||
-rw-r--r-- | chrome/browser/ui/gtk/view_id_util.cc | 3 | ||||
-rw-r--r-- | chrome/browser/ui/view_ids.h | 6 | ||||
-rw-r--r-- | chrome/browser/ui/views/location_bar/location_bar_view.cc | 1 | ||||
-rw-r--r-- | chrome/chrome_tests.gypi | 10 |
7 files changed, 187 insertions, 10 deletions
diff --git a/build/filename_rules.gypi b/build/filename_rules.gypi index ea63afe..500a0d8 100644 --- a/build/filename_rules.gypi +++ b/build/filename_rules.gypi @@ -68,7 +68,7 @@ }], ['<(toolkit_uses_gtk)!=1 or >(nacl_untrusted_build)==1', { 'sources/': [ - ['exclude', '_gtk(_unittest)?\\.(h|cc)$'], + ['exclude', '_gtk(_browsertest|_unittest)?\\.(h|cc)$'], ['exclude', '(^|/)gtk/'], ['exclude', '(^|/)gtk_[^/]*\\.(h|cc)$'], ], diff --git a/chrome/browser/ui/gtk/location_bar_view_gtk.cc b/chrome/browser/ui/gtk/location_bar_view_gtk.cc index b920170..68bdedd 100644 --- a/chrome/browser/ui/gtk/location_bar_view_gtk.cc +++ b/chrome/browser/ui/gtk/location_bar_view_gtk.cc @@ -837,10 +837,9 @@ GtkWidget* LocationBarViewGtk::CreateIconButton( } void LocationBarViewGtk::CreateZoomButton() { - // TODO(khorimoto): Add tests for zoom button. zoom_.Own(CreateIconButton(&zoom_image_, 0, - VIEW_ID_NONE, + VIEW_ID_ZOOM_BUTTON, 0, OnZoomButtonPressThunk)); } diff --git a/chrome/browser/ui/gtk/location_bar_view_gtk_browsertest.cc b/chrome/browser/ui/gtk/location_bar_view_gtk_browsertest.cc new file mode 100644 index 0000000..19226fe --- /dev/null +++ b/chrome/browser/ui/gtk/location_bar_view_gtk_browsertest.cc @@ -0,0 +1,172 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <gtk/gtk.h> + +#include "base/string_number_conversions.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/browser_commands.h" +#include "chrome/browser/ui/browser_tabstrip.h" +#include "chrome/browser/ui/browser_window.h" +#include "chrome/browser/ui/gtk/browser_toolbar_gtk.h" +#include "chrome/browser/ui/gtk/browser_window_gtk.h" +#include "chrome/browser/ui/gtk/location_bar_view_gtk.h" +#include "chrome/browser/ui/gtk/view_id_util.h" +#include "chrome/browser/ui/zoom/zoom_controller.h" +#include "chrome/test/base/in_process_browser_test.h" +#include "chrome/test/base/ui_test_utils.h" +#include "content/public/browser/notification_service.h" +#include "content/public/browser/notification_types.h" +#include "content/public/browser/web_contents.h" +#include "content/public/common/page_zoom.h" +#include "grit/theme_resources.h" +#include "testing/gtest/include/gtest/gtest.h" + +// TODO(dbeam): share some testing code with ZoomBubbleGtkTest. + +namespace { + +int GetZoomPercent(content::WebContents* contents) { + bool dummy; + return contents->GetZoomPercent(&dummy, &dummy); +} + +void ExpectZoomedIn(content::WebContents* contents) { + EXPECT_GT(GetZoomPercent(contents), 100); +} + +void ExpectZoomedOut(content::WebContents* contents) { + EXPECT_LT(GetZoomPercent(contents), 100); +} + +void ExpectAtDefaultZoom(content::WebContents* contents) { + EXPECT_EQ(GetZoomPercent(contents), 100); +} + +} + +class LocationBarViewGtkZoomTest : public InProcessBrowserTest { + public: + LocationBarViewGtkZoomTest() {} + virtual ~LocationBarViewGtkZoomTest() {} + + protected: + void ExpectTooltipContainsZoom() { + gchar* text = gtk_widget_get_tooltip_text(GetZoomWidget()); + std::string tooltip(text); + g_free(text); + content::WebContents* contents = chrome::GetActiveWebContents(browser()); + std::string zoom_percent = base::IntToString(GetZoomPercent(contents)); + EXPECT_FALSE(tooltip.find(zoom_percent) == std::string::npos); + } + + bool ZoomIconIsShowing() { + return gtk_widget_get_visible(GetZoomWidget()); + } + + void ExpectIconIsResource(int resource_id) { + // TODO(dbeam): actually compare the image bits with gfx::test::IsEqual? + content::WebContents* contents = chrome::GetActiveWebContents(browser()); + ZoomController* zoom_controller = ZoomController::FromWebContents(contents); + EXPECT_EQ(resource_id, zoom_controller->GetResourceForZoomLevel()); + } + + void ResetZoom() { + WaitForZoom(content::PAGE_ZOOM_RESET); + } + + content::WebContents* SetUpTest() { + content::WebContents* contents = chrome::GetActiveWebContents(browser()); + ResetZoom(); + ExpectAtDefaultZoom(contents); + return contents; + } + + void ZoomIn() { + WaitForZoom(content::PAGE_ZOOM_IN); + } + + void ZoomOut() { + WaitForZoom(content::PAGE_ZOOM_OUT); + } + + private: + GtkWidget* GetZoomWidget() { + gfx::NativeWindow window = browser()->window()->GetNativeWindow(); + return ViewIDUtil::GetWidget(GTK_WIDGET(window), VIEW_ID_ZOOM_BUTTON); + } + + void WaitForZoom(content::PageZoom zoom_action) { + content::WindowedNotificationObserver zoom_observer( + content::NOTIFICATION_ZOOM_LEVEL_CHANGED, + content::NotificationService::AllSources()); + chrome::Zoom(browser(), zoom_action); + zoom_observer.Wait(); + } + + DISALLOW_COPY_AND_ASSIGN(LocationBarViewGtkZoomTest); +}; + +IN_PROC_BROWSER_TEST_F(LocationBarViewGtkZoomTest, DefaultToZoomedInAndBack) { + content::WebContents* contents = SetUpTest(); + + ZoomIn(); + ExpectZoomedIn(contents); + EXPECT_TRUE(ZoomIconIsShowing()); + ExpectIconIsResource(IDR_ZOOM_PLUS); + ExpectTooltipContainsZoom(); + + ZoomOut(); // Back to default, in theory. + ExpectAtDefaultZoom(contents); + EXPECT_FALSE(ZoomIconIsShowing()); +} + +IN_PROC_BROWSER_TEST_F(LocationBarViewGtkZoomTest, ZoomInTwiceAndReset) { + content::WebContents* contents = SetUpTest(); + + ZoomIn(); + int zoom_level = GetZoomPercent(contents); + ZoomIn(); + DCHECK_GT(GetZoomPercent(contents), zoom_level); + + ExpectZoomedIn(contents); + EXPECT_TRUE(ZoomIconIsShowing()); + ExpectIconIsResource(IDR_ZOOM_PLUS); + ExpectTooltipContainsZoom(); + + ResetZoom(); + ExpectAtDefaultZoom(contents); + EXPECT_FALSE(ZoomIconIsShowing()); +} + +IN_PROC_BROWSER_TEST_F(LocationBarViewGtkZoomTest, DefaultToZoomedOutAndBack) { + content::WebContents* contents = SetUpTest(); + + ZoomOut(); + ExpectZoomedOut(contents); + EXPECT_TRUE(ZoomIconIsShowing()); + ExpectIconIsResource(IDR_ZOOM_MINUS); + ExpectTooltipContainsZoom(); + + ZoomIn(); + ExpectAtDefaultZoom(contents); + EXPECT_FALSE(ZoomIconIsShowing()); +} + +IN_PROC_BROWSER_TEST_F(LocationBarViewGtkZoomTest, ZoomOutTwiceAndReset) { + content::WebContents* contents = SetUpTest(); + + ZoomOut(); + int zoom_level = GetZoomPercent(contents); + ZoomOut(); + DCHECK_LT(GetZoomPercent(contents), zoom_level); + ExpectZoomedOut(contents); + EXPECT_TRUE(ZoomIconIsShowing()); + ExpectIconIsResource(IDR_ZOOM_MINUS); + ExpectTooltipContainsZoom(); + + ResetZoom(); + ExpectAtDefaultZoom(contents); + EXPECT_FALSE(ZoomIconIsShowing()); +} diff --git a/chrome/browser/ui/gtk/view_id_util.cc b/chrome/browser/ui/gtk/view_id_util.cc index c9aa121..e73f298 100644 --- a/chrome/browser/ui/gtk/view_id_util.cc +++ b/chrome/browser/ui/gtk/view_id_util.cc @@ -110,6 +110,9 @@ const char* GetNameFromID(ViewID id) { case VIEW_ID_DEV_TOOLS_DOCKED: return "chrome-dev-tools-docked"; + case VIEW_ID_ZOOM_BUTTON: + return "chrome-zoom-button"; + // These are never hit because the tab container uses the delegate to // set its ID. case VIEW_ID_TAB_CONTAINER: diff --git a/chrome/browser/ui/view_ids.h b/chrome/browser/ui/view_ids.h index 784e1ac..b159015 100644 --- a/chrome/browser/ui/view_ids.h +++ b/chrome/browser/ui/view_ids.h @@ -71,6 +71,12 @@ enum ViewID { // The Download shelf. VIEW_ID_DOWNLOAD_SHELF, +// TODO(dbeam): change the zoom decoration to an NSImageView on Mac so IDs work. +#if !defined(OS_MACOSX) + // Zoom button in location bar. + VIEW_ID_ZOOM_BUTTON, +#endif + // Used in chrome/browser/ui/gtk/view_id_util_browsertests.cc // If you add new ids, make sure the above test passes. VIEW_ID_PREDEFINED_COUNT, diff --git a/chrome/browser/ui/views/location_bar/location_bar_view.cc b/chrome/browser/ui/views/location_bar/location_bar_view.cc index e1145c2..730475d 100644 --- a/chrome/browser/ui/views/location_bar/location_bar_view.cc +++ b/chrome/browser/ui/views/location_bar/location_bar_view.cc @@ -309,6 +309,7 @@ void LocationBarView::Init(views::View* popup_parent_view) { } zoom_view_ = new ZoomView(model_, delegate_); + zoom_view_->set_id(VIEW_ID_ZOOM_BUTTON); AddChildView(zoom_view_); web_intents_button_view_ = diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi index 8f8d9ac..57d997e 100644 --- a/chrome/chrome_tests.gypi +++ b/chrome/chrome_tests.gypi @@ -3051,6 +3051,9 @@ 'browser/ui/find_bar/find_bar_host_browsertest.cc', 'browser/ui/fullscreen/fullscreen_controller_browsertest.cc', 'browser/ui/global_error/global_error_service_browsertest.cc', + 'browser/ui/gtk/bubble/bubble_gtk_browsertest.cc', + 'browser/ui/gtk/confirm_bubble_gtk_browsertest.cc', + 'browser/ui/gtk/location_bar_view_gtk_browsertest.cc', 'browser/ui/gtk/one_click_signin_bubble_gtk_browsertest.cc', 'browser/ui/gtk/view_id_util_browsertest.cc', 'browser/ui/intents/web_intent_picker_controller_browsertest.cc', @@ -3368,13 +3371,6 @@ '../build/linux/system.gyp:ssl', ], }], - ['toolkit_uses_gtk == 1 and toolkit_views == 0', { - 'sources': [ - # BubbleGtk is used only on Linux/GTK. - 'browser/ui/gtk/bubble/bubble_gtk_browsertest.cc', - 'browser/ui/gtk/confirm_bubble_gtk_browsertest.cc', - ], - }], ['OS=="mac"', { 'include_dirs': [ '../third_party/GTM', |