1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/message_loop/message_loop.h"
6#include "base/prefs/pref_service.h"
7#include "chrome/browser/ui/browser.h"
8#include "chrome/browser/ui/browser_finder.h"
9#include "chrome/browser/ui/zoom/zoom_controller.h"
10#include "chrome/browser/ui/zoom/zoom_observer.h"
11#include "chrome/common/pref_names.h"
12#include "chrome/test/base/chrome_render_view_host_test_harness.h"
13#include "chrome/test/base/testing_profile.h"
14#include "content/public/browser/host_zoom_map.h"
15#include "content/public/browser/navigation_details.h"
16#include "content/public/common/frame_navigate_params.h"
17#include "content/public/test/test_renderer_host.h"
18#include "content/public/test/test_utils.h"
19#include "testing/gmock/include/gmock/gmock.h"
20#include "testing/gtest/include/gtest/gtest.h"
21
22bool operator==(const ZoomController::ZoomChangedEventData& lhs,
23                const ZoomController::ZoomChangedEventData& rhs) {
24  return lhs.web_contents == rhs.web_contents &&
25         lhs.old_zoom_level == rhs.old_zoom_level &&
26         lhs.new_zoom_level == rhs.new_zoom_level &&
27         lhs.zoom_mode == rhs.zoom_mode &&
28         lhs.can_show_bubble == rhs.can_show_bubble;
29}
30
31class TestZoomObserver : public ZoomObserver {
32 public:
33  MOCK_METHOD1(OnZoomChanged,
34               void(const ZoomController::ZoomChangedEventData&));
35};
36
37class ZoomControllerTest : public ChromeRenderViewHostTestHarness {
38 public:
39  virtual void SetUp() OVERRIDE {
40    ChromeRenderViewHostTestHarness::SetUp();
41    zoom_controller_.reset(new ZoomController(web_contents()));
42    zoom_controller_->AddObserver(&zoom_observer_);
43
44    // This call is needed so that the RenderViewHost reports being alive. This
45    // is only important for tests that call ZoomController::SetZoomLevel().
46    content::RenderViewHostTester::For(rvh())->CreateRenderView(
47        base::string16(), MSG_ROUTING_NONE, MSG_ROUTING_NONE, -1, false);
48  }
49
50  virtual void TearDown() OVERRIDE {
51    zoom_controller_->RemoveObserver(&zoom_observer_);
52    zoom_controller_.reset();
53    ChromeRenderViewHostTestHarness::TearDown();
54  }
55
56 protected:
57  scoped_ptr<ZoomController> zoom_controller_;
58  TestZoomObserver zoom_observer_;
59};
60
61TEST_F(ZoomControllerTest, DidNavigateMainFrame) {
62  double zoom_level = zoom_controller_->GetZoomLevel();
63  ZoomController::ZoomChangedEventData zoom_change_data(
64      web_contents(),
65      zoom_level,
66      zoom_level,
67      ZoomController::ZOOM_MODE_DEFAULT,
68      false);
69  EXPECT_CALL(zoom_observer_, OnZoomChanged(zoom_change_data)).Times(1);
70  zoom_controller_->DidNavigateMainFrame(content::LoadCommittedDetails(),
71                                         content::FrameNavigateParams());
72}
73
74TEST_F(ZoomControllerTest, Observe) {
75  double new_zoom_level = 110.0;
76  // When the event is initiated from HostZoomMap, the old zoom level is not
77  // available.
78  ZoomController::ZoomChangedEventData zoom_change_data(
79      web_contents(),
80      new_zoom_level,
81      new_zoom_level,
82      ZoomController::ZOOM_MODE_DEFAULT,
83      false);
84  EXPECT_CALL(zoom_observer_, OnZoomChanged(zoom_change_data)).Times(1);
85
86  content::HostZoomMap* host_zoom_map =
87      content::HostZoomMap::GetDefaultForBrowserContext(
88          web_contents()->GetBrowserContext());
89
90  host_zoom_map->SetZoomLevelForHost(std::string(), new_zoom_level);
91}
92
93TEST_F(ZoomControllerTest, Observe_ZoomController) {
94  double old_zoom_level = zoom_controller_->GetZoomLevel();
95  double new_zoom_level = 110.0;
96
97  NavigateAndCommit(GURL("about:blank"));
98
99  ZoomController::ZoomChangedEventData zoom_change_data1(
100      web_contents(),
101      old_zoom_level,
102      old_zoom_level,
103      ZoomController::ZOOM_MODE_ISOLATED,
104      true /* can_show_bubble */);
105  EXPECT_CALL(zoom_observer_, OnZoomChanged(zoom_change_data1)).Times(1);
106
107  zoom_controller_->SetZoomMode(ZoomController::ZOOM_MODE_ISOLATED);
108
109  ZoomController::ZoomChangedEventData zoom_change_data2(
110      web_contents(),
111      old_zoom_level,
112      new_zoom_level,
113      ZoomController::ZOOM_MODE_ISOLATED,
114      true /* can_show_bubble */);
115  EXPECT_CALL(zoom_observer_, OnZoomChanged(zoom_change_data2)).Times(1);
116
117  zoom_controller_->SetZoomLevel(new_zoom_level);
118}
119