12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
59ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_finder.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/zoom/zoom_controller.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/zoom/zoom_observer.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/pref_names.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/chrome_render_view_host_test_harness.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/testing_profile.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/host_zoom_map.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/navigation_details.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/frame_navigate_params.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/test/test_renderer_host.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/test/test_utils.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool operator==(const ZoomController::ZoomChangedEventData& lhs,
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                const ZoomController::ZoomChangedEventData& rhs) {
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return lhs.web_contents == rhs.web_contents &&
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch         lhs.old_zoom_level == rhs.old_zoom_level &&
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch         lhs.new_zoom_level == rhs.new_zoom_level &&
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch         lhs.zoom_mode == rhs.zoom_mode &&
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch         lhs.can_show_bubble == rhs.can_show_bubble;
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestZoomObserver : public ZoomObserver {
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MOCK_METHOD1(OnZoomChanged,
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               void(const ZoomController::ZoomChangedEventData&));
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ZoomControllerTest : public ChromeRenderViewHostTestHarness {
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ChromeRenderViewHostTestHarness::SetUp();
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    zoom_controller_.reset(new ZoomController(web_contents()));
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    zoom_controller_->AddObserver(&zoom_observer_);
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // This call is needed so that the RenderViewHost reports being alive. This
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // is only important for tests that call ZoomController::SetZoomLevel().
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    content::RenderViewHostTester::For(rvh())->CreateRenderView(
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        base::string16(), MSG_ROUTING_NONE, MSG_ROUTING_NONE, -1, false);
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() OVERRIDE {
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    zoom_controller_->RemoveObserver(&zoom_observer_);
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    zoom_controller_.reset();
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ChromeRenderViewHostTestHarness::TearDown();
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ZoomController> zoom_controller_;
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestZoomObserver zoom_observer_;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ZoomControllerTest, DidNavigateMainFrame) {
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  double zoom_level = zoom_controller_->GetZoomLevel();
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ZoomController::ZoomChangedEventData zoom_change_data(
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      web_contents(),
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      zoom_level,
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      zoom_level,
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ZoomController::ZOOM_MODE_DEFAULT,
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      false);
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_CALL(zoom_observer_, OnZoomChanged(zoom_change_data)).Times(1);
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  zoom_controller_->DidNavigateMainFrame(content::LoadCommittedDetails(),
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         content::FrameNavigateParams());
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ZoomControllerTest, Observe) {
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  double new_zoom_level = 110.0;
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // When the event is initiated from HostZoomMap, the old zoom level is not
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // available.
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ZoomController::ZoomChangedEventData zoom_change_data(
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      web_contents(),
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      new_zoom_level,
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      new_zoom_level,
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ZoomController::ZOOM_MODE_DEFAULT,
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      false);
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_CALL(zoom_observer_, OnZoomChanged(zoom_change_data)).Times(1);
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::HostZoomMap* host_zoom_map =
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::HostZoomMap::GetDefaultForBrowserContext(
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          web_contents()->GetBrowserContext());
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  host_zoom_map->SetZoomLevelForHost(std::string(), new_zoom_level);
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
93116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ZoomControllerTest, Observe_ZoomController) {
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  double old_zoom_level = zoom_controller_->GetZoomLevel();
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  double new_zoom_level = 110.0;
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  NavigateAndCommit(GURL("about:blank"));
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ZoomController::ZoomChangedEventData zoom_change_data1(
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      web_contents(),
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      old_zoom_level,
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      old_zoom_level,
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ZoomController::ZOOM_MODE_ISOLATED,
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      true /* can_show_bubble */);
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_CALL(zoom_observer_, OnZoomChanged(zoom_change_data1)).Times(1);
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  zoom_controller_->SetZoomMode(ZoomController::ZOOM_MODE_ISOLATED);
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ZoomController::ZoomChangedEventData zoom_change_data2(
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      web_contents(),
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      old_zoom_level,
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      new_zoom_level,
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ZoomController::ZOOM_MODE_ISOLATED,
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      true /* can_show_bubble */);
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_CALL(zoom_observer_, OnZoomChanged(zoom_change_data2)).Times(1);
116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  zoom_controller_->SetZoomLevel(new_zoom_level);
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
119