1 // Copyright (c) 2011 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 "chrome/browser/extensions/browser_action_test_util.h"
6 #include "chrome/browser/extensions/extension_apitest.h"
7 #include "chrome/browser/extensions/extension_service.h"
8 #include "chrome/browser/extensions/extension_test_message_listener.h"
9 #include "chrome/browser/extensions/user_script_master.h"
10 #include "chrome/browser/profiles/profile.h"
11 #include "chrome/browser/ui/browser.h"
12 #include "chrome/browser/ui/browser_list.h"
13 #include "chrome/browser/ui/browser_window.h"
14 #include "chrome/common/url_constants.h"
15 #include "chrome/test/ui_test_utils.h"
16 #include "content/browser/tab_contents/tab_contents.h"
17 #include "net/base/mock_host_resolver.h"
18
IN_PROC_BROWSER_TEST_F(ExtensionApiTest,IncognitoNoScript)19 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, IncognitoNoScript) {
20 ASSERT_TRUE(StartTestServer());
21
22 // Loads a simple extension which attempts to change the title of every page
23 // that loads to "modified".
24 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("incognito")
25 .AppendASCII("content_scripts")));
26
27 // Open incognito window and navigate to test page.
28 ui_test_utils::OpenURLOffTheRecord(
29 browser()->profile(),
30 test_server()->GetURL("files/extensions/test_file.html"));
31
32 Browser* otr_browser = BrowserList::FindBrowserWithType(
33 browser()->profile()->GetOffTheRecordProfile(), Browser::TYPE_NORMAL,
34 false);
35 TabContents* tab = otr_browser->GetSelectedTabContents();
36
37 // Verify the script didn't run.
38 bool result = false;
39 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(
40 tab->render_view_host(), L"",
41 L"window.domAutomationController.send(document.title == 'Unmodified')",
42 &result));
43 EXPECT_TRUE(result);
44 }
45
IN_PROC_BROWSER_TEST_F(ExtensionApiTest,IncognitoYesScript)46 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, IncognitoYesScript) {
47 host_resolver()->AddRule("*", "127.0.0.1");
48 ASSERT_TRUE(StartTestServer());
49
50 // Load a dummy extension. This just tests that we don't regress a
51 // crash fix when multiple incognito- and non-incognito-enabled extensions
52 // are mixed.
53 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("content_scripts")
54 .AppendASCII("all_frames")));
55
56 // Loads a simple extension which attempts to change the title of every page
57 // that loads to "modified".
58 ASSERT_TRUE(LoadExtensionIncognito(test_data_dir_
59 .AppendASCII("incognito").AppendASCII("content_scripts")));
60
61 // Dummy extension #2.
62 ASSERT_TRUE(LoadExtension(test_data_dir_
63 .AppendASCII("content_scripts").AppendASCII("isolated_world1")));
64
65 // Open incognito window and navigate to test page.
66 ui_test_utils::OpenURLOffTheRecord(
67 browser()->profile(),
68 test_server()->GetURL("files/extensions/test_file.html"));
69
70 Browser* otr_browser = BrowserList::FindBrowserWithType(
71 browser()->profile()->GetOffTheRecordProfile(), Browser::TYPE_NORMAL,
72 false);
73 TabContents* tab = otr_browser->GetSelectedTabContents();
74
75 // Verify the script ran.
76 bool result = false;
77 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(
78 tab->render_view_host(), L"",
79 L"window.domAutomationController.send(document.title == 'modified')",
80 &result));
81 EXPECT_TRUE(result);
82 }
83
84 // Tests that an extension which is enabled for incognito mode doesn't
85 // accidentially create and incognito profile.
IN_PROC_BROWSER_TEST_F(ExtensionApiTest,DontCreateIncognitoProfile)86 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, DontCreateIncognitoProfile) {
87 ASSERT_FALSE(browser()->profile()->HasOffTheRecordProfile());
88 ASSERT_TRUE(RunExtensionTestIncognito(
89 "incognito/dont_create_profile")) << message_;
90 ASSERT_FALSE(browser()->profile()->HasOffTheRecordProfile());
91 }
92
93 // Tests that the APIs in an incognito-enabled extension work properly.
94 // Flaky - see crbug.com/77951.
IN_PROC_BROWSER_TEST_F(ExtensionApiTest,FLAKY_Incognito)95 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, FLAKY_Incognito) {
96 host_resolver()->AddRule("*", "127.0.0.1");
97 ASSERT_TRUE(StartTestServer());
98
99 ResultCatcher catcher;
100
101 // Open incognito window and navigate to test page.
102 ui_test_utils::OpenURLOffTheRecord(
103 browser()->profile(),
104 test_server()->GetURL("files/extensions/test_file.html"));
105
106 ASSERT_TRUE(LoadExtensionIncognito(test_data_dir_
107 .AppendASCII("incognito").AppendASCII("apis")));
108
109 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
110 }
111
112 // Tests that the APIs in an incognito-enabled split-mode extension work
113 // properly.
114 // Hangs flakily on mac, linux, win: http://crbug.com/53991
IN_PROC_BROWSER_TEST_F(ExtensionApiTest,DISABLED_IncognitoSplitMode)115 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, DISABLED_IncognitoSplitMode) {
116 host_resolver()->AddRule("*", "127.0.0.1");
117 ASSERT_TRUE(StartTestServer());
118
119 // We need 2 ResultCatchers because we'll be running the same test in both
120 // regular and incognito mode.
121 ResultCatcher catcher;
122 catcher.RestrictToProfile(browser()->profile());
123 ResultCatcher catcher_incognito;
124 catcher_incognito.RestrictToProfile(
125 browser()->profile()->GetOffTheRecordProfile());
126
127 // Open incognito window and navigate to test page.
128 ui_test_utils::OpenURLOffTheRecord(
129 browser()->profile(),
130 test_server()->GetURL("files/extensions/test_file.html"));
131
132 ASSERT_TRUE(LoadExtensionIncognito(test_data_dir_
133 .AppendASCII("incognito").AppendASCII("split")));
134
135 // Wait for both extensions to be ready before telling them to proceed.
136 ExtensionTestMessageListener listener("waiting", true);
137 EXPECT_TRUE(listener.WaitUntilSatisfied());
138 ExtensionTestMessageListener listener_incognito("waiting", true);
139 EXPECT_TRUE(listener_incognito.WaitUntilSatisfied());
140 listener.Reply("go");
141 listener_incognito.Reply("go");
142
143 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
144 EXPECT_TRUE(catcher_incognito.GetNextResult()) << catcher.message();
145 }
146
147 // Tests that the APIs in an incognito-disabled extension don't see incognito
148 // events or callbacks.
IN_PROC_BROWSER_TEST_F(ExtensionApiTest,IncognitoDisabled)149 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, IncognitoDisabled) {
150 host_resolver()->AddRule("*", "127.0.0.1");
151 ASSERT_TRUE(StartTestServer());
152
153 ResultCatcher catcher;
154
155 // Open incognito window and navigate to test page.
156 ui_test_utils::OpenURLOffTheRecord(
157 browser()->profile(),
158 test_server()->GetURL("files/extensions/test_file.html"));
159
160 ASSERT_TRUE(LoadExtension(test_data_dir_
161 .AppendASCII("incognito").AppendASCII("apis_disabled")));
162
163 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
164 }
165
166 // Test that opening a popup from an incognito browser window works properly.
IN_PROC_BROWSER_TEST_F(ExtensionApiTest,IncognitoPopup)167 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, IncognitoPopup) {
168 host_resolver()->AddRule("*", "127.0.0.1");
169 ASSERT_TRUE(StartTestServer());
170
171 ResultCatcher catcher;
172
173 ASSERT_TRUE(LoadExtensionIncognito(test_data_dir_
174 .AppendASCII("incognito").AppendASCII("popup")));
175
176 // Open incognito window and navigate to test page.
177 ui_test_utils::OpenURLOffTheRecord(
178 browser()->profile(),
179 test_server()->GetURL("files/extensions/test_file.html"));
180
181 Browser* incognito_browser = BrowserList::FindBrowserWithType(
182 browser()->profile()->GetOffTheRecordProfile(), Browser::TYPE_NORMAL,
183 false);
184
185 // Simulate the incognito's browser action being clicked.
186 BrowserActionTestUtil(incognito_browser).Press(0);
187
188 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
189 }
190