blob: 5a2fd586c7a59b1c4ee80ca3047c4b88b621b844 [file] [log] [blame]
// 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/strings/string_number_conversions.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_commands.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/tabs/tab_strip_model.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/host_zoom_map.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);
}
void OnZoomLevelChanged(const base::Closure& callback,
const content::HostZoomMap::ZoomLevelChange& host) {
callback.Run();
}
} // namespace
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 =
browser()->tab_strip_model()->GetActiveWebContents();
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 =
browser()->tab_strip_model()->GetActiveWebContents();
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 =
browser()->tab_strip_model()->GetActiveWebContents();
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) {
scoped_refptr<content::MessageLoopRunner> loop_runner(
new content::MessageLoopRunner);
content::HostZoomMap::ZoomLevelChangedCallback callback(
base::Bind(&OnZoomLevelChanged, loop_runner->QuitClosure()));
content::HostZoomMap::GetForBrowserContext(
browser()->profile())->AddZoomLevelChangedCallback(callback);
chrome::Zoom(browser(), zoom_action);
loop_runner->Run();
content::HostZoomMap::GetForBrowserContext(
browser()->profile())->RemoveZoomLevelChangedCallback(callback);
}
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());
}