Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(85)

Side by Side Diff: content/browser/debugger/devtools_sanity_unittest.cc

Issue 7309011: Remove dependencies on extensions from content/browser/debugger. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merge to head. Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/debugger/devtools_sanity_unittest.h"
6
5 #include "base/command_line.h" 7 #include "base/command_line.h"
6 #include "base/path_service.h" 8 #include "base/path_service.h"
7 #include "base/stringprintf.h" 9 #include "base/stringprintf.h"
8 #include "base/utf_string_conversions.h" 10 #include "base/utf_string_conversions.h"
9 #include "chrome/browser/extensions/extension_host.h"
10 #include "chrome/browser/extensions/extension_service.h"
11 #include "chrome/browser/profiles/profile.h" 11 #include "chrome/browser/profiles/profile.h"
12 #include "chrome/browser/ui/browser.h" 12 #include "chrome/browser/ui/browser.h"
13 #include "chrome/common/chrome_paths.h" 13 #include "chrome/common/chrome_paths.h"
14 #include "chrome/test/in_process_browser_test.h"
15 #include "chrome/test/ui_test_utils.h" 14 #include "chrome/test/ui_test_utils.h"
16 #include "content/browser/debugger/devtools_client_host.h" 15 #include "content/browser/debugger/devtools_client_host.h"
17 #include "content/browser/debugger/devtools_manager.h" 16 #include "content/browser/debugger/devtools_manager.h"
18 #include "content/browser/debugger/devtools_window.h" 17 #include "content/browser/debugger/devtools_window.h"
19 #include "content/browser/renderer_host/render_view_host.h" 18 #include "content/browser/renderer_host/render_view_host.h"
20 #include "content/browser/tab_contents/tab_contents.h" 19 #include "content/browser/tab_contents/tab_contents.h"
21 #include "content/common/notification_registrar.h" 20 #include "content/common/notification_registrar.h"
22 #include "content/common/notification_service.h"
23 #include "net/test/test_server.h" 21 #include "net/test/test_server.h"
24 22
25 namespace { 23 namespace {
26 24
27 // Used to block until a dev tools client window's browser is closed. 25 // Used to block until a dev tools client window's browser is closed.
28 class BrowserClosedObserver : public NotificationObserver { 26 class BrowserClosedObserver : public NotificationObserver {
29 public: 27 public:
30 explicit BrowserClosedObserver(Browser* browser) { 28 explicit BrowserClosedObserver(Browser* browser) {
31 registrar_.Add(this, NotificationType::BROWSER_CLOSED, 29 registrar_.Add(this, NotificationType::BROWSER_CLOSED,
32 Source<Browser>(browser)); 30 Source<Browser>(browser));
(...skipping 13 matching lines...) Expand all
46 44
47 // The delay waited in some cases where we don't have a notifications for an 45 // The delay waited in some cases where we don't have a notifications for an
48 // action we take. 46 // action we take.
49 const int kActionDelayMs = 500; 47 const int kActionDelayMs = 500;
50 48
51 const char kDebuggerTestPage[] = "files/devtools/debugger_test_page.html"; 49 const char kDebuggerTestPage[] = "files/devtools/debugger_test_page.html";
52 const char kPauseWhenLoadingDevTools[] = 50 const char kPauseWhenLoadingDevTools[] =
53 "files/devtools/pause_when_loading_devtools.html"; 51 "files/devtools/pause_when_loading_devtools.html";
54 const char kPauseWhenScriptIsRunning[] = 52 const char kPauseWhenScriptIsRunning[] =
55 "files/devtools/pause_when_script_is_running.html"; 53 "files/devtools/pause_when_script_is_running.html";
56 const char kPageWithContentScript[] =
57 "files/devtools/page_with_content_script.html";
58 const char kChunkedTestPage[] = "chunked"; 54 const char kChunkedTestPage[] = "chunked";
59 const char kSlowTestPage[] = 55 const char kSlowTestPage[] =
60 "chunked?waitBeforeHeaders=100&waitBetweenChunks=100&chunksNumber=2"; 56 "chunked?waitBeforeHeaders=100&waitBetweenChunks=100&chunksNumber=2";
61 57
58 } // namespace
62 59
63 class DevToolsSanityTest : public InProcessBrowserTest { 60 DevToolsSanityTest::DevToolsSanityTest() {
64 public: 61 set_show_window(true);
65 DevToolsSanityTest() { 62 EnableDOMAutomation();
66 set_show_window(true); 63 }
67 EnableDOMAutomation();
68 }
69 64
70 protected: 65 void DevToolsSanityTest::RunTest(const std::string& test_name,
71 void RunTest(const std::string& test_name, const std::string& test_page) { 66 const std::string& test_page) {
72 OpenDevToolsWindow(test_page); 67 OpenDevToolsWindow(test_page);
73 std::string result; 68 std::string result;
74 69
75 // At first check that JavaScript part of the front-end is loaded by 70 // At first check that JavaScript part of the front-end is loaded by
76 // checking that global variable uiTests exists(it's created after all js 71 // checking that global variable uiTests exists(it's created after all js
77 // files have been loaded) and has runTest method. 72 // files have been loaded) and has runTest method.
73 ASSERT_TRUE(
74 ui_test_utils::ExecuteJavaScriptAndExtractString(
75 client_contents_->render_view_host(),
76 L"",
77 L"window.domAutomationController.send("
78 L"'' + (window.uiTests && (typeof uiTests.runTest)));",
79 &result));
80
81 if (result == "function") {
78 ASSERT_TRUE( 82 ASSERT_TRUE(
79 ui_test_utils::ExecuteJavaScriptAndExtractString( 83 ui_test_utils::ExecuteJavaScriptAndExtractString(
80 client_contents_->render_view_host(), 84 client_contents_->render_view_host(),
81 L"", 85 L"",
82 L"window.domAutomationController.send(" 86 UTF8ToWide(base::StringPrintf("uiTests.runTest('%s')",
83 L"'' + (window.uiTests && (typeof uiTests.runTest)));", 87 test_name.c_str())),
84 &result)); 88 &result));
89 EXPECT_EQ("[OK]", result);
90 } else {
91 FAIL() << "DevTools front-end is broken.";
92 }
93 CloseDevToolsWindow();
94 }
85 95
86 if (result == "function") { 96 void DevToolsSanityTest::OpenDevToolsWindow(const std::string& test_page) {
87 ASSERT_TRUE( 97 ASSERT_TRUE(test_server()->Start());
88 ui_test_utils::ExecuteJavaScriptAndExtractString( 98 GURL url = test_server()->GetURL(test_page);
89 client_contents_->render_view_host(), 99 ui_test_utils::NavigateToURL(browser(), url);
90 L"",
91 UTF8ToWide(base::StringPrintf("uiTests.runTest('%s')",
92 test_name.c_str())),
93 &result));
94 EXPECT_EQ("[OK]", result);
95 } else {
96 FAIL() << "DevTools front-end is broken.";
97 }
98 CloseDevToolsWindow();
99 }
100 100
101 void OpenDevToolsWindow(const std::string& test_page) { 101 inspected_rvh_ = GetInspectedTab()->render_view_host();
102 ASSERT_TRUE(test_server()->Start()); 102 DevToolsManager* devtools_manager = DevToolsManager::GetInstance();
103 GURL url = test_server()->GetURL(test_page); 103 devtools_manager->OpenDevToolsWindow(inspected_rvh_);
104 ui_test_utils::NavigateToURL(browser(), url);
105 104
106 inspected_rvh_ = GetInspectedTab()->render_view_host(); 105 DevToolsClientHost* client_host =
107 window_ = DevToolsWindow::OpenDevToolsWindow(inspected_rvh_); 106 devtools_manager->GetDevToolsClientHostFor(inspected_rvh_);
108 RenderViewHost* client_rvh = window_->GetRenderViewHost(); 107 window_ = client_host->AsDevToolsWindow();
109 client_contents_ = client_rvh->delegate()->GetAsTabContents(); 108 RenderViewHost* client_rvh = window_->GetRenderViewHost();
110 ui_test_utils::WaitForNavigation(&client_contents_->controller()); 109 client_contents_ = client_rvh->delegate()->GetAsTabContents();
111 } 110 ui_test_utils::WaitForNavigation(&client_contents_->controller());
111 }
112 112
113 TabContents* GetInspectedTab() { 113 TabContents* DevToolsSanityTest::GetInspectedTab() {
114 return browser()->GetTabContentsAt(0); 114 return browser()->GetTabContentsAt(0);
115 } 115 }
116 116
117 void CloseDevToolsWindow() { 117 void DevToolsSanityTest::CloseDevToolsWindow() {
118 DevToolsManager* devtools_manager = DevToolsManager::GetInstance(); 118 DevToolsManager* devtools_manager = DevToolsManager::GetInstance();
119 // UnregisterDevToolsClientHostFor may destroy window_ so store the browser 119 // UnregisterDevToolsClientHostFor may destroy window_ so store the browser
120 // first. 120 // first.
121 Browser* browser = window_->browser(); 121 Browser* browser = window_->browser();
122 devtools_manager->UnregisterDevToolsClientHostFor(inspected_rvh_); 122 devtools_manager->UnregisterDevToolsClientHostFor(inspected_rvh_);
123 123
124 // Wait only when DevToolsWindow has a browser. For docked DevTools, this 124 // Wait only when DevToolsWindow has a browser. For docked DevTools, this
125 // is NULL and we skip the wait. 125 // is NULL and we skip the wait.
126 if (browser) 126 if (browser)
127 BrowserClosedObserver close_observer(browser); 127 BrowserClosedObserver close_observer(browser);
128 } 128 }
129
130 TabContents* client_contents_;
131 DevToolsWindow* window_;
132 RenderViewHost* inspected_rvh_;
133 };
134 129
135 130
136 class CancelableQuitTask : public Task { 131 namespace {
137 public:
138 explicit CancelableQuitTask(const std::string& timeout_message)
139 : timeout_message_(timeout_message),
140 cancelled_(false) {
141 }
142
143 void cancel() {
144 cancelled_ = true;
145 }
146
147 virtual void Run() {
148 if (cancelled_) {
149 return;
150 }
151 FAIL() << timeout_message_;
152 MessageLoop::current()->Quit();
153 }
154
155 private:
156 std::string timeout_message_;
157 bool cancelled_;
158 };
159
160
161 // Base class for DevTools tests that test devtools functionality for
162 // extensions and content scripts.
163 class DevToolsExtensionDebugTest : public DevToolsSanityTest,
164 public NotificationObserver {
165 public:
166 DevToolsExtensionDebugTest() : DevToolsSanityTest() {
167 PathService::Get(chrome::DIR_TEST_DATA, &test_extensions_dir_);
168 test_extensions_dir_ = test_extensions_dir_.AppendASCII("devtools");
169 test_extensions_dir_ = test_extensions_dir_.AppendASCII("extensions");
170 }
171
172 protected:
173 // Load an extention from test\data\devtools\extensions\<extension_name>
174 void LoadExtension(const char* extension_name) {
175 FilePath path = test_extensions_dir_.AppendASCII(extension_name);
176 ASSERT_TRUE(LoadExtensionFromPath(path)) << "Failed to load extension.";
177 }
178
179 private:
180 bool LoadExtensionFromPath(const FilePath& path) {
181 ExtensionService* service = browser()->profile()->GetExtensionService();
182 size_t num_before = service->extensions()->size();
183 {
184 NotificationRegistrar registrar;
185 registrar.Add(this, NotificationType::EXTENSION_LOADED,
186 NotificationService::AllSources());
187 CancelableQuitTask* delayed_quit =
188 new CancelableQuitTask("Extension load timed out.");
189 MessageLoop::current()->PostDelayedTask(FROM_HERE, delayed_quit,
190 4*1000);
191 service->LoadExtension(path);
192 ui_test_utils::RunMessageLoop();
193 delayed_quit->cancel();
194 }
195 size_t num_after = service->extensions()->size();
196 if (num_after != (num_before + 1))
197 return false;
198
199 return WaitForExtensionHostsToLoad();
200 }
201
202 bool WaitForExtensionHostsToLoad() {
203 // Wait for all the extension hosts that exist to finish loading.
204 // NOTE: This assumes that the extension host list is not changing while
205 // this method is running.
206
207 NotificationRegistrar registrar;
208 registrar.Add(this, NotificationType::EXTENSION_HOST_DID_STOP_LOADING,
209 NotificationService::AllSources());
210 CancelableQuitTask* delayed_quit =
211 new CancelableQuitTask("Extension host load timed out.");
212 MessageLoop::current()->PostDelayedTask(FROM_HERE, delayed_quit,
213 4*1000);
214
215 ExtensionProcessManager* manager =
216 browser()->profile()->GetExtensionProcessManager();
217 for (ExtensionProcessManager::const_iterator iter = manager->begin();
218 iter != manager->end();) {
219 if ((*iter)->did_stop_loading())
220 ++iter;
221 else
222 ui_test_utils::RunMessageLoop();
223 }
224
225 delayed_quit->cancel();
226 return true;
227 }
228
229 void Observe(NotificationType type,
230 const NotificationSource& source,
231 const NotificationDetails& details) {
232 switch (type.value) {
233 case NotificationType::EXTENSION_LOADED:
234 case NotificationType::EXTENSION_HOST_DID_STOP_LOADING:
235 MessageLoopForUI::current()->Quit();
236 break;
237 default:
238 NOTREACHED();
239 break;
240 }
241 }
242
243 FilePath test_extensions_dir_;
244 };
245 132
246 // Tests scripts panel showing. 133 // Tests scripts panel showing.
247 IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestShowScriptsTab) { 134 IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestShowScriptsTab) {
248 RunTest("testShowScriptsTab", kDebuggerTestPage); 135 RunTest("testShowScriptsTab", kDebuggerTestPage);
249 } 136 }
250 137
251 // Tests that scripts tab is populated with inspected scripts even if it 138 // Tests that scripts tab is populated with inspected scripts even if it
252 // hadn't been shown by the moment inspected paged refreshed. 139 // hadn't been shown by the moment inspected paged refreshed.
253 // @see http://crbug.com/26312 140 // @see http://crbug.com/26312
254 IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, 141 IN_PROC_BROWSER_TEST_F(DevToolsSanityTest,
255 TestScriptsTabIsPopulatedOnInspectedPageRefresh) { 142 TestScriptsTabIsPopulatedOnInspectedPageRefresh) {
256 // Clear inspector settings to ensure that Elements will be 143 // Clear inspector settings to ensure that Elements will be
257 // current panel when DevTools window is open. 144 // current panel when DevTools window is open.
258 GetInspectedTab()->render_view_host()->delegate()->ClearInspectorSettings(); 145 GetInspectedTab()->render_view_host()->delegate()->ClearInspectorSettings();
259 RunTest("testScriptsTabIsPopulatedOnInspectedPageRefresh", 146 RunTest("testScriptsTabIsPopulatedOnInspectedPageRefresh",
260 kDebuggerTestPage); 147 kDebuggerTestPage);
261 } 148 }
262 149
263 // Tests that a content script is in the scripts list.
264 // This test is disabled, see bug 28961.
265 IN_PROC_BROWSER_TEST_F(DevToolsExtensionDebugTest,
266 TestContentScriptIsPresent) {
267 LoadExtension("simple_content_script");
268 RunTest("testContentScriptIsPresent", kPageWithContentScript);
269 }
270
271 // Tests that scripts are not duplicated after Scripts Panel switch. 150 // Tests that scripts are not duplicated after Scripts Panel switch.
272 IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, 151 IN_PROC_BROWSER_TEST_F(DevToolsSanityTest,
273 TestNoScriptDuplicatesOnPanelSwitch) { 152 TestNoScriptDuplicatesOnPanelSwitch) {
274 RunTest("testNoScriptDuplicatesOnPanelSwitch", kDebuggerTestPage); 153 RunTest("testNoScriptDuplicatesOnPanelSwitch", kDebuggerTestPage);
275 } 154 }
276 155
277 // Tests that debugger works correctly if pause event occurs when DevTools 156 // Tests that debugger works correctly if pause event occurs when DevTools
278 // frontend is being loaded. 157 // frontend is being loaded.
279 // Flaky - http://crbug.com/69719. 158 // Flaky - http://crbug.com/69719.
280 IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, FLAKY_TestPauseWhenLoadingDevTools) { 159 IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, FLAKY_TestPauseWhenLoadingDevTools) {
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
315 client_contents_->render_view_host(), 194 client_contents_->render_view_host(),
316 L"", 195 L"",
317 L"window.domAutomationController.send(" 196 L"window.domAutomationController.send("
318 L"'' + (window.uiTests && (typeof uiTests.runTest)));", 197 L"'' + (window.uiTests && (typeof uiTests.runTest)));",
319 &result)); 198 &result));
320 ASSERT_EQ("function", result) << "DevTools front-end is broken."; 199 ASSERT_EQ("function", result) << "DevTools front-end is broken.";
321 CloseDevToolsWindow(); 200 CloseDevToolsWindow();
322 } 201 }
323 202
324 } // namespace 203 } // namespace
OLDNEW
« no previous file with comments | « content/browser/debugger/devtools_sanity_unittest.h ('k') | content/browser/debugger/devtools_window.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698