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 <string>
6
7#include "base/command_line.h"
8#include "base/memory/scoped_ptr.h"
9#include "base/message_loop/message_loop.h"
10#include "chrome/browser/extensions/extension_action.h"
11#include "chrome/browser/extensions/extension_action_manager.h"
12#include "chrome/browser/extensions/extension_service.h"
13#include "chrome/browser/extensions/page_action_controller.h"
14#include "chrome/browser/extensions/tab_helper.h"
15#include "chrome/browser/extensions/test_extension_system.h"
16#include "chrome/browser/sessions/session_id.h"
17#include "chrome/test/base/chrome_render_view_host_test_harness.h"
18#include "chrome/test/base/testing_profile.h"
19#include "extensions/common/extension.h"
20#include "extensions/common/extension_builder.h"
21#include "extensions/common/value_builder.h"
22
23#if defined(OS_CHROMEOS)
24#include "chrome/browser/chromeos/login/users/user_manager.h"
25#include "chrome/browser/chromeos/settings/cros_settings.h"
26#include "chrome/browser/chromeos/settings/device_settings_service.h"
27#endif
28
29namespace extensions {
30namespace {
31
32class PageActionControllerTest : public ChromeRenderViewHostTestHarness {
33 protected:
34  virtual void SetUp() OVERRIDE {
35    ChromeRenderViewHostTestHarness::SetUp();
36#if defined OS_CHROMEOS
37  test_user_manager_.reset(new chromeos::ScopedTestUserManager());
38#endif
39    TabHelper::CreateForWebContents(web_contents());
40    // Create an ExtensionService so the PageActionController can find its
41    // extensions.
42    CommandLine command_line(CommandLine::NO_PROGRAM);
43    Profile* profile =
44        Profile::FromBrowserContext(web_contents()->GetBrowserContext());
45    extension_service_ = static_cast<TestExtensionSystem*>(
46        ExtensionSystem::Get(profile))->CreateExtensionService(
47            &command_line, base::FilePath(), false);
48  }
49
50  virtual void TearDown() OVERRIDE {
51#if defined OS_CHROMEOS
52    test_user_manager_.reset();
53#endif
54    ChromeRenderViewHostTestHarness::TearDown();
55  }
56
57  int tab_id() {
58    return SessionID::IdForTab(web_contents());
59  }
60
61  ExtensionService* extension_service_;
62
63 private:
64#if defined OS_CHROMEOS
65  chromeos::ScopedTestDeviceSettingsService test_device_settings_service_;
66  chromeos::ScopedTestCrosSettings test_cros_settings_;
67  scoped_ptr<chromeos::ScopedTestUserManager> test_user_manager_;
68#endif
69};
70
71TEST_F(PageActionControllerTest, NavigationClearsState) {
72  scoped_refptr<const Extension> extension =
73      ExtensionBuilder()
74      .SetManifest(DictionaryBuilder()
75                   .Set("name", "Extension with page action")
76                   .Set("version", "1.0.0")
77                   .Set("manifest_version", 2)
78                   .Set("permissions", ListBuilder()
79                        .Append("tabs"))
80                   .Set("page_action", DictionaryBuilder()
81                        .Set("default_title", "Hello")))
82      .Build();
83  extension_service_->AddExtension(extension.get());
84
85  NavigateAndCommit(GURL("http://www.google.com"));
86
87  ExtensionAction& page_action =
88      *ExtensionActionManager::Get(profile())->GetPageAction(*extension.get());
89  page_action.SetTitle(tab_id(), "Goodbye");
90  page_action.SetPopupUrl(
91      tab_id(), extension->GetResourceURL("popup.html"));
92
93  EXPECT_EQ("Goodbye", page_action.GetTitle(tab_id()));
94  EXPECT_EQ(extension->GetResourceURL("popup.html"),
95            page_action.GetPopupUrl(tab_id()));
96
97  // Within-page navigation should keep the settings.
98  NavigateAndCommit(GURL("http://www.google.com/#hash"));
99
100  EXPECT_EQ("Goodbye", page_action.GetTitle(tab_id()));
101  EXPECT_EQ(extension->GetResourceURL("popup.html"),
102            page_action.GetPopupUrl(tab_id()));
103
104  // Should discard the settings, and go back to the defaults.
105  NavigateAndCommit(GURL("http://www.yahoo.com"));
106
107  EXPECT_EQ("Hello", page_action.GetTitle(tab_id()));
108  EXPECT_EQ(GURL(), page_action.GetPopupUrl(tab_id()));
109};
110
111}  // namespace
112}  // namespace extensions
113