blob: 1bca1973655b5b5898eb5750cc9403c2a0844b9c [file] [log] [blame]
[email protected]98cd15122012-01-05 16:27:481// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]cc273402009-05-12 09:20:332// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
avie4d7b6f2015-12-26 00:59:185#include <stddef.h>
6
dcheng18ec0b542016-04-26 19:28:537#include <memory>
davidsac88a1aa72017-03-30 21:10:418#include <vector>
dcheng18ec0b542016-04-26 19:28:539
[email protected]900c3b22011-10-22 00:55:2910#include "base/bind.h"
[email protected]4207d2b2011-11-28 18:09:2111#include "base/cancelable_callback.h"
[email protected]cc273402009-05-12 09:20:3312#include "base/command_line.h"
[email protected]ec6d5352011-12-19 14:48:3413#include "base/compiler_specific.h"
caseqe8340bc92016-04-20 00:02:5714#include "base/files/file_path.h"
skyostil02598352015-06-12 12:37:2515#include "base/location.h"
caseqc1edde1a2015-09-29 00:17:0716#include "base/macros.h"
dcheng18ec0b542016-04-26 19:28:5317#include "base/memory/ptr_util.h"
[email protected]cf3b40e32011-08-02 06:45:0318#include "base/memory/ref_counted.h"
[email protected]3985ba82010-07-29 21:44:1219#include "base/path_service.h"
skyostil02598352015-06-12 12:37:2520#include "base/single_thread_task_runner.h"
vkuzkokov00700c32015-03-17 16:04:0721#include "base/strings/string_number_conversions.h"
nick32e53c152015-12-17 19:48:5422#include "base/strings/string_util.h"
[email protected]135cb802013-06-09 16:44:2023#include "base/strings/utf_string_conversions.h"
fdoray0cce08a72017-04-24 20:10:4324#include "base/task_scheduler/post_task.h"
[email protected]c711fe712011-07-25 12:43:3025#include "base/test/test_timeouts.h"
jam3f2d3932017-04-26 20:28:5126#include "base/threading/thread_restrictions.h"
gabb15e19072016-05-11 20:45:4127#include "base/threading/thread_task_runner_handle.h"
avie4d7b6f2015-12-26 00:59:1828#include "build/build_config.h"
[email protected]fdf40f3e2013-07-11 23:55:4629#include "chrome/browser/chrome_notification_types.h"
yurys4e413a12015-07-07 10:14:5230#include "chrome/browser/devtools/device/tcp_device_provider.h"
[email protected]d118ad72014-07-21 14:07:0131#include "chrome/browser/devtools/devtools_window_testing.h"
[email protected]965901382013-04-03 07:38:3932#include "chrome/browser/extensions/extension_apitest.h"
[email protected]ead056352013-03-12 08:47:5433#include "chrome/browser/extensions/extension_browsertest.h"
[email protected]eaa7dd182010-12-14 11:09:0034#include "chrome/browser/extensions/extension_service.h"
nick32e53c152015-12-17 19:48:5435#include "chrome/browser/extensions/test_extension_dir.h"
[email protected]d8c8f25f2011-11-02 18:18:0136#include "chrome/browser/extensions/unpacked_installer.h"
[email protected]90354712013-11-16 00:06:3037#include "chrome/browser/lifetime/application_lifetime.h"
[email protected]8ecad5e2010-12-02 21:18:3338#include "chrome/browser/profiles/profile.h"
[email protected]7b5dc002010-11-16 23:08:1039#include "chrome/browser/ui/browser.h"
[email protected]a37d4b02012-06-25 21:56:1040#include "chrome/browser/ui/browser_commands.h"
[email protected]0d56fa7212012-11-15 23:34:0241#include "chrome/browser/ui/tabs/tab_strip_model.h"
[email protected]2c7b4d72009-10-21 07:17:1742#include "chrome/common/chrome_paths.h"
[email protected]ec6d5352011-12-19 14:48:3443#include "chrome/common/chrome_switches.h"
davidsac88a1aa72017-03-30 21:10:4144#include "chrome/common/extensions/extension_process_policy.h"
peletskyi5ec60bf2015-03-12 09:53:1845#include "chrome/common/pref_names.h"
[email protected]0a57375a2013-03-07 22:18:5946#include "chrome/common/url_constants.h"
[email protected]af44e7fb2011-07-29 18:32:3247#include "chrome/test/base/in_process_browser_test.h"
kozyatinskiy3ac94392016-07-14 00:07:4748#include "chrome/test/base/test_chrome_web_ui_controller_factory.h"
[email protected]af44e7fb2011-07-29 18:32:3249#include "chrome/test/base/ui_test_utils.h"
oshimaf65398422014-11-18 23:30:4250#include "components/app_modal/javascript_app_modal_dialog.h"
51#include "components/app_modal/native_app_modal_dialog.h"
brettwb1fc1b82016-02-02 00:19:0852#include "components/prefs/pref_service.h"
[email protected]4967f792012-01-20 22:14:4053#include "content/public/browser/child_process_data.h"
[email protected]b0b67cfe2012-01-18 21:59:5754#include "content/public/browser/content_browser_client.h"
[email protected]98f66112012-12-25 12:59:3655#include "content/public/browser/devtools_agent_host.h"
[email protected]87f3c082011-10-19 18:07:4456#include "content/public/browser/notification_registrar.h"
[email protected]ad50def52011-10-19 23:17:0757#include "content/public/browser/notification_service.h"
avi64b8b65b2017-03-29 18:50:3458#include "content/public/browser/render_frame_host.h"
[email protected]9c1662b2012-03-06 15:44:3359#include "content/public/browser/render_view_host.h"
caseqcfbb3faf2016-02-18 19:15:0660#include "content/public/browser/render_widget_host.h"
61#include "content/public/browser/render_widget_host_view.h"
kozyatinskiy3ac94392016-07-14 00:07:4762#include "content/public/browser/url_data_source.h"
[email protected]6acde6352012-01-04 16:52:2063#include "content/public/browser/web_contents.h"
kozyatinskiy3ac94392016-07-14 00:07:4764#include "content/public/browser/web_ui_controller.h"
[email protected]724214ae2011-12-29 23:58:0065#include "content/public/browser/worker_service.h"
66#include "content/public/browser/worker_service_observer.h"
[email protected]965901382013-04-03 07:38:3967#include "content/public/common/content_switches.h"
davidsac88a1aa72017-03-30 21:10:4168#include "content/public/common/url_constants.h"
[email protected]7d478cb2012-07-24 17:19:4269#include "content/public/test/browser_test_utils.h"
caseqc1edde1a2015-09-29 00:17:0770#include "content/public/test/test_navigation_observer.h"
reillyga3acbc12014-11-11 23:17:1271#include "extensions/browser/extension_registry.h"
limasdff3a0c5ef2017-02-28 01:30:3872#include "extensions/browser/extension_registry_observer.h"
[email protected]59b0e602014-01-30 00:41:2473#include "extensions/browser/extension_system.h"
[email protected]adf5a102014-07-31 12:44:0674#include "extensions/browser/notification_types.h"
limasdff3a0c5ef2017-02-28 01:30:3875#include "extensions/browser/test_extension_registry_observer.h"
[email protected]c8d02992013-07-31 22:16:5176#include "extensions/common/switches.h"
nick32e53c152015-12-17 19:48:5477#include "extensions/common/value_builder.h"
78#include "net/dns/mock_host_resolver.h"
[email protected]89b32522013-05-07 20:04:2179#include "net/test/spawned_test_server/spawned_test_server.h"
caseqe8340bc92016-04-20 00:02:5780#include "net/test/url_request/url_request_mock_http_job.h"
81#include "net/url_request/url_request_context.h"
82#include "net/url_request/url_request_filter.h"
83#include "net/url_request/url_request_http_job.h"
dtapuska836e1f92016-11-15 00:38:0684#include "third_party/WebKit/public/platform/WebInputEvent.h"
caseqc5e166832015-07-10 07:40:4785#include "ui/compositor/compositor_switches.h"
86#include "ui/gl/gl_switches.h"
caseqe8340bc92016-04-20 00:02:5787#include "url/gurl.h"
[email protected]cc273402009-05-12 09:20:3388
oshima0929be2a2014-11-19 22:21:0389using app_modal::AppModalDialog;
90using app_modal::JavaScriptAppModalDialog;
91using app_modal::NativeAppModalDialog;
[email protected]631bb742011-11-02 11:29:3992using content::BrowserThread;
[email protected]0e12d7d2011-12-01 16:21:4493using content::DevToolsAgentHost;
[email protected]c5eed492012-01-04 17:07:5094using content::NavigationController;
davidsac88a1aa72017-03-30 21:10:4195using content::RenderFrameHost;
[email protected]eaabba22012-03-07 15:02:1196using content::RenderViewHost;
[email protected]6acde6352012-01-04 16:52:2097using content::WebContents;
[email protected]724214ae2011-12-29 23:58:0098using content::WorkerService;
99using content::WorkerServiceObserver;
nick32e53c152015-12-17 19:48:54100using extensions::Extension;
[email protected]631bb742011-11-02 11:29:39101
[email protected]cc273402009-05-12 09:20:33102namespace {
103
[email protected]f72a1cc2010-04-30 07:17:30104const char kDebuggerTestPage[] = "files/devtools/debugger_test_page.html";
[email protected]f72a1cc2010-04-30 07:17:30105const char kPauseWhenLoadingDevTools[] =
106 "files/devtools/pause_when_loading_devtools.html";
107const char kPauseWhenScriptIsRunning[] =
108 "files/devtools/pause_when_script_is_running.html";
[email protected]f72a1cc2010-04-30 07:17:30109const char kPageWithContentScript[] =
110 "files/devtools/page_with_content_script.html";
[email protected]e344c392011-09-28 06:36:03111const char kNavigateBackTestPage[] =
112 "files/devtools/navigate_back.html";
dgozmanab680412016-02-04 02:21:37113const char kWindowOpenTestPage[] = "files/devtools/window_open.html";
caseqcfbb3faf2016-02-18 19:15:06114const char kLatencyInfoTestPage[] = "files/devtools/latency_info.html";
[email protected]74568b052011-05-20 09:36:14115const char kChunkedTestPage[] = "chunked";
caseqe8340bc92016-04-20 00:02:57116const char kPushTestPage[] = "files/devtools/push_test_page.html";
117// The resource is not really pushed, but mock url request job pretends it is.
118const char kPushTestResource[] = "devtools/image.png";
119const char kPushUseNullEndTime[] = "pushUseNullEndTime";
[email protected]74568b052011-05-20 09:36:14120const char kSlowTestPage[] =
121 "chunked?waitBeforeHeaders=100&waitBetweenChunks=100&chunksNumber=2";
[email protected]1fcef592011-07-20 07:16:36122const char kSharedWorkerTestPage[] =
123 "files/workers/workers_ui_shared_worker.html";
yurys48be075f2014-10-16 09:04:21124const char kSharedWorkerTestWorker[] =
125 "files/workers/workers_ui_shared_worker.js";
[email protected]867fd9232011-10-17 06:32:34126const char kReloadSharedWorkerTestPage[] =
127 "files/workers/debug_shared_worker_initialization.html";
yurys48be075f2014-10-16 09:04:21128const char kReloadSharedWorkerTestWorker[] =
129 "files/workers/debug_shared_worker_initialization.js";
dgozman6ca18e32016-06-29 19:30:29130const char kEmulateNetworkConditionsPage[] =
131 "files/devtools/emulate_network_conditions.html";
[email protected]81762dd2009-09-24 15:16:18132
caseqc1edde1a2015-09-29 00:17:07133template <typename... T>
caseqcfbb3faf2016-02-18 19:15:06134void DispatchOnTestSuiteSkipCheck(DevToolsWindow* window,
135 const char* method,
136 T... args) {
137 RenderViewHost* rvh = DevToolsWindowTesting::Get(window)
138 ->main_web_contents()
139 ->GetRenderViewHost();
140 std::string result;
141 const char* args_array[] = {method, args...};
142 std::ostringstream script;
143 script << "uiTests.dispatchOnTestSuite([";
144 for (size_t i = 0; i < arraysize(args_array); ++i)
145 script << (i ? "," : "") << '\"' << args_array[i] << '\"';
146 script << "])";
147 ASSERT_TRUE(
148 content::ExecuteScriptAndExtractString(rvh, script.str(), &result));
149 EXPECT_EQ("[OK]", result);
150}
151
152template <typename... T>
caseqc1edde1a2015-09-29 00:17:07153void DispatchOnTestSuite(DevToolsWindow* window,
154 const char* method,
155 T... args) {
[email protected]1fcef592011-07-20 07:16:36156 std::string result;
caseqc1edde1a2015-09-29 00:17:07157 RenderViewHost* rvh = DevToolsWindowTesting::Get(window)
158 ->main_web_contents()
159 ->GetRenderViewHost();
[email protected]1fcef592011-07-20 07:16:36160 // At first check that JavaScript part of the front-end is loaded by
161 // checking that global variable uiTests exists(it's created after all js
162 // files have been loaded) and has runTest method.
163 ASSERT_TRUE(
[email protected]b6987e02013-01-04 18:30:43164 content::ExecuteScriptAndExtractString(
[email protected]d118ad72014-07-21 14:07:01165 rvh,
[email protected]06bc5d92013-01-02 22:44:13166 "window.domAutomationController.send("
caseqc1edde1a2015-09-29 00:17:07167 " '' + (window.uiTests && (typeof uiTests.dispatchOnTestSuite)));",
[email protected]1fcef592011-07-20 07:16:36168 &result));
[email protected]b946b422014-03-18 22:53:40169 ASSERT_EQ("function", result) << "DevTools front-end is broken.";
caseqcfbb3faf2016-02-18 19:15:06170 DispatchOnTestSuiteSkipCheck(window, method, args...);
[email protected]1fcef592011-07-20 07:16:36171}
[email protected]cc273402009-05-12 09:20:33172
caseqc1edde1a2015-09-29 00:17:07173void RunTestFunction(DevToolsWindow* window, const char* test_name) {
174 DispatchOnTestSuite(window, test_name);
175}
176
177void SwitchToPanel(DevToolsWindow* window, const char* panel) {
178 DispatchOnTestSuite(window, "switchToPanel", panel);
179}
180
nick32e53c152015-12-17 19:48:54181// Version of SwitchToPanel that works with extension-created panels.
182void SwitchToExtensionPanel(DevToolsWindow* window,
183 const Extension* devtools_extension,
184 const char* panel_name) {
185 // The full name is the concatenation of the extension URL (stripped of its
186 // trailing '/') and the |panel_name| that was passed to panels.create().
187 std::string prefix = base::TrimString(devtools_extension->url().spec(), "/",
188 base::TRIM_TRAILING)
189 .as_string();
190 SwitchToPanel(window, (prefix + panel_name).c_str());
191}
192
caseqe8340bc92016-04-20 00:02:57193class PushTimesMockURLRequestJob : public net::URLRequestMockHTTPJob {
194 public:
195 PushTimesMockURLRequestJob(net::URLRequest* request,
196 net::NetworkDelegate* network_delegate,
197 base::FilePath file_path)
198 : net::URLRequestMockHTTPJob(
199 request,
200 network_delegate,
201 file_path,
fdoray0cce08a72017-04-24 20:10:43202 base::CreateTaskRunnerWithTraits(
203 base::TaskTraits()
204 .MayBlock()
205 .WithPriority(base::TaskPriority::BACKGROUND)
206 .WithShutdownBehavior(
207 base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN))) {}
caseqe8340bc92016-04-20 00:02:57208
209 void Start() override {
210 load_timing_info_.socket_reused = true;
211 load_timing_info_.request_start_time = base::Time::Now();
212 load_timing_info_.request_start = base::TimeTicks::Now();
213 load_timing_info_.send_start = base::TimeTicks::Now();
214 load_timing_info_.send_end = base::TimeTicks::Now();
215 load_timing_info_.receive_headers_end = base::TimeTicks::Now();
216
217 net::URLRequestMockHTTPJob::Start();
218 }
219
220 void GetLoadTimingInfo(net::LoadTimingInfo* load_timing_info) const override {
221 load_timing_info_.push_start = load_timing_info_.request_start -
222 base::TimeDelta::FromMilliseconds(100);
223 if (load_timing_info_.push_end.is_null() &&
224 request()->url().query() != kPushUseNullEndTime) {
225 load_timing_info_.push_end = base::TimeTicks::Now();
226 }
227 *load_timing_info = load_timing_info_;
228 }
229
230 private:
231 mutable net::LoadTimingInfo load_timing_info_;
232 DISALLOW_COPY_AND_ASSIGN(PushTimesMockURLRequestJob);
233};
234
235class TestInterceptor : public net::URLRequestInterceptor {
236 public:
237 // Creates TestInterceptor and registers it with the URLRequestFilter,
238 // which takes ownership of it.
239 static void Register(const GURL& url, const base::FilePath& file_path) {
240 EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO));
241 net::URLRequestFilter::GetInstance()->AddHostnameInterceptor(
242 url.scheme(), url.host(),
dcheng18ec0b542016-04-26 19:28:53243 base::WrapUnique(new TestInterceptor(url, file_path)));
caseqe8340bc92016-04-20 00:02:57244 }
245
246 // Unregisters previously created TestInterceptor, which should delete it.
247 static void Unregister(const GURL& url) {
248 EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO));
249 net::URLRequestFilter::GetInstance()->RemoveHostnameHandler(url.scheme(),
250 url.host());
251 }
252
253 // net::URLRequestJobFactory::ProtocolHandler implementation:
254 net::URLRequestJob* MaybeInterceptRequest(
255 net::URLRequest* request,
256 net::NetworkDelegate* network_delegate) const override {
257 EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO));
258 if (request->url().path() != url_.path())
259 return nullptr;
260 return new PushTimesMockURLRequestJob(request, network_delegate,
261 file_path_);
262 }
263
264 private:
265 TestInterceptor(const GURL& url, const base::FilePath& file_path)
266 : url_(url), file_path_(file_path) {}
267
268 const GURL url_;
269 const base::FilePath file_path_;
270
271 DISALLOW_COPY_AND_ASSIGN(TestInterceptor);
272};
273
[email protected]b9c5d50b2014-01-16 20:37:43274} // namespace
275
[email protected]cc273402009-05-12 09:20:33276class DevToolsSanityTest : public InProcessBrowserTest {
277 public:
[email protected]b3f957e62014-08-08 10:09:02278 DevToolsSanityTest() : window_(NULL) {}
[email protected]cc273402009-05-12 09:20:33279
nick32e53c152015-12-17 19:48:54280 void SetUpOnMainThread() override {
281 host_resolver()->AddRule("*", "127.0.0.1");
282 }
283
[email protected]ff7a8f6f2009-06-10 09:44:36284 protected:
[email protected]f72a1cc2010-04-30 07:17:30285 void RunTest(const std::string& test_name, const std::string& test_page) {
[email protected]b9c5d50b2014-01-16 20:37:43286 OpenDevToolsWindow(test_page, false);
[email protected]ec6d5352011-12-19 14:48:34287 RunTestFunction(window_, test_name.c_str());
[email protected]ff7a8f6f2009-06-10 09:44:36288 CloseDevToolsWindow();
289 }
290
caseqcfbb3faf2016-02-18 19:15:06291 template <typename... T>
292 void RunTestMethod(const char* method, T... args) {
293 DispatchOnTestSuiteSkipCheck(window_, method, args...);
294 }
295
296 template <typename... T>
297 void DispatchAndWait(const char* method, T... args) {
298 DispatchOnTestSuiteSkipCheck(window_, "waitForAsync", method, args...);
299 }
300
301 template <typename... T>
302 void DispatchInPageAndWait(const char* method, T... args) {
303 DispatchAndWait("invokePageFunctionAsync", method, args...);
304 }
305
[email protected]5da96a42013-11-21 06:49:21306 void LoadTestPage(const std::string& test_page) {
svaldeza01f7d92015-11-18 17:47:56307 GURL url = spawned_test_server()->GetURL(test_page);
[email protected]cc273402009-05-12 09:20:33308 ui_test_utils::NavigateToURL(browser(), url);
[email protected]5da96a42013-11-21 06:49:21309 }
310
[email protected]b9c5d50b2014-01-16 20:37:43311 void OpenDevToolsWindow(const std::string& test_page, bool is_docked) {
svaldeza01f7d92015-11-18 17:47:56312 ASSERT_TRUE(spawned_test_server()->Start());
[email protected]5da96a42013-11-21 06:49:21313 LoadTestPage(test_page);
[email protected]cc273402009-05-12 09:20:33314
[email protected]b3f957e62014-08-08 10:09:02315 window_ = DevToolsWindowTesting::OpenDevToolsWindowSync(GetInspectedTab(),
316 is_docked);
[email protected]cc273402009-05-12 09:20:33317 }
318
[email protected]6acde6352012-01-04 16:52:20319 WebContents* GetInspectedTab() {
[email protected]36953572013-01-14 18:38:10320 return browser()->tab_strip_model()->GetWebContentsAt(0);
[email protected]13a6abf82009-10-31 08:42:21321 }
322
[email protected]1b91f5102009-06-09 15:31:30323 void CloseDevToolsWindow() {
[email protected]d118ad72014-07-21 14:07:01324 DevToolsWindowTesting::CloseDevToolsWindowSync(window_);
325 }
326
327 WebContents* main_web_contents() {
328 return DevToolsWindowTesting::Get(window_)->main_web_contents();
329 }
330
331 WebContents* toolbox_web_contents() {
332 return DevToolsWindowTesting::Get(window_)->toolbox_web_contents();
[email protected]1b91f5102009-06-09 15:31:30333 }
334
[email protected]1b91f5102009-06-09 15:31:30335 DevToolsWindow* window_;
[email protected]cc273402009-05-12 09:20:33336};
337
[email protected]a1406cb2013-10-16 14:30:43338// Used to block until a dev tools window gets beforeunload event.
339class DevToolsWindowBeforeUnloadObserver
340 : public content::WebContentsObserver {
341 public:
[email protected]90354712013-11-16 00:06:30342 explicit DevToolsWindowBeforeUnloadObserver(DevToolsWindow*);
343 void Wait();
[email protected]a1406cb2013-10-16 14:30:43344 private:
345 // Invoked when the beforeunload handler fires.
dcheng03748a42014-10-21 10:19:13346 void BeforeUnloadFired(const base::TimeTicks& proceed_time) override;
[email protected]a1406cb2013-10-16 14:30:43347
348 bool m_fired;
[email protected]90354712013-11-16 00:06:30349 scoped_refptr<content::MessageLoopRunner> message_loop_runner_;
[email protected]a1406cb2013-10-16 14:30:43350 DISALLOW_COPY_AND_ASSIGN(DevToolsWindowBeforeUnloadObserver);
351};
352
353DevToolsWindowBeforeUnloadObserver::DevToolsWindowBeforeUnloadObserver(
[email protected]90354712013-11-16 00:06:30354 DevToolsWindow* devtools_window)
[email protected]d118ad72014-07-21 14:07:01355 : WebContentsObserver(
356 DevToolsWindowTesting::Get(devtools_window)->main_web_contents()),
[email protected]a1406cb2013-10-16 14:30:43357 m_fired(false) {
358}
359
[email protected]90354712013-11-16 00:06:30360void DevToolsWindowBeforeUnloadObserver::Wait() {
361 if (m_fired)
362 return;
363 message_loop_runner_ = new content::MessageLoopRunner;
364 message_loop_runner_->Run();
[email protected]a1406cb2013-10-16 14:30:43365}
366
367void DevToolsWindowBeforeUnloadObserver::BeforeUnloadFired(
368 const base::TimeTicks& proceed_time) {
369 m_fired = true;
[email protected]90354712013-11-16 00:06:30370 if (message_loop_runner_.get())
371 message_loop_runner_->Quit();
[email protected]a1406cb2013-10-16 14:30:43372}
373
[email protected]90354712013-11-16 00:06:30374class DevToolsBeforeUnloadTest: public DevToolsSanityTest {
375 public:
376 void CloseInspectedTab() {
377 browser()->tab_strip_model()->CloseWebContentsAt(0,
378 TabStripModel::CLOSE_NONE);
379 }
380
[email protected]d118ad72014-07-21 14:07:01381 void CloseDevToolsWindowAsync() {
382 DevToolsWindowTesting::CloseDevToolsWindow(window_);
[email protected]90354712013-11-16 00:06:30383 }
384
385 void CloseInspectedBrowser() {
386 chrome::CloseWindow(browser());
387 }
[email protected]d118ad72014-07-21 14:07:01388
[email protected]90354712013-11-16 00:06:30389 protected:
390 void InjectBeforeUnloadListener(content::WebContents* web_contents) {
391 ASSERT_TRUE(content::ExecuteScript(web_contents->GetRenderViewHost(),
392 "window.addEventListener('beforeunload',"
393 "function(event) { event.returnValue = 'Foo'; });"));
avi4588bf92017-03-30 21:28:02394 // Disable the hang monitor, otherwise there will be a race between the
395 // beforeunload dialog and the beforeunload hang timer.
396 web_contents->GetMainFrame()->DisableBeforeUnloadHangMonitorForTesting();
[email protected]90354712013-11-16 00:06:30397 }
398
[email protected]b9c5d50b2014-01-16 20:37:43399 void RunBeforeUnloadSanityTest(bool is_docked,
400 base::Callback<void(void)> close_method,
401 bool wait_for_browser_close = true) {
402 OpenDevToolsWindow(kDebuggerTestPage, is_docked);
[email protected]d118ad72014-07-21 14:07:01403 scoped_refptr<content::MessageLoopRunner> runner =
404 new content::MessageLoopRunner;
405 DevToolsWindowTesting::Get(window_)->
406 SetCloseCallback(runner->QuitClosure());
407 InjectBeforeUnloadListener(main_web_contents());
[email protected]90354712013-11-16 00:06:30408 {
409 DevToolsWindowBeforeUnloadObserver before_unload_observer(window_);
410 close_method.Run();
411 CancelModalDialog();
412 before_unload_observer.Wait();
413 }
414 {
415 content::WindowedNotificationObserver close_observer(
416 chrome::NOTIFICATION_BROWSER_CLOSED,
417 content::Source<Browser>(browser()));
418 close_method.Run();
419 AcceptModalDialog();
420 if (wait_for_browser_close)
421 close_observer.Wait();
422 }
[email protected]d118ad72014-07-21 14:07:01423 runner->Run();
[email protected]90354712013-11-16 00:06:30424 }
425
426 DevToolsWindow* OpenDevToolWindowOnWebContents(
[email protected]b9c5d50b2014-01-16 20:37:43427 content::WebContents* contents, bool is_docked) {
[email protected]b3f957e62014-08-08 10:09:02428 DevToolsWindow* window =
429 DevToolsWindowTesting::OpenDevToolsWindowSync(contents, is_docked);
[email protected]90354712013-11-16 00:06:30430 return window;
431 }
432
[email protected]1692b80f72013-11-28 20:08:58433 void OpenDevToolsPopupWindow(DevToolsWindow* devtools_window) {
434 content::WindowedNotificationObserver observer(
435 content::NOTIFICATION_LOAD_STOP,
436 content::NotificationService::AllSources());
437 ASSERT_TRUE(content::ExecuteScript(
[email protected]d118ad72014-07-21 14:07:01438 DevToolsWindowTesting::Get(devtools_window)->
439 main_web_contents()->GetRenderViewHost(),
[email protected]1692b80f72013-11-28 20:08:58440 "window.open(\"\", \"\", \"location=0\");"));
441 observer.Wait();
442 }
443
444 void CloseDevToolsPopupWindow(DevToolsWindow* devtools_window) {
[email protected]d118ad72014-07-21 14:07:01445 DevToolsWindowTesting::CloseDevToolsWindowSync(devtools_window);
[email protected]1692b80f72013-11-28 20:08:58446 }
447
[email protected]90354712013-11-16 00:06:30448 void AcceptModalDialog() {
449 NativeAppModalDialog* native_dialog = GetDialog();
450 native_dialog->AcceptAppModalDialog();
451 }
452
453 void CancelModalDialog() {
454 NativeAppModalDialog* native_dialog = GetDialog();
455 native_dialog->CancelAppModalDialog();
456 }
457
458 NativeAppModalDialog* GetDialog() {
459 AppModalDialog* dialog = ui_test_utils::WaitForAppModalDialog();
460 EXPECT_TRUE(dialog->IsJavaScriptModalDialog());
461 JavaScriptAppModalDialog* js_dialog =
462 static_cast<JavaScriptAppModalDialog*>(dialog);
463 NativeAppModalDialog* native_dialog = js_dialog->native_dialog();
464 EXPECT_TRUE(native_dialog);
465 return native_dialog;
466 }
467};
468
[email protected]4207d2b2011-11-28 18:09:21469void TimeoutCallback(const std::string& timeout_message) {
[email protected]b946b422014-03-18 22:53:40470 ADD_FAILURE() << timeout_message;
ki.stfuc4f8e242015-10-09 20:40:20471 base::MessageLoop::current()->QuitWhenIdle();
[email protected]4207d2b2011-11-28 18:09:21472}
[email protected]680bc222009-10-27 10:46:22473
[email protected]2c7b4d72009-10-21 07:17:17474// Base class for DevTools tests that test devtools functionality for
475// extensions and content scripts.
[email protected]fb996d32011-12-21 12:55:30476class DevToolsExtensionTest : public DevToolsSanityTest,
477 public content::NotificationObserver {
[email protected]2c7b4d72009-10-21 07:17:17478 public:
[email protected]fb996d32011-12-21 12:55:30479 DevToolsExtensionTest() : DevToolsSanityTest() {
[email protected]2c7b4d72009-10-21 07:17:17480 PathService::Get(chrome::DIR_TEST_DATA, &test_extensions_dir_);
481 test_extensions_dir_ = test_extensions_dir_.AppendASCII("devtools");
482 test_extensions_dir_ = test_extensions_dir_.AppendASCII("extensions");
483 }
484
485 protected:
[email protected]4207d2b2011-11-28 18:09:21486 // Load an extension from test\data\devtools\extensions\<extension_name>
[email protected]2c7b4d72009-10-21 07:17:17487 void LoadExtension(const char* extension_name) {
[email protected]650b2d52013-02-10 03:41:45488 base::FilePath path = test_extensions_dir_.AppendASCII(extension_name);
[email protected]2c7b4d72009-10-21 07:17:17489 ASSERT_TRUE(LoadExtensionFromPath(path)) << "Failed to load extension.";
490 }
491
nick32e53c152015-12-17 19:48:54492 const Extension* LoadExtensionFromPath(const base::FilePath& path) {
[email protected]06bdd2b2012-11-30 18:47:13493 ExtensionService* service = extensions::ExtensionSystem::Get(
494 browser()->profile())->extension_service();
reillyga3acbc12014-11-11 23:17:12495 extensions::ExtensionRegistry* registry =
496 extensions::ExtensionRegistry::Get(browser()->profile());
limasdff3a0c5ef2017-02-28 01:30:38497 extensions::TestExtensionRegistryObserver observer(registry);
498 extensions::UnpackedInstaller::Create(service)->Load(path);
499 observer.WaitForExtensionLoaded();
[email protected]680bc222009-10-27 10:46:22500
nick32e53c152015-12-17 19:48:54501 if (!WaitForExtensionViewsToLoad())
502 return nullptr;
503
504 return GetExtensionByPath(registry->enabled_extensions(), path);
505 }
506
davidsac88a1aa72017-03-30 21:10:41507 // Loads a dynamically generated extension populated with a bunch of test
508 // pages. |name| is the extension name to use in the manifest.
509 // |devtools_page|, if non-empty, indicates which test page should be be
510 // listed as a devtools_page in the manifest. If |devtools_page| is empty, a
511 // non-devtools extension is created instead. |panel_iframe_src| controls the
512 // src= attribute of the <iframe> element in the 'panel.html' test page.
513 const Extension* LoadExtensionForTest(const std::string& name,
514 const std::string& devtools_page,
515 const std::string& panel_iframe_src) {
516 test_extension_dirs_.push_back(
517 base::MakeUnique<extensions::TestExtensionDir>());
518 extensions::TestExtensionDir* dir = test_extension_dirs_.back().get();
519
520 extensions::DictionaryBuilder manifest;
521 manifest.Set("name", name)
522 .Set("version", "1")
523 .Set("manifest_version", 2)
524 // simple_test_page.html is currently the only page referenced outside
525 // of its own extension in the tests
526 .Set("web_accessible_resources",
527 extensions::ListBuilder().Append("simple_test_page.html").Build());
528
529 // If |devtools_page| isn't empty, make it a devtools extension in the
530 // manifest.
531 if (!devtools_page.empty())
532 manifest.Set("devtools_page", devtools_page);
533
534 dir->WriteManifest(manifest.ToJSON());
535
536 GURL http_frame_url =
537 embedded_test_server()->GetURL("a.com", "/popup_iframe.html");
538
539 // If this is a devtools extension, |devtools_page| will indicate which of
540 // these devtools_pages will end up being used. Different tests use
541 // different devtools_pages.
542 dir->WriteFile(FILE_PATH_LITERAL("web_devtools_page.html"),
543 "<html><body><iframe src='" + http_frame_url.spec() +
544 "'></iframe></body></html>");
545
546 dir->WriteFile(FILE_PATH_LITERAL("simple_devtools_page.html"),
547 "<html><body></body></html>");
548
549 dir->WriteFile(
550 FILE_PATH_LITERAL("panel_devtools_page.html"),
551 "<html><head><script "
552 "src='panel_devtools_page.js'></script></head><body></body></html>");
553
554 dir->WriteFile(FILE_PATH_LITERAL("panel_devtools_page.js"),
555 "chrome.devtools.panels.create('iframe_panel',\n"
556 " null,\n"
557 " 'panel.html',\n"
558 " function(panel) {\n"
559 " chrome.devtools.inspectedWindow.eval(\n"
560 " 'console.log(\"PASS\")');\n"
561 " }\n"
562 ");\n");
563
564 dir->WriteFile(FILE_PATH_LITERAL("sidebarpane_devtools_page.html"),
565 "<html><head><script src='sidebarpane_devtools_page.js'>"
566 "</script></head><body></body></html>");
567
568 dir->WriteFile(
569 FILE_PATH_LITERAL("sidebarpane_devtools_page.js"),
570 "chrome.devtools.panels.elements.createSidebarPane('iframe_pane',\n"
571 " function(sidebar) {\n"
572 " chrome.devtools.inspectedWindow.eval(\n"
573 " 'console.log(\"PASS\")');\n"
574 " sidebar.setPage('panel.html');\n"
575 " }\n"
576 ");\n");
577
578 dir->WriteFile(FILE_PATH_LITERAL("panel.html"),
579 "<html><body><iframe src='" + panel_iframe_src +
580 "'></iframe></body></html>");
581
582 dir->WriteFile(FILE_PATH_LITERAL("simple_test_page.html"),
583 "<html><body>This is a test</body></html>");
584
585 GURL web_url = embedded_test_server()->GetURL("a.com", "/title3.html");
586
587 dir->WriteFile(FILE_PATH_LITERAL("multi_frame_page.html"),
588 "<html><body><iframe src='about:blank'>"
589 "</iframe><iframe src='data:text/html,foo'>"
590 "</iframe><iframe src='" +
591 web_url.spec() + "'></iframe></body></html>");
592
593 // Install the extension.
594 return LoadExtensionFromPath(dir->UnpackedPath());
595 }
596
nick32e53c152015-12-17 19:48:54597 private:
598 const Extension* GetExtensionByPath(
599 const extensions::ExtensionSet& extensions,
600 const base::FilePath& path) {
jam3f2d3932017-04-26 20:28:51601 base::ThreadRestrictions::ScopedAllowIO allow_io;
nick32e53c152015-12-17 19:48:54602 base::FilePath extension_path = base::MakeAbsoluteFilePath(path);
603 EXPECT_TRUE(!extension_path.empty());
604 for (const scoped_refptr<const Extension>& extension : extensions) {
605 if (extension->path() == extension_path) {
606 return extension.get();
607 }
608 }
609 return nullptr;
[email protected]680bc222009-10-27 10:46:22610 }
611
[email protected]d1fe1352012-04-26 00:47:32612 bool WaitForExtensionViewsToLoad() {
613 // Wait for all the extension render views that exist to finish loading.
614 // NOTE: This assumes that the extension views list is not changing while
[email protected]680bc222009-10-27 10:46:22615 // this method is running.
616
[email protected]6c2381d2011-10-19 02:52:53617 content::NotificationRegistrar registrar;
[email protected]adf5a102014-07-31 12:44:06618 registrar.Add(this,
kalmanfd474fa2015-03-16 22:30:57619 extensions::NOTIFICATION_EXTENSION_HOST_DID_STOP_FIRST_LOAD,
[email protected]ad50def52011-10-19 23:17:07620 content::NotificationService::AllSources());
[email protected]d4d57df2011-11-30 20:33:52621 base::CancelableClosure timeout(
[email protected]4207d2b2011-11-28 18:09:21622 base::Bind(&TimeoutCallback, "Extension host load timed out."));
skyostil02598352015-06-12 12:37:25623 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
[email protected]4173deb2013-06-07 15:21:04624 FROM_HERE, timeout.callback(), TestTimeouts::action_timeout());
[email protected]680bc222009-10-27 10:46:22625
[email protected]98b6d942013-11-10 00:34:07626 extensions::ProcessManager* manager =
reillyg0ea3fa902014-10-28 15:30:23627 extensions::ProcessManager::Get(browser()->profile());
rdevlin.cronin6ae04a012015-04-03 20:19:40628 extensions::ProcessManager::FrameSet all_frames = manager->GetAllFrames();
629 for (extensions::ProcessManager::FrameSet::const_iterator iter =
630 all_frames.begin();
631 iter != all_frames.end();) {
632 if (!content::WebContents::FromRenderFrameHost(*iter)->IsLoading())
[email protected]680bc222009-10-27 10:46:22633 ++iter;
634 else
[email protected]729eb632012-07-26 04:45:26635 content::RunMessageLoop();
[email protected]680bc222009-10-27 10:46:22636 }
637
[email protected]4207d2b2011-11-28 18:09:21638 timeout.Cancel();
[email protected]680bc222009-10-27 10:46:22639 return true;
[email protected]2c7b4d72009-10-21 07:17:17640 }
641
dcheng03748a42014-10-21 10:19:13642 void Observe(int type,
643 const content::NotificationSource& source,
644 const content::NotificationDetails& details) override {
limasdff3a0c5ef2017-02-28 01:30:38645 DCHECK_EQ(extensions::NOTIFICATION_EXTENSION_HOST_DID_STOP_FIRST_LOAD,
646 type);
647 base::MessageLoopForUI::current()->QuitWhenIdle();
[email protected]2c7b4d72009-10-21 07:17:17648 }
649
davidsac88a1aa72017-03-30 21:10:41650 std::vector<std::unique_ptr<extensions::TestExtensionDir>>
651 test_extension_dirs_;
[email protected]650b2d52013-02-10 03:41:45652 base::FilePath test_extensions_dir_;
[email protected]2c7b4d72009-10-21 07:17:17653};
654
[email protected]e89c05a2011-12-26 08:51:57655class DevToolsExperimentalExtensionTest : public DevToolsExtensionTest {
656 public:
avi3ef9ec9e2014-12-22 22:50:17657 void SetUpCommandLine(base::CommandLine* command_line) override {
[email protected]c8d02992013-07-31 22:16:51658 command_line->AppendSwitch(
659 extensions::switches::kEnableExperimentalExtensionApis);
[email protected]e89c05a2011-12-26 08:51:57660 }
661};
662
[email protected]1fcef592011-07-20 07:16:36663class WorkerDevToolsSanityTest : public InProcessBrowserTest {
664 public:
[email protected]90ca44272012-07-18 18:15:48665 WorkerDevToolsSanityTest() : window_(NULL) {}
[email protected]1fcef592011-07-20 07:16:36666
667 protected:
[email protected]649d1c02012-04-27 02:56:21668 class WorkerData : public base::RefCountedThreadSafe<WorkerData> {
669 public:
[email protected]d9ddc0d2011-10-12 08:40:12670 WorkerData() : worker_process_id(0), worker_route_id(0) {}
[email protected]cf3b40e32011-08-02 06:45:03671 int worker_process_id;
672 int worker_route_id;
[email protected]649d1c02012-04-27 02:56:21673
674 private:
675 friend class base::RefCountedThreadSafe<WorkerData>;
676 ~WorkerData() {}
[email protected]d9ddc0d2011-10-12 08:40:12677 };
678
679 class WorkerCreationObserver : public WorkerServiceObserver {
680 public:
yurys48be075f2014-10-16 09:04:21681 explicit WorkerCreationObserver(const std::string& path,
682 WorkerData* worker_data)
683 : path_(path), worker_data_(worker_data) {}
[email protected]d9ddc0d2011-10-12 08:40:12684
685 private:
dcheng03748a42014-10-21 10:19:13686 ~WorkerCreationObserver() override {}
[email protected]d9ddc0d2011-10-12 08:40:12687
dcheng03748a42014-10-21 10:19:13688 void WorkerCreated(const GURL& url,
689 const base::string16& name,
690 int process_id,
691 int route_id) override {
yurys48be075f2014-10-16 09:04:21692 if (url.path().rfind(path_) == std::string::npos)
693 return;
[email protected]62151052012-02-01 18:40:48694 worker_data_->worker_process_id = process_id;
695 worker_data_->worker_route_id = route_id;
[email protected]d9ddc0d2011-10-12 08:40:12696 WorkerService::GetInstance()->RemoveObserver(this);
697 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
ki.stfuc4f8e242015-10-09 20:40:20698 base::MessageLoop::QuitWhenIdleClosure());
[email protected]d9ddc0d2011-10-12 08:40:12699 delete this;
700 }
yurys48be075f2014-10-16 09:04:21701 std::string path_;
[email protected]d9ddc0d2011-10-12 08:40:12702 scoped_refptr<WorkerData> worker_data_;
[email protected]cf3b40e32011-08-02 06:45:03703 };
704
[email protected]867fd9232011-10-17 06:32:34705 class WorkerTerminationObserver : public WorkerServiceObserver {
706 public:
707 explicit WorkerTerminationObserver(WorkerData* worker_data)
708 : worker_data_(worker_data) {
709 }
710
711 private:
dcheng03748a42014-10-21 10:19:13712 ~WorkerTerminationObserver() override {}
[email protected]867fd9232011-10-17 06:32:34713
dcheng03748a42014-10-21 10:19:13714 void WorkerDestroyed(int process_id, int route_id) override {
[email protected]62151052012-02-01 18:40:48715 ASSERT_EQ(worker_data_->worker_process_id, process_id);
716 ASSERT_EQ(worker_data_->worker_route_id, route_id);
[email protected]867fd9232011-10-17 06:32:34717 WorkerService::GetInstance()->RemoveObserver(this);
718 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
ki.stfuc4f8e242015-10-09 20:40:20719 base::MessageLoop::QuitWhenIdleClosure());
[email protected]867fd9232011-10-17 06:32:34720 delete this;
721 }
[email protected]867fd9232011-10-17 06:32:34722 scoped_refptr<WorkerData> worker_data_;
723 };
724
yurys48be075f2014-10-16 09:04:21725 void RunTest(const char* test_name,
726 const char* test_page,
727 const char* worker_path) {
svaldeza01f7d92015-11-18 17:47:56728 ASSERT_TRUE(spawned_test_server()->Start());
729 GURL url = spawned_test_server()->GetURL(test_page);
[email protected]1fcef592011-07-20 07:16:36730 ui_test_utils::NavigateToURL(browser(), url);
731
yurys48be075f2014-10-16 09:04:21732 scoped_refptr<WorkerData> worker_data =
733 WaitForFirstSharedWorker(worker_path);
[email protected]867fd9232011-10-17 06:32:34734 OpenDevToolsWindowForSharedWorker(worker_data.get());
[email protected]ec6d5352011-12-19 14:48:34735 RunTestFunction(window_, test_name);
[email protected]1fcef592011-07-20 07:16:36736 CloseDevToolsWindow();
737 }
738
[email protected]62151052012-02-01 18:40:48739 static void TerminateWorkerOnIOThread(scoped_refptr<WorkerData> worker_data) {
[email protected]b946b422014-03-18 22:53:40740 if (!WorkerService::GetInstance()->TerminateWorker(
741 worker_data->worker_process_id, worker_data->worker_route_id))
742 FAIL() << "Failed to terminate worker.\n";
743 WorkerService::GetInstance()->AddObserver(
744 new WorkerTerminationObserver(worker_data.get()));
[email protected]867fd9232011-10-17 06:32:34745 }
746
747 static void TerminateWorker(scoped_refptr<WorkerData> worker_data) {
[email protected]900c3b22011-10-22 00:55:29748 BrowserThread::PostTask(
749 BrowserThread::IO, FROM_HERE,
tzik93bf8a72017-04-24 18:53:30750 base::BindOnce(&TerminateWorkerOnIOThread, worker_data));
[email protected]729eb632012-07-26 04:45:26751 content::RunMessageLoop();
[email protected]867fd9232011-10-17 06:32:34752 }
753
[email protected]cf3b40e32011-08-02 06:45:03754 static void WaitForFirstSharedWorkerOnIOThread(
yurys48be075f2014-10-16 09:04:21755 const std::string& path,
[email protected]d9ddc0d2011-10-12 08:40:12756 scoped_refptr<WorkerData> worker_data) {
[email protected]62151052012-02-01 18:40:48757 std::vector<WorkerService::WorkerInfo> worker_info =
758 WorkerService::GetInstance()->GetWorkers();
yurys48be075f2014-10-16 09:04:21759 for (size_t i = 0; i < worker_info.size(); i++) {
760 if (worker_info[i].url.path().rfind(path) == std::string::npos)
761 continue;
[email protected]62151052012-02-01 18:40:48762 worker_data->worker_process_id = worker_info[0].process_id;
763 worker_data->worker_route_id = worker_info[0].route_id;
764 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
ki.stfuc4f8e242015-10-09 20:40:20765 base::MessageLoop::QuitWhenIdleClosure());
[email protected]62151052012-02-01 18:40:48766 return;
[email protected]1fcef592011-07-20 07:16:36767 }
[email protected]d9ddc0d2011-10-12 08:40:12768
769 WorkerService::GetInstance()->AddObserver(
yurys48be075f2014-10-16 09:04:21770 new WorkerCreationObserver(path, worker_data.get()));
[email protected]1fcef592011-07-20 07:16:36771 }
772
yurys48be075f2014-10-16 09:04:21773 static scoped_refptr<WorkerData> WaitForFirstSharedWorker(const char* path) {
[email protected]cf3b40e32011-08-02 06:45:03774 scoped_refptr<WorkerData> worker_data(new WorkerData());
[email protected]900c3b22011-10-22 00:55:29775 BrowserThread::PostTask(
tzik93bf8a72017-04-24 18:53:30776 BrowserThread::IO, FROM_HERE,
777 base::BindOnce(&WaitForFirstSharedWorkerOnIOThread, path, worker_data));
[email protected]729eb632012-07-26 04:45:26778 content::RunMessageLoop();
[email protected]867fd9232011-10-17 06:32:34779 return worker_data;
780 }
[email protected]cf3b40e32011-08-02 06:45:03781
[email protected]867fd9232011-10-17 06:32:34782 void OpenDevToolsWindowForSharedWorker(WorkerData* worker_data) {
[email protected]cf3b40e32011-08-02 06:45:03783 Profile* profile = browser()->profile();
[email protected]70fd1e82012-12-26 15:08:10784 scoped_refptr<DevToolsAgentHost> agent_host(
[email protected]98f66112012-12-25 12:59:36785 DevToolsAgentHost::GetForWorker(
[email protected]b3762af2011-09-08 06:23:46786 worker_data->worker_process_id,
[email protected]70fd1e82012-12-26 15:08:10787 worker_data->worker_route_id));
[email protected]d118ad72014-07-21 14:07:01788 window_ = DevToolsWindowTesting::OpenDevToolsWindowForWorkerSync(
dchengf4b56572014-08-27 06:59:37789 profile, agent_host.get());
[email protected]1fcef592011-07-20 07:16:36790 }
791
792 void CloseDevToolsWindow() {
[email protected]d118ad72014-07-21 14:07:01793 DevToolsWindowTesting::CloseDevToolsWindowSync(window_);
[email protected]1fcef592011-07-20 07:16:36794 }
795
796 DevToolsWindow* window_;
797};
798
[email protected]90354712013-11-16 00:06:30799// Tests that BeforeUnload event gets called on docked devtools if
800// we try to close them.
801IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest, TestDockedDevToolsClose) {
[email protected]b9c5d50b2014-01-16 20:37:43802 RunBeforeUnloadSanityTest(true, base::Bind(
tzike04a1472016-08-02 21:00:33803 &DevToolsBeforeUnloadTest::CloseDevToolsWindowAsync,
804 base::Unretained(this)), false);
[email protected]90354712013-11-16 00:06:30805}
806
807// Tests that BeforeUnload event gets called on docked devtools if
808// we try to close the inspected page.
809IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest,
avi64b8b65b2017-03-29 18:50:34810 TestDockedDevToolsInspectedTabClose) {
[email protected]b9c5d50b2014-01-16 20:37:43811 RunBeforeUnloadSanityTest(true, base::Bind(
tzike04a1472016-08-02 21:00:33812 &DevToolsBeforeUnloadTest::CloseInspectedTab,
813 base::Unretained(this)));
[email protected]90354712013-11-16 00:06:30814}
815
816// Tests that BeforeUnload event gets called on docked devtools if
817// we try to close the inspected browser.
818IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest,
avi64b8b65b2017-03-29 18:50:34819 TestDockedDevToolsInspectedBrowserClose) {
[email protected]b9c5d50b2014-01-16 20:37:43820 RunBeforeUnloadSanityTest(true, base::Bind(
tzike04a1472016-08-02 21:00:33821 &DevToolsBeforeUnloadTest::CloseInspectedBrowser,
822 base::Unretained(this)));
[email protected]90354712013-11-16 00:06:30823}
824
825// Tests that BeforeUnload event gets called on undocked devtools if
826// we try to close them.
avi64b8b65b2017-03-29 18:50:34827IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest, TestUndockedDevToolsClose) {
[email protected]b9c5d50b2014-01-16 20:37:43828 RunBeforeUnloadSanityTest(false, base::Bind(
tzike04a1472016-08-02 21:00:33829 &DevToolsBeforeUnloadTest::CloseDevToolsWindowAsync,
830 base::Unretained(this)), false);
[email protected]90354712013-11-16 00:06:30831}
832
833// Tests that BeforeUnload event gets called on undocked devtools if
834// we try to close the inspected page.
835IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest,
avi64b8b65b2017-03-29 18:50:34836 TestUndockedDevToolsInspectedTabClose) {
[email protected]b9c5d50b2014-01-16 20:37:43837 RunBeforeUnloadSanityTest(false, base::Bind(
tzike04a1472016-08-02 21:00:33838 &DevToolsBeforeUnloadTest::CloseInspectedTab,
839 base::Unretained(this)));
[email protected]90354712013-11-16 00:06:30840}
841
842// Tests that BeforeUnload event gets called on undocked devtools if
843// we try to close the inspected browser.
844IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest,
avi64b8b65b2017-03-29 18:50:34845 TestUndockedDevToolsInspectedBrowserClose) {
[email protected]b9c5d50b2014-01-16 20:37:43846 RunBeforeUnloadSanityTest(false, base::Bind(
tzike04a1472016-08-02 21:00:33847 &DevToolsBeforeUnloadTest::CloseInspectedBrowser,
848 base::Unretained(this)));
[email protected]90354712013-11-16 00:06:30849}
850
851// Tests that BeforeUnload event gets called on undocked devtools if
852// we try to exit application.
853IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest,
avi64b8b65b2017-03-29 18:50:34854 TestUndockedDevToolsApplicationClose) {
[email protected]b9c5d50b2014-01-16 20:37:43855 RunBeforeUnloadSanityTest(false, base::Bind(
[email protected]90354712013-11-16 00:06:30856 &chrome::CloseAllBrowsers));
857}
858
[email protected]c0da7c12013-11-27 19:07:00859// Tests that inspected tab gets closed if devtools renderer
860// becomes unresponsive during beforeunload event interception.
861// @see http://crbug.com/322380
lushnikovcf05b642015-11-04 00:10:13862// Disabled because of http://crbug.com/410327
avi64b8b65b2017-03-29 18:50:34863IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest,
lushnikovcf05b642015-11-04 00:10:13864 DISABLED_TestUndockedDevToolsUnresponsive) {
svaldeza01f7d92015-11-18 17:47:56865 ASSERT_TRUE(spawned_test_server()->Start());
[email protected]c0da7c12013-11-27 19:07:00866 LoadTestPage(kDebuggerTestPage);
867 DevToolsWindow* devtools_window = OpenDevToolWindowOnWebContents(
[email protected]b9c5d50b2014-01-16 20:37:43868 GetInspectedTab(), false);
[email protected]d118ad72014-07-21 14:07:01869
870 scoped_refptr<content::MessageLoopRunner> runner =
871 new content::MessageLoopRunner;
872 DevToolsWindowTesting::Get(devtools_window)->SetCloseCallback(
873 runner->QuitClosure());
[email protected]c0da7c12013-11-27 19:07:00874
875 ASSERT_TRUE(content::ExecuteScript(
[email protected]d118ad72014-07-21 14:07:01876 DevToolsWindowTesting::Get(devtools_window)->main_web_contents()->
877 GetRenderViewHost(),
[email protected]c0da7c12013-11-27 19:07:00878 "window.addEventListener('beforeunload',"
879 "function(event) { while (true); });"));
880 CloseInspectedTab();
[email protected]d118ad72014-07-21 14:07:01881 runner->Run();
[email protected]c0da7c12013-11-27 19:07:00882}
883
[email protected]1692b80f72013-11-28 20:08:58884// Tests that closing worker inspector window does not cause browser crash
885// @see http://crbug.com/323031
886IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest,
887 TestWorkerWindowClosing) {
svaldeza01f7d92015-11-18 17:47:56888 ASSERT_TRUE(spawned_test_server()->Start());
[email protected]1692b80f72013-11-28 20:08:58889 LoadTestPage(kDebuggerTestPage);
890 DevToolsWindow* devtools_window = OpenDevToolWindowOnWebContents(
[email protected]b9c5d50b2014-01-16 20:37:43891 GetInspectedTab(), false);
[email protected]1692b80f72013-11-28 20:08:58892
893 OpenDevToolsPopupWindow(devtools_window);
894 CloseDevToolsPopupWindow(devtools_window);
895}
896
[email protected]90354712013-11-16 00:06:30897// Tests that BeforeUnload event gets called on devtools that are opened
898// on another devtools.
[email protected]68b36ac2013-11-19 23:56:03899IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest,
kozyatinskiy6e281632016-06-09 18:08:56900 TestDevToolsOnDevTools) {
svaldeza01f7d92015-11-18 17:47:56901 ASSERT_TRUE(spawned_test_server()->Start());
[email protected]5da96a42013-11-21 06:49:21902 LoadTestPage(kDebuggerTestPage);
[email protected]90354712013-11-16 00:06:30903
904 std::vector<DevToolsWindow*> windows;
905 std::vector<content::WindowedNotificationObserver*> close_observers;
906 content::WebContents* inspected_web_contents = GetInspectedTab();
907 for (int i = 0; i < 3; ++i) {
908 DevToolsWindow* devtools_window = OpenDevToolWindowOnWebContents(
[email protected]b9c5d50b2014-01-16 20:37:43909 inspected_web_contents, i == 0);
[email protected]90354712013-11-16 00:06:30910 windows.push_back(devtools_window);
911 content::WindowedNotificationObserver* close_observer =
912 new content::WindowedNotificationObserver(
913 content::NOTIFICATION_WEB_CONTENTS_DESTROYED,
914 content::Source<content::WebContents>(
[email protected]d118ad72014-07-21 14:07:01915 DevToolsWindowTesting::Get(devtools_window)->
916 main_web_contents()));
[email protected]90354712013-11-16 00:06:30917 close_observers.push_back(close_observer);
[email protected]d118ad72014-07-21 14:07:01918 inspected_web_contents =
919 DevToolsWindowTesting::Get(devtools_window)->main_web_contents();
[email protected]90354712013-11-16 00:06:30920 }
921
[email protected]d118ad72014-07-21 14:07:01922 InjectBeforeUnloadListener(
923 DevToolsWindowTesting::Get(windows[0])->main_web_contents());
924 InjectBeforeUnloadListener(
925 DevToolsWindowTesting::Get(windows[2])->main_web_contents());
[email protected]90354712013-11-16 00:06:30926 // Try to close second devtools.
927 {
928 content::WindowedNotificationObserver cancel_browser(
929 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED,
930 content::NotificationService::AllSources());
[email protected]d118ad72014-07-21 14:07:01931 chrome::CloseWindow(DevToolsWindowTesting::Get(windows[1])->browser());
[email protected]90354712013-11-16 00:06:30932 CancelModalDialog();
933 cancel_browser.Wait();
934 }
935 // Try to close browser window.
936 {
937 content::WindowedNotificationObserver cancel_browser(
938 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED,
939 content::NotificationService::AllSources());
940 chrome::CloseWindow(browser());
941 AcceptModalDialog();
942 CancelModalDialog();
943 cancel_browser.Wait();
944 }
945 // Try to exit application.
946 {
947 content::WindowedNotificationObserver close_observer(
948 chrome::NOTIFICATION_BROWSER_CLOSED,
949 content::Source<Browser>(browser()));
950 chrome::CloseAllBrowsers();
951 AcceptModalDialog();
952 AcceptModalDialog();
953 close_observer.Wait();
954 }
955 for (size_t i = 0; i < close_observers.size(); ++i) {
956 close_observers[i]->Wait();
957 delete close_observers[i];
958 }
[email protected]a1406cb2013-10-16 14:30:43959}
[email protected]1fcef592011-07-20 07:16:36960
[email protected]3f5866e2009-07-01 07:25:16961// Tests scripts panel showing.
[email protected]2565b872014-08-01 11:57:52962IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestShowScriptsTab) {
[email protected]3f5866e2009-07-01 07:25:16963 RunTest("testShowScriptsTab", kDebuggerTestPage);
[email protected]a2f20232009-06-30 15:06:57964}
965
[email protected]13a6abf82009-10-31 08:42:21966// Tests that scripts tab is populated with inspected scripts even if it
967// hadn't been shown by the moment inspected paged refreshed.
968// @see http://crbug.com/26312
[email protected]a9b82d32012-01-25 19:55:38969IN_PROC_BROWSER_TEST_F(
970 DevToolsSanityTest,
oshima98205bc2015-06-19 19:52:42971 TestScriptsTabIsPopulatedOnInspectedPageRefresh) {
[email protected]13a6abf82009-10-31 08:42:21972 RunTest("testScriptsTabIsPopulatedOnInspectedPageRefresh",
973 kDebuggerTestPage);
974}
975
[email protected]e89c05a2011-12-26 08:51:57976// Tests that chrome.devtools extension is correctly exposed.
[email protected]fb996d32011-12-21 12:55:30977IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest,
[email protected]e89c05a2011-12-26 08:51:57978 TestDevToolsExtensionAPI) {
[email protected]ec6d5352011-12-19 14:48:34979 LoadExtension("devtools_extension");
[email protected]007b3f82013-04-09 08:46:45980 RunTest("waitForTestResultsInConsole", std::string());
[email protected]ec6d5352011-12-19 14:48:34981}
982
davidsac88a1aa72017-03-30 21:10:41983// Tests that http Iframes within the visible devtools panel for the devtools
984// extension are rendered in their own processes and not in the devtools process
985// or the extension's process. This is tested because this is one of the
986// extension pages with devtools access
987// (https://developer.chrome.com/extensions/devtools). Also tests that frames
988// with data URLs and about:blank URLs are rendered in the devtools process,
989// unless a web OOPIF navigates itself to about:blank, in which case it does not
990// end up back in the devtools process. Also tests that when a web IFrame is
991// navigated back to a devtools extension page, it gets put back in the devtools
992// process.
993// http://crbug.com/570483
994IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest,
995 HttpIframeInDevToolsExtensionPanel) {
nick32e53c152015-12-17 19:48:54996 ASSERT_TRUE(embedded_test_server()->Start());
997
davidsac88a1aa72017-03-30 21:10:41998 // Install the dynamically-generated extension.
999 const Extension* extension =
1000 LoadExtensionForTest("Devtools Extension", "panel_devtools_page.html",
1001 "/multi_frame_page.html");
nick32e53c152015-12-17 19:48:541002 ASSERT_TRUE(extension);
1003
nick32e53c152015-12-17 19:48:541004 OpenDevToolsWindow(kDebuggerTestPage, false);
1005
davidsac88a1aa72017-03-30 21:10:411006 // Wait for the extension's panel to finish loading -- it'll output 'PASS'
nick32e53c152015-12-17 19:48:541007 // when it's installed. waitForTestResultsInConsole waits until that 'PASS'.
1008 RunTestFunction(window_, "waitForTestResultsInConsole");
1009
davidsac88a1aa72017-03-30 21:10:411010 // Now that we know the panel is loaded, switch to it.
1011 SwitchToExtensionPanel(window_, extension, "iframe_panel");
1012 content::WaitForLoadStop(main_web_contents());
1013
1014 std::vector<RenderFrameHost*> rfhs = main_web_contents()->GetAllFrames();
1015 EXPECT_EQ(7U, rfhs.size());
1016
1017 // This test creates a page with the following frame tree:
1018 // - DevTools
1019 // - devtools_page from DevTools extension
1020 // - Panel (DevTools extension)
1021 // - iframe (DevTools extension)
1022 // - about:blank
1023 // - data:
1024 // - web URL
1025
1026 RenderFrameHost* main_devtools_rfh = main_web_contents()->GetMainFrame();
1027 RenderFrameHost* devtools_extension_devtools_page_rfh =
1028 ChildFrameAt(main_devtools_rfh, 0);
1029 RenderFrameHost* devtools_extension_panel_rfh =
1030 ChildFrameAt(main_devtools_rfh, 1);
1031 RenderFrameHost* panel_frame_rfh =
1032 ChildFrameAt(devtools_extension_panel_rfh, 0);
1033 RenderFrameHost* about_blank_frame_rfh = ChildFrameAt(panel_frame_rfh, 0);
1034 RenderFrameHost* data_frame_rfh = ChildFrameAt(panel_frame_rfh, 1);
1035 RenderFrameHost* web_frame_rfh = ChildFrameAt(panel_frame_rfh, 2);
1036
1037 GURL web_url = embedded_test_server()->GetURL("a.com", "/title3.html");
1038 GURL about_blank_url = GURL(url::kAboutBlankURL);
1039 GURL data_url = GURL("data:text/html,foo");
1040
1041 EXPECT_TRUE(main_devtools_rfh->GetLastCommittedURL().SchemeIs(
1042 content::kChromeDevToolsScheme));
1043 EXPECT_EQ(extension->GetResourceURL("/panel_devtools_page.html"),
1044 devtools_extension_devtools_page_rfh->GetLastCommittedURL());
1045 EXPECT_EQ(extension->GetResourceURL("/panel.html"),
1046 devtools_extension_panel_rfh->GetLastCommittedURL());
1047 EXPECT_EQ(extension->GetResourceURL("/multi_frame_page.html"),
1048 panel_frame_rfh->GetLastCommittedURL());
1049 EXPECT_EQ(about_blank_url, about_blank_frame_rfh->GetLastCommittedURL());
1050 EXPECT_EQ(data_url, data_frame_rfh->GetLastCommittedURL());
1051 EXPECT_EQ(web_url, web_frame_rfh->GetLastCommittedURL());
1052
1053 content::SiteInstance* devtools_instance =
1054 main_devtools_rfh->GetSiteInstance();
1055 EXPECT_TRUE(
1056 devtools_instance->GetSiteURL().SchemeIs(content::kChromeDevToolsScheme));
1057 EXPECT_EQ(devtools_instance,
1058 devtools_extension_devtools_page_rfh->GetSiteInstance());
1059 EXPECT_EQ(devtools_instance, devtools_extension_panel_rfh->GetSiteInstance());
1060 EXPECT_EQ(devtools_instance, panel_frame_rfh->GetSiteInstance());
1061 EXPECT_EQ(devtools_instance, about_blank_frame_rfh->GetSiteInstance());
1062 EXPECT_EQ(devtools_instance, data_frame_rfh->GetSiteInstance());
1063 EXPECT_EQ(web_url.host(),
1064 web_frame_rfh->GetSiteInstance()->GetSiteURL().host());
1065 EXPECT_NE(devtools_instance, web_frame_rfh->GetSiteInstance());
1066
1067 // Check that if the web iframe navigates itself to about:blank, it stays in
1068 // the web SiteInstance.
1069 std::string about_blank_javascript = "location.href='about:blank';";
1070
1071 content::TestNavigationManager web_about_blank_manager(main_web_contents(),
1072 about_blank_url);
1073
1074 ASSERT_TRUE(content::ExecuteScript(web_frame_rfh, about_blank_javascript));
1075
1076 web_about_blank_manager.WaitForNavigationFinished();
1077
1078 EXPECT_EQ(about_blank_url, web_frame_rfh->GetLastCommittedURL());
1079 EXPECT_EQ(web_url.host(),
1080 web_frame_rfh->GetSiteInstance()->GetSiteURL().host());
1081 EXPECT_NE(devtools_instance, web_frame_rfh->GetSiteInstance());
1082
1083 // Check that if the web IFrame is navigated back to a devtools extension
1084 // page, it gets put back in the devtools process.
1085 GURL extension_simple_url =
1086 extension->GetResourceURL("/simple_test_page.html");
1087 std::string renavigation_javascript =
1088 "location.href='" + extension_simple_url.spec() + "';";
1089
1090 content::TestNavigationManager renavigation_manager(main_web_contents(),
1091 extension_simple_url);
1092
1093 ASSERT_TRUE(content::ExecuteScript(web_frame_rfh, renavigation_javascript));
1094
1095 renavigation_manager.WaitForNavigationFinished();
1096
1097 // The old RFH is no longer valid after the renavigation, so we must get the
1098 // new one.
1099 RenderFrameHost* extension_simple_frame_rfh =
1100 ChildFrameAt(panel_frame_rfh, 2);
1101
1102 EXPECT_EQ(extension_simple_url,
1103 extension_simple_frame_rfh->GetLastCommittedURL());
1104 EXPECT_EQ(devtools_instance, extension_simple_frame_rfh->GetSiteInstance());
1105}
1106
1107// Tests that http Iframes within the sidebar pane page for the devtools
1108// extension that is visible in the elements panel are rendered in their own
1109// processes and not in the devtools process or the extension's process. This
1110// is tested because this is one of the extension pages with devtools access
1111// (https://developer.chrome.com/extensions/devtools). http://crbug.com/570483
1112IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest,
1113 HttpIframeInDevToolsExtensionSideBarPane) {
1114 ASSERT_TRUE(embedded_test_server()->Start());
1115
1116 GURL web_url = embedded_test_server()->GetURL("a.com", "/title3.html");
1117
1118 // Install the dynamically-generated extension.
1119 const Extension* extension = LoadExtensionForTest(
1120 "Devtools Extension", "sidebarpane_devtools_page.html", web_url.spec());
1121 ASSERT_TRUE(extension);
1122
1123 OpenDevToolsWindow(kDebuggerTestPage, false);
1124
1125 // Wait for the extension's sidebarpane to finish loading -- it'll output
1126 // 'PASS' when it's installed. waitForTestResultsInConsole waits until that
1127 // 'PASS'.
1128 RunTestFunction(window_, "waitForTestResultsInConsole");
1129
1130 // Now that we know the sidebarpane is loaded, switch to it.
1131 content::TestNavigationManager web_manager(main_web_contents(), web_url);
1132 SwitchToPanel(window_, "elements");
1133 // This is a bit of a hack to switch to the sidebar pane in the elements panel
1134 // that the Iframe has been added to.
1135 SwitchToPanel(window_, "iframe_pane");
1136 web_manager.WaitForNavigationFinished();
1137
1138 std::vector<RenderFrameHost*> rfhs = main_web_contents()->GetAllFrames();
1139 EXPECT_EQ(4U, rfhs.size());
1140
1141 RenderFrameHost* main_devtools_rfh = main_web_contents()->GetMainFrame();
1142 RenderFrameHost* devtools_extension_devtools_page_rfh =
1143 ChildFrameAt(main_devtools_rfh, 0);
1144 RenderFrameHost* devtools_sidebar_pane_extension_rfh =
1145 ChildFrameAt(main_devtools_rfh, 1);
1146 RenderFrameHost* http_iframe_rfh =
1147 ChildFrameAt(devtools_sidebar_pane_extension_rfh, 0);
1148
1149 EXPECT_TRUE(main_devtools_rfh->GetLastCommittedURL().SchemeIs(
1150 content::kChromeDevToolsScheme));
1151 EXPECT_EQ(extension->GetResourceURL("/sidebarpane_devtools_page.html"),
1152 devtools_extension_devtools_page_rfh->GetLastCommittedURL());
1153 EXPECT_EQ(extension->GetResourceURL("/panel.html"),
1154 devtools_sidebar_pane_extension_rfh->GetLastCommittedURL());
1155 EXPECT_EQ(web_url, http_iframe_rfh->GetLastCommittedURL());
1156
1157 content::SiteInstance* devtools_instance =
1158 main_devtools_rfh->GetSiteInstance();
1159 EXPECT_TRUE(
1160 devtools_instance->GetSiteURL().SchemeIs(content::kChromeDevToolsScheme));
1161 EXPECT_EQ(devtools_instance,
1162 devtools_extension_devtools_page_rfh->GetSiteInstance());
1163 EXPECT_EQ(devtools_instance,
1164 devtools_sidebar_pane_extension_rfh->GetSiteInstance());
1165 EXPECT_EQ(web_url.host(),
1166 http_iframe_rfh->GetSiteInstance()->GetSiteURL().host());
1167 EXPECT_NE(devtools_instance, http_iframe_rfh->GetSiteInstance());
1168}
1169
1170// Tests that http Iframes within the devtools background page, which is
1171// different from the extension's background page, are rendered in their own
1172// processes and not in the devtools process or the extension's process. This
1173// is tested because this is one of the extension pages with devtools access
1174// (https://developer.chrome.com/extensions/devtools). http://crbug.com/570483
1175IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest,
1176 HttpIframeInDevToolsExtensionDevtools) {
1177 ASSERT_TRUE(embedded_test_server()->Start());
1178
1179 // Install the dynamically-generated extension.
1180 const Extension* extension =
1181 LoadExtensionForTest("Devtools Extension", "web_devtools_page.html",
1182 "" /* panel_iframe_src */);
1183 ASSERT_TRUE(extension);
1184
1185 // Wait for a 'DONE' message sent from popup_iframe.html, indicating that it
nick32e53c152015-12-17 19:48:541186 // loaded successfully.
1187 content::DOMMessageQueue message_queue;
nick32e53c152015-12-17 19:48:541188 std::string message;
davidsac88a1aa72017-03-30 21:10:411189 OpenDevToolsWindow(kDebuggerTestPage, false);
1190
nick32e53c152015-12-17 19:48:541191 while (true) {
1192 ASSERT_TRUE(message_queue.WaitForMessage(&message));
1193 if (message == "\"DONE\"")
1194 break;
1195 }
davidsac88a1aa72017-03-30 21:10:411196
1197 std::vector<RenderFrameHost*> rfhs = main_web_contents()->GetAllFrames();
1198 EXPECT_EQ(3U, rfhs.size());
1199
1200 RenderFrameHost* main_devtools_rfh = main_web_contents()->GetMainFrame();
1201 RenderFrameHost* devtools_extension_devtools_page_rfh =
1202 ChildFrameAt(main_devtools_rfh, 0);
1203 RenderFrameHost* http_iframe_rfh =
1204 ChildFrameAt(devtools_extension_devtools_page_rfh, 0);
1205
1206 GURL web_url = embedded_test_server()->GetURL("a.com", "/popup_iframe.html");
1207
1208 EXPECT_TRUE(main_devtools_rfh->GetLastCommittedURL().SchemeIs(
1209 content::kChromeDevToolsScheme));
1210 EXPECT_EQ(extension->GetResourceURL("/web_devtools_page.html"),
1211 devtools_extension_devtools_page_rfh->GetLastCommittedURL());
1212 EXPECT_EQ(web_url, http_iframe_rfh->GetLastCommittedURL());
1213
1214 content::SiteInstance* devtools_instance =
1215 main_devtools_rfh->GetSiteInstance();
1216 EXPECT_TRUE(
1217 devtools_instance->GetSiteURL().SchemeIs(content::kChromeDevToolsScheme));
1218 EXPECT_EQ(devtools_instance,
1219 devtools_extension_devtools_page_rfh->GetSiteInstance());
1220 EXPECT_EQ(web_url.host(),
1221 http_iframe_rfh->GetSiteInstance()->GetSiteURL().host());
1222 EXPECT_NE(devtools_instance, http_iframe_rfh->GetSiteInstance());
1223}
1224
1225// Tests that iframes to a non-devtools extension embedded in a devtools
1226// extension will be isolated from devtools and the devtools extension.
1227// http://crbug.com/570483
1228IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest,
1229 NonDevToolsExtensionInDevToolsExtension) {
1230 ASSERT_TRUE(embedded_test_server()->Start());
1231
1232 // Install the dynamically-generated non-devtools extension.
1233 const Extension* non_devtools_extension =
1234 LoadExtensionForTest("Non-DevTools Extension", "" /* devtools_page */,
1235 "" /* panel_iframe_src */);
1236 ASSERT_TRUE(non_devtools_extension);
1237
1238 GURL non_dt_extension_test_url =
1239 non_devtools_extension->GetResourceURL("/simple_test_page.html");
1240
1241 // Install the dynamically-generated devtools extension.
1242 const Extension* devtools_extension =
1243 LoadExtensionForTest("Devtools Extension", "panel_devtools_page.html",
1244 non_dt_extension_test_url.spec());
1245 ASSERT_TRUE(devtools_extension);
1246
1247 OpenDevToolsWindow(kDebuggerTestPage, false);
1248
1249 // Wait for the extension's panel to finish loading -- it'll output 'PASS'
1250 // when it's installed. waitForTestResultsInConsole waits until that 'PASS'.
1251 RunTestFunction(window_, "waitForTestResultsInConsole");
1252
1253 // Now that we know the panel is loaded, switch to it.
1254 content::TestNavigationManager non_devtools_manager(
1255 main_web_contents(), non_dt_extension_test_url);
1256 SwitchToExtensionPanel(window_, devtools_extension, "iframe_panel");
1257 non_devtools_manager.WaitForNavigationFinished();
1258
1259 std::vector<RenderFrameHost*> rfhs = main_web_contents()->GetAllFrames();
1260 EXPECT_EQ(4U, rfhs.size());
1261
1262 RenderFrameHost* main_devtools_rfh = main_web_contents()->GetMainFrame();
1263 RenderFrameHost* devtools_extension_devtools_page_rfh =
1264 ChildFrameAt(main_devtools_rfh, 0);
1265 RenderFrameHost* devtools_extension_panel_rfh =
1266 ChildFrameAt(main_devtools_rfh, 1);
1267 RenderFrameHost* non_devtools_extension_rfh =
1268 ChildFrameAt(devtools_extension_panel_rfh, 0);
1269
1270 EXPECT_TRUE(main_devtools_rfh->GetLastCommittedURL().SchemeIs(
1271 content::kChromeDevToolsScheme));
1272 EXPECT_EQ(devtools_extension->GetResourceURL("/panel_devtools_page.html"),
1273 devtools_extension_devtools_page_rfh->GetLastCommittedURL());
1274 EXPECT_EQ(devtools_extension->GetResourceURL("/panel.html"),
1275 devtools_extension_panel_rfh->GetLastCommittedURL());
1276 EXPECT_EQ(non_dt_extension_test_url,
1277 non_devtools_extension_rfh->GetLastCommittedURL());
1278
1279 // simple_test_page.html's frame should be in |non_devtools_extension|'s
1280 // process, not in devtools or |devtools_extension|'s process.
1281 content::SiteInstance* devtools_instance =
1282 main_devtools_rfh->GetSiteInstance();
1283 EXPECT_TRUE(
1284 devtools_instance->GetSiteURL().SchemeIs(content::kChromeDevToolsScheme));
1285 EXPECT_EQ(devtools_instance,
1286 devtools_extension_devtools_page_rfh->GetSiteInstance());
1287 EXPECT_EQ(devtools_instance, devtools_extension_panel_rfh->GetSiteInstance());
1288 EXPECT_EQ(non_dt_extension_test_url.GetOrigin(),
1289 non_devtools_extension_rfh->GetSiteInstance()->GetSiteURL());
1290 EXPECT_NE(devtools_instance, non_devtools_extension_rfh->GetSiteInstance());
1291}
1292
1293// Tests that if a devtools extension's devtools panel page has a subframe to a
1294// page for another devtools extension, the subframe is rendered in the devtools
1295// process as well. http://crbug.com/570483
1296IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest,
1297 DevToolsExtensionInDevToolsExtension) {
1298 ASSERT_TRUE(embedded_test_server()->Start());
1299
1300 // Install the dynamically-generated extension.
1301 const Extension* devtools_b_extension =
1302 LoadExtensionForTest("Devtools Extension B", "simple_devtools_page.html",
1303 "" /* panel_iframe_src */);
1304 ASSERT_TRUE(devtools_b_extension);
1305
1306 GURL extension_b_page_url =
1307 devtools_b_extension->GetResourceURL("/simple_test_page.html");
1308
1309 // Install another dynamically-generated extension. This extension's
1310 // panel.html's iframe will point to an extension b URL.
1311 const Extension* devtools_a_extension =
1312 LoadExtensionForTest("Devtools Extension A", "panel_devtools_page.html",
1313 extension_b_page_url.spec());
1314 ASSERT_TRUE(devtools_a_extension);
1315
1316 OpenDevToolsWindow(kDebuggerTestPage, false);
1317
1318 // Wait for the extension's panel to finish loading -- it'll output 'PASS'
1319 // when it's installed. waitForTestResultsInConsole waits until that 'PASS'.
1320 RunTestFunction(window_, "waitForTestResultsInConsole");
1321
1322 // Now that we know the panel is loaded, switch to it.
1323 content::TestNavigationManager extension_b_manager(main_web_contents(),
1324 extension_b_page_url);
1325 SwitchToExtensionPanel(window_, devtools_a_extension, "iframe_panel");
1326 extension_b_manager.WaitForNavigationFinished();
1327
1328 std::vector<RenderFrameHost*> rfhs = main_web_contents()->GetAllFrames();
1329 EXPECT_EQ(5U, rfhs.size());
1330
1331 RenderFrameHost* main_devtools_rfh = main_web_contents()->GetMainFrame();
1332
1333 RenderFrameHost* devtools_extension_a_devtools_rfh =
1334 content::FrameMatchingPredicate(
1335 main_web_contents(), base::Bind(&content::FrameHasSourceUrl,
1336 devtools_a_extension->GetResourceURL(
1337 "/panel_devtools_page.html")));
1338 EXPECT_TRUE(devtools_extension_a_devtools_rfh);
1339 RenderFrameHost* devtools_extension_b_devtools_rfh =
1340 content::FrameMatchingPredicate(
1341 main_web_contents(), base::Bind(&content::FrameHasSourceUrl,
1342 devtools_b_extension->GetResourceURL(
1343 "/simple_devtools_page.html")));
1344 EXPECT_TRUE(devtools_extension_b_devtools_rfh);
1345
1346 RenderFrameHost* devtools_extension_a_panel_rfh =
1347 ChildFrameAt(main_devtools_rfh, 2);
1348 RenderFrameHost* devtools_extension_b_frame_rfh =
1349 ChildFrameAt(devtools_extension_a_panel_rfh, 0);
1350
1351 EXPECT_TRUE(main_devtools_rfh->GetLastCommittedURL().SchemeIs(
1352 content::kChromeDevToolsScheme));
1353 EXPECT_EQ(devtools_a_extension->GetResourceURL("/panel_devtools_page.html"),
1354 devtools_extension_a_devtools_rfh->GetLastCommittedURL());
1355 EXPECT_EQ(devtools_b_extension->GetResourceURL("/simple_devtools_page.html"),
1356 devtools_extension_b_devtools_rfh->GetLastCommittedURL());
1357 EXPECT_EQ(devtools_a_extension->GetResourceURL("/panel.html"),
1358 devtools_extension_a_panel_rfh->GetLastCommittedURL());
1359 EXPECT_EQ(extension_b_page_url,
1360 devtools_extension_b_frame_rfh->GetLastCommittedURL());
1361
1362 // All frames should be in the devtools process.
1363 content::SiteInstance* devtools_instance =
1364 main_devtools_rfh->GetSiteInstance();
1365 EXPECT_TRUE(
1366 devtools_instance->GetSiteURL().SchemeIs(content::kChromeDevToolsScheme));
1367 EXPECT_EQ(devtools_instance,
1368 devtools_extension_a_devtools_rfh->GetSiteInstance());
1369 EXPECT_EQ(devtools_instance,
1370 devtools_extension_b_devtools_rfh->GetSiteInstance());
1371 EXPECT_EQ(devtools_instance,
1372 devtools_extension_a_panel_rfh->GetSiteInstance());
1373 EXPECT_EQ(devtools_instance,
1374 devtools_extension_b_frame_rfh->GetSiteInstance());
1375}
1376
1377// Tests that a devtools extension can still have subframes to itself in a
1378// "devtools page" and that they will be rendered within the devtools process as
1379// well, not in the extension process. http://crbug.com/570483
1380IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest, DevToolsExtensionInItself) {
1381 ASSERT_TRUE(embedded_test_server()->Start());
1382
1383 // Install the dynamically-generated extension.
1384 const Extension* extension =
1385 LoadExtensionForTest("Devtools Extension", "panel_devtools_page.html",
1386 "/simple_test_page.html");
1387 ASSERT_TRUE(extension);
1388
1389 OpenDevToolsWindow(kDebuggerTestPage, false);
1390
1391 // Wait for the extension's panel to finish loading -- it'll output 'PASS'
1392 // when it's installed. waitForTestResultsInConsole waits until that 'PASS'.
1393 RunTestFunction(window_, "waitForTestResultsInConsole");
1394
1395 // Now that we know the panel is loaded, switch to it.
1396 GURL extension_test_url = extension->GetResourceURL("/simple_test_page.html");
1397 content::TestNavigationManager test_page_manager(main_web_contents(),
1398 extension_test_url);
1399 SwitchToExtensionPanel(window_, extension, "iframe_panel");
1400 test_page_manager.WaitForNavigationFinished();
1401
1402 std::vector<RenderFrameHost*> rfhs = main_web_contents()->GetAllFrames();
1403 EXPECT_EQ(4U, rfhs.size());
1404
1405 RenderFrameHost* main_devtools_rfh = main_web_contents()->GetMainFrame();
1406 RenderFrameHost* devtools_extension_devtools_page_rfh =
1407 ChildFrameAt(main_devtools_rfh, 0);
1408 RenderFrameHost* devtools_extension_panel_rfh =
1409 ChildFrameAt(main_devtools_rfh, 1);
1410 RenderFrameHost* devtools_extension_panel_frame_rfh =
1411 ChildFrameAt(devtools_extension_panel_rfh, 0);
1412
1413 // All frames should be in the devtools process, including
1414 // simple_test_page.html
1415 EXPECT_TRUE(main_devtools_rfh->GetLastCommittedURL().SchemeIs(
1416 content::kChromeDevToolsScheme));
1417 EXPECT_EQ(extension->GetResourceURL("/panel_devtools_page.html"),
1418 devtools_extension_devtools_page_rfh->GetLastCommittedURL());
1419 EXPECT_EQ(extension->GetResourceURL("/panel.html"),
1420 devtools_extension_panel_rfh->GetLastCommittedURL());
1421 EXPECT_EQ(extension_test_url,
1422 devtools_extension_panel_frame_rfh->GetLastCommittedURL());
1423
1424 content::SiteInstance* devtools_instance =
1425 main_devtools_rfh->GetSiteInstance();
1426 EXPECT_TRUE(
1427 devtools_instance->GetSiteURL().SchemeIs(content::kChromeDevToolsScheme));
1428 EXPECT_EQ(devtools_instance,
1429 devtools_extension_devtools_page_rfh->GetSiteInstance());
1430 EXPECT_EQ(devtools_instance, devtools_extension_panel_rfh->GetSiteInstance());
1431 EXPECT_EQ(devtools_instance,
1432 devtools_extension_panel_frame_rfh->GetSiteInstance());
1433}
1434
1435// Tests that a devtools (not a devtools extension) Iframe can be injected into
1436// devtools. http://crbug.com/570483
1437IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, DevtoolsInDevTools) {
1438 ASSERT_TRUE(embedded_test_server()->Start());
1439
1440 GURL devtools_url = GURL(chrome::kChromeUIDevToolsURL);
1441
1442 OpenDevToolsWindow(kDebuggerTestPage, false);
1443
1444 std::string javascript =
1445 "var devtoolsFrame = document.createElement('iframe');"
1446 "document.body.appendChild(devtoolsFrame);"
1447 "devtoolsFrame.src = '" +
1448 devtools_url.spec() + "';";
1449
1450 RenderFrameHost* main_devtools_rfh = main_web_contents()->GetMainFrame();
1451
1452 content::TestNavigationManager manager(main_web_contents(), devtools_url);
1453 ASSERT_TRUE(content::ExecuteScript(main_devtools_rfh, javascript));
1454 manager.WaitForNavigationFinished();
1455
1456 std::vector<RenderFrameHost*> rfhs = main_web_contents()->GetAllFrames();
1457 EXPECT_EQ(2U, rfhs.size());
1458 RenderFrameHost* devtools_iframe_rfh = ChildFrameAt(main_devtools_rfh, 0);
1459 EXPECT_TRUE(main_devtools_rfh->GetLastCommittedURL().SchemeIs(
1460 content::kChromeDevToolsScheme));
1461 EXPECT_EQ(devtools_url, devtools_iframe_rfh->GetLastCommittedURL());
1462 content::SiteInstance* devtools_instance =
1463 main_devtools_rfh->GetSiteInstance();
1464 EXPECT_TRUE(
1465 devtools_instance->GetSiteURL().SchemeIs(content::kChromeDevToolsScheme));
1466 EXPECT_EQ(devtools_instance, devtools_iframe_rfh->GetSiteInstance());
1467
1468 std::string message;
1469 EXPECT_TRUE(ExecuteScriptAndExtractString(
1470 devtools_iframe_rfh, "domAutomationController.send(document.origin)",
1471 &message));
1472 EXPECT_EQ(devtools_url.GetOrigin().spec(), message + "/");
nick32e53c152015-12-17 19:48:541473}
1474
nick2a8ba8c2016-10-03 18:51:391475// Some web features, when used from an extension, are subject to browser-side
1476// security policy enforcement. Make sure they work properly from inside a
1477// devtools extension.
1478IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest,
1479 DevToolsExtensionSecurityPolicyGrants) {
1480 ASSERT_TRUE(embedded_test_server()->Start());
1481
1482 std::unique_ptr<extensions::TestExtensionDir> dir(
1483 new extensions::TestExtensionDir());
1484
1485 extensions::DictionaryBuilder manifest;
1486 dir->WriteManifest(extensions::DictionaryBuilder()
1487 .Set("name", "Devtools Panel")
1488 .Set("version", "1")
mkwste82aced12016-11-30 08:25:011489 // Whitelist the script we stuff into the 'blob:' URL:
1490 .Set("content_security_policy",
1491 "script-src 'self' "
1492 "'sha256-95xJWHeV+"
1493 "1zjAKQufDVW0misgmR4gCjgpipP2LJ5iis='; "
1494 "object-src 'none'")
nick2a8ba8c2016-10-03 18:51:391495 .Set("manifest_version", 2)
1496 .Set("devtools_page", "devtools.html")
1497 .ToJSON());
1498
1499 dir->WriteFile(
1500 FILE_PATH_LITERAL("devtools.html"),
1501 "<html><head><script src='devtools.js'></script></head></html>");
1502
1503 dir->WriteFile(
1504 FILE_PATH_LITERAL("devtools.js"),
1505 "chrome.devtools.panels.create('the_panel_name',\n"
1506 " null,\n"
1507 " 'panel.html',\n"
1508 " function(panel) {\n"
1509 " chrome.devtools.inspectedWindow.eval('console.log(\"PASS\")');\n"
1510 " }\n"
1511 ");\n");
1512
1513 dir->WriteFile(FILE_PATH_LITERAL("panel.html"),
1514 "<html><body>A panel."
1515 "<script src='blob_xhr.js'></script>"
nick01a85bdd2016-10-27 20:17:121516 "<script src='blob_iframe.js'></script>"
nick2a8ba8c2016-10-03 18:51:391517 "</body></html>");
1518 // Creating blobs from chrome-extension:// origins is only permitted if the
1519 // process has been granted permission to commit 'chrome-extension' schemes.
1520 dir->WriteFile(
1521 FILE_PATH_LITERAL("blob_xhr.js"),
nick01a85bdd2016-10-27 20:17:121522 "var blob_url = URL.createObjectURL(new Blob(['xhr blob contents']));\n"
nick2a8ba8c2016-10-03 18:51:391523 "var xhr = new XMLHttpRequest();\n"
1524 "xhr.open('GET', blob_url, true);\n"
1525 "xhr.onload = function (e) {\n"
1526 " domAutomationController.setAutomationId(0);\n"
1527 " domAutomationController.send(xhr.response);\n"
1528 "};\n"
1529 "xhr.send(null);\n");
nick01a85bdd2016-10-27 20:17:121530 dir->WriteFile(
1531 FILE_PATH_LITERAL("blob_iframe.js"),
1532 "var payload = `"
1533 "<html><body>iframe blob contents"
1534 "<script>"
1535 " domAutomationController.setAutomationId(0);"
1536 " domAutomationController.send(document.body.innerText);\n"
1537 "</script></body></html>"
1538 "`;"
1539 "document.body.appendChild(document.createElement('iframe')).src ="
1540 " URL.createObjectURL(new Blob([payload], {type: 'text/html'}));");
nick2a8ba8c2016-10-03 18:51:391541 // Install the extension.
1542 const Extension* extension = LoadExtensionFromPath(dir->UnpackedPath());
1543 ASSERT_TRUE(extension);
1544
1545 // Open a devtools window.
1546 OpenDevToolsWindow(kDebuggerTestPage, false);
1547
1548 // Wait for the panel extension to finish loading -- it'll output 'PASS'
1549 // when it's installed. waitForTestResultsInConsole waits until that 'PASS'.
1550 RunTestFunction(window_, "waitForTestResultsInConsole");
1551
1552 // Now that we know the panel is loaded, switch to it. We'll wait until we
1553 // see a 'DONE' message sent from popup_iframe.html, indicating that it
1554 // loaded successfully.
1555 content::DOMMessageQueue message_queue;
1556 SwitchToExtensionPanel(window_, extension, "the_panel_name");
1557 std::string message;
1558 while (true) {
1559 ASSERT_TRUE(message_queue.WaitForMessage(&message));
nick01a85bdd2016-10-27 20:17:121560 if (message == "\"xhr blob contents\"")
1561 break;
1562 }
1563 while (true) {
1564 ASSERT_TRUE(message_queue.WaitForMessage(&message));
1565 if (message == "\"iframe blob contents\"")
nick2a8ba8c2016-10-03 18:51:391566 break;
1567 }
1568}
1569
[email protected]43466b92013-12-27 22:00:111570// Disabled on Windows due to flakiness. http://crbug.com/183649
1571#if defined(OS_WIN)
[email protected]4319aa302013-06-12 19:59:451572#define MAYBE_TestDevToolsExtensionMessaging DISABLED_TestDevToolsExtensionMessaging
1573#else
1574#define MAYBE_TestDevToolsExtensionMessaging TestDevToolsExtensionMessaging
1575#endif
1576
[email protected]6dcc9432012-02-28 12:59:371577// Tests that chrome.devtools extension can communicate with background page
1578// using extension messaging.
1579IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest,
[email protected]4319aa302013-06-12 19:59:451580 MAYBE_TestDevToolsExtensionMessaging) {
[email protected]6dcc9432012-02-28 12:59:371581 LoadExtension("devtools_messaging");
[email protected]007b3f82013-04-09 08:46:451582 RunTest("waitForTestResultsInConsole", std::string());
[email protected]6dcc9432012-02-28 12:59:371583}
1584
[email protected]e89c05a2011-12-26 08:51:571585// Tests that chrome.experimental.devtools extension is correctly exposed
1586// when the extension has experimental permission.
1587IN_PROC_BROWSER_TEST_F(DevToolsExperimentalExtensionTest,
1588 TestDevToolsExperimentalExtensionAPI) {
1589 LoadExtension("devtools_experimental");
[email protected]007b3f82013-04-09 08:46:451590 RunTest("waitForTestResultsInConsole", std::string());
[email protected]e89c05a2011-12-26 08:51:571591}
1592
[email protected]92094f312013-11-12 18:09:261593// Tests that a content script is in the scripts list.
[email protected]92094f312013-11-12 18:09:261594IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest,
[email protected]2565b872014-08-01 11:57:521595 TestContentScriptIsPresent) {
[email protected]2c7b4d72009-10-21 07:17:171596 LoadExtension("simple_content_script");
1597 RunTest("testContentScriptIsPresent", kPageWithContentScript);
1598}
1599
lushnikov6d007922016-08-31 02:59:441600// Tests that console selector shows correct context names.
1601IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest,
1602 TestConsoleContextNames) {
1603 LoadExtension("simple_content_script");
1604 RunTest("testConsoleContextNames", kPageWithContentScript);
1605}
1606
[email protected]f099ba32009-09-18 13:43:171607// Tests that scripts are not duplicated after Scripts Panel switch.
1608IN_PROC_BROWSER_TEST_F(DevToolsSanityTest,
[email protected]2565b872014-08-01 11:57:521609 TestNoScriptDuplicatesOnPanelSwitch) {
[email protected]f099ba32009-09-18 13:43:171610 RunTest("testNoScriptDuplicatesOnPanelSwitch", kDebuggerTestPage);
1611}
1612
[email protected]53976e82009-11-11 17:08:311613// Tests that debugger works correctly if pause event occurs when DevTools
1614// frontend is being loaded.
[email protected]e043c2a2011-12-02 00:08:171615IN_PROC_BROWSER_TEST_F(DevToolsSanityTest,
mukai9f72da922015-03-14 01:54:541616 TestPauseWhenLoadingDevTools) {
[email protected]53976e82009-11-11 17:08:311617 RunTest("testPauseWhenLoadingDevTools", kPauseWhenLoadingDevTools);
1618}
1619
[email protected]28ce8eb2009-11-30 09:20:451620// Tests that pressing 'Pause' will pause script execution if the script
1621// is already running.
sergeyvb4eb2472015-03-17 10:51:131622#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY)
[email protected]5808fe12013-05-10 02:42:451623// Timing out on linux ARM bot: https://crbug/238453
1624#define MAYBE_TestPauseWhenScriptIsRunning DISABLED_TestPauseWhenScriptIsRunning
sergeyvb4eb2472015-03-17 10:51:131625#else
1626#define MAYBE_TestPauseWhenScriptIsRunning TestPauseWhenScriptIsRunning
1627#endif
[email protected]81284382013-10-21 23:08:541628IN_PROC_BROWSER_TEST_F(DevToolsSanityTest,
sergeyvb4eb2472015-03-17 10:51:131629 MAYBE_TestPauseWhenScriptIsRunning) {
[email protected]6303b282012-02-14 00:55:371630 RunTest("testPauseWhenScriptIsRunning", kPauseWhenScriptIsRunning);
[email protected]28ce8eb2009-11-30 09:20:451631}
1632
dgozman3caf87e12016-12-09 08:13:211633IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestTempFileIncognito) {
1634 GURL url("about:blank");
1635 ui_test_utils::BrowserAddedObserver window_observer;
1636 chrome::NewEmptyWindow(browser()->profile()->GetOffTheRecordProfile());
1637 Browser* new_browser = window_observer.WaitForSingleNewBrowser();
1638 ui_test_utils::NavigateToURL(new_browser, url);
1639 DevToolsWindow* window = DevToolsWindowTesting::OpenDevToolsWindowSync(
1640 new_browser->tab_strip_model()->GetWebContentsAt(0), false);
1641 RunTestFunction(window, "testTempFile");
1642 DevToolsWindowTesting::CloseDevToolsWindowSync(window);
1643}
1644
1645IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestTempFile) {
1646 RunTest("testTempFile", kDebuggerTestPage);
1647}
1648
[email protected]74568b052011-05-20 09:36:141649// Tests network timing.
[email protected]5c80747a12011-08-26 01:35:571650IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestNetworkTiming) {
[email protected]74568b052011-05-20 09:36:141651 RunTest("testNetworkTiming", kSlowTestPage);
1652}
1653
1654// Tests network size.
oshima98205bc2015-06-19 19:52:421655IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestNetworkSize) {
[email protected]74568b052011-05-20 09:36:141656 RunTest("testNetworkSize", kChunkedTestPage);
1657}
1658
1659// Tests raw headers text.
[email protected]689a4802012-10-12 15:12:221660IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestNetworkSyncSize) {
[email protected]74568b052011-05-20 09:36:141661 RunTest("testNetworkSyncSize", kChunkedTestPage);
1662}
1663
1664// Tests raw headers text.
oshima98205bc2015-06-19 19:52:421665IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestNetworkRawHeadersText) {
[email protected]74568b052011-05-20 09:36:141666 RunTest("testNetworkRawHeadersText", kChunkedTestPage);
1667}
1668
caseqe8340bc92016-04-20 00:02:571669IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestNetworkPushTime) {
1670 OpenDevToolsWindow(kPushTestPage, false);
1671 GURL push_url = spawned_test_server()->GetURL(kPushTestResource);
1672 base::FilePath file_path =
1673 spawned_test_server()->document_root().AppendASCII(kPushTestResource);
1674
1675 BrowserThread::PostTask(
1676 BrowserThread::IO, FROM_HERE,
tzik93bf8a72017-04-24 18:53:301677 base::BindOnce(&TestInterceptor::Register, push_url, file_path));
caseqe8340bc92016-04-20 00:02:571678
1679 DispatchOnTestSuite(window_, "testPushTimes", push_url.spec().c_str());
1680
tzik93bf8a72017-04-24 18:53:301681 BrowserThread::PostTask(
1682 BrowserThread::IO, FROM_HERE,
1683 base::BindOnce(&TestInterceptor::Unregister, push_url));
caseqe8340bc92016-04-20 00:02:571684
1685 CloseDevToolsWindow();
1686}
1687
[email protected]e344c392011-09-28 06:36:031688// Tests that console messages are not duplicated on navigation back.
oshima98205bc2015-06-19 19:52:421689#if defined(OS_WIN)
tim3c2889b2014-08-30 01:49:571690// Flaking on windows swarm try runs: crbug.com/409285.
1691#define MAYBE_TestConsoleOnNavigateBack DISABLED_TestConsoleOnNavigateBack
1692#else
1693#define MAYBE_TestConsoleOnNavigateBack TestConsoleOnNavigateBack
1694#endif
1695IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, MAYBE_TestConsoleOnNavigateBack) {
[email protected]e344c392011-09-28 06:36:031696 RunTest("testConsoleOnNavigateBack", kNavigateBackTestPage);
1697}
1698
dgozman8388f062015-09-04 19:03:511699IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestDeviceEmulation) {
[email protected]05401dc2014-05-13 20:08:421700 RunTest("testDeviceMetricsOverrides", "about:blank");
1701}
1702
dgozman204daf32016-07-13 03:51:011703IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestDispatchKeyEventDoesNotCrash) {
1704 RunTest("testDispatchKeyEventDoesNotCrash", "about:blank");
1705}
1706
dgozman0fced85f42015-06-10 15:06:031707// Tests that settings are stored in profile correctly.
1708IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestSettings) {
1709 OpenDevToolsWindow("about:blank", true);
1710 RunTestFunction(window_, "testSettings");
1711 CloseDevToolsWindow();
1712}
1713
[email protected]0a57375a2013-03-07 22:18:591714// Tests that external navigation from inspector page is always handled by
1715// DevToolsWindow and results in inspected page navigation.
1716IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestDevToolsExternalNavigation) {
[email protected]b9c5d50b2014-01-16 20:37:431717 OpenDevToolsWindow(kDebuggerTestPage, true);
svaldeza01f7d92015-11-18 17:47:561718 GURL url = spawned_test_server()->GetURL(kNavigateBackTestPage);
[email protected]d118ad72014-07-21 14:07:011719 ui_test_utils::UrlLoadObserver observer(url,
[email protected]0a57375a2013-03-07 22:18:591720 content::NotificationService::AllSources());
1721 ASSERT_TRUE(content::ExecuteScript(
[email protected]d118ad72014-07-21 14:07:011722 main_web_contents(),
[email protected]0a57375a2013-03-07 22:18:591723 std::string("window.location = \"") + url.spec() + "\""));
1724 observer.Wait();
1725
[email protected]d118ad72014-07-21 14:07:011726 ASSERT_TRUE(main_web_contents()->GetURL().
[email protected]b3690f72014-02-17 00:32:481727 SchemeIs(content::kChromeDevToolsScheme));
[email protected]9fc94c6d2014-02-12 14:48:481728 ASSERT_EQ(url, GetInspectedTab()->GetURL());
[email protected]a1406cb2013-10-16 14:30:431729 CloseDevToolsWindow();
[email protected]0a57375a2013-03-07 22:18:591730}
1731
[email protected]d118ad72014-07-21 14:07:011732// Tests that toolbox window is loaded when DevTools window is undocked.
suzyhb6d0e272017-04-21 00:40:331733IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestToolboxLoadedUndocked) {
[email protected]d118ad72014-07-21 14:07:011734 OpenDevToolsWindow(kDebuggerTestPage, false);
1735 ASSERT_TRUE(toolbox_web_contents());
[email protected]b3f957e62014-08-08 10:09:021736 DevToolsWindow* on_self =
1737 DevToolsWindowTesting::OpenDevToolsWindowSync(main_web_contents(), false);
[email protected]d118ad72014-07-21 14:07:011738 ASSERT_FALSE(DevToolsWindowTesting::Get(on_self)->toolbox_web_contents());
1739 DevToolsWindowTesting::CloseDevToolsWindowSync(on_self);
1740 CloseDevToolsWindow();
1741}
1742
1743// Tests that toolbox window is not loaded when DevTools window is docked.
1744IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestToolboxNotLoadedDocked) {
1745 OpenDevToolsWindow(kDebuggerTestPage, true);
1746 ASSERT_FALSE(toolbox_web_contents());
[email protected]b3f957e62014-08-08 10:09:021747 DevToolsWindow* on_self =
1748 DevToolsWindowTesting::OpenDevToolsWindowSync(main_web_contents(), false);
[email protected]d118ad72014-07-21 14:07:011749 ASSERT_FALSE(DevToolsWindowTesting::Get(on_self)->toolbox_web_contents());
1750 DevToolsWindowTesting::CloseDevToolsWindowSync(on_self);
1751 CloseDevToolsWindow();
1752}
1753
[email protected]a88511b2011-11-09 06:53:071754// Tests that inspector will reattach to inspected page when it is reloaded
1755// after a crash. See http://crbug.com/101952
sergeyv27f196c2015-02-25 14:25:151756// Disabled. it doesn't check anything right now: http://crbug.com/461790
1757IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, DISABLED_TestReattachAfterCrash) {
[email protected]ebb10bb2014-04-16 17:16:011758 RunTest("testReattachAfterCrash", std::string());
[email protected]a88511b2011-11-09 06:53:071759}
1760
[email protected]3766a362011-06-21 17:56:181761IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestPageWithNoJavaScript) {
[email protected]b9c5d50b2014-01-16 20:37:431762 OpenDevToolsWindow("about:blank", false);
[email protected]3766a362011-06-21 17:56:181763 std::string result;
1764 ASSERT_TRUE(
[email protected]b6987e02013-01-04 18:30:431765 content::ExecuteScriptAndExtractString(
[email protected]d118ad72014-07-21 14:07:011766 main_web_contents()->GetRenderViewHost(),
[email protected]06bc5d92013-01-02 22:44:131767 "window.domAutomationController.send("
caseqc1edde1a2015-09-29 00:17:071768 " '' + (window.uiTests && (typeof uiTests.dispatchOnTestSuite)));",
[email protected]3766a362011-06-21 17:56:181769 &result));
1770 ASSERT_EQ("function", result) << "DevTools front-end is broken.";
1771 CloseDevToolsWindow();
1772}
1773
dgozman54cc54e2016-02-23 03:47:301774class DevToolsAutoOpenerTest : public DevToolsSanityTest {
1775 public:
1776 void SetUpCommandLine(base::CommandLine* command_line) override {
1777 command_line->AppendSwitch(switches::kAutoOpenDevToolsForTabs);
dgozman010f9e0e2016-02-24 21:25:531778 observer_.reset(new DevToolsWindowCreationObserver());
dgozman54cc54e2016-02-23 03:47:301779 }
dgozman010f9e0e2016-02-24 21:25:531780 protected:
dchengb8eac3a2016-04-13 02:03:231781 std::unique_ptr<DevToolsWindowCreationObserver> observer_;
dgozman54cc54e2016-02-23 03:47:301782};
1783
1784IN_PROC_BROWSER_TEST_F(DevToolsAutoOpenerTest, TestAutoOpenForTabs) {
1785 {
dgozman54cc54e2016-02-23 03:47:301786 DevToolsWindowCreationObserver observer;
1787 AddTabAtIndexToBrowser(browser(), 0, GURL("about:blank"),
1788 ui::PAGE_TRANSITION_AUTO_TOPLEVEL, false);
1789 observer.WaitForLoad();
dgozman010f9e0e2016-02-24 21:25:531790 }
1791 Browser* new_browser = nullptr;
1792 {
1793 DevToolsWindowCreationObserver observer;
1794 new_browser = CreateBrowser(browser()->profile());
1795 observer.WaitForLoad();
dgozman54cc54e2016-02-23 03:47:301796 }
1797 {
1798 DevToolsWindowCreationObserver observer;
dgozman54cc54e2016-02-23 03:47:301799 AddTabAtIndexToBrowser(new_browser, 0, GURL("about:blank"),
1800 ui::PAGE_TRANSITION_AUTO_TOPLEVEL, false);
1801 observer.WaitForLoad();
dgozman54cc54e2016-02-23 03:47:301802 }
dgozman010f9e0e2016-02-24 21:25:531803 observer_->CloseAllSync();
dgozman54cc54e2016-02-23 03:47:301804}
1805
caseqc1edde1a2015-09-29 00:17:071806class DevToolsReattachAfterCrashTest : public DevToolsSanityTest {
1807 protected:
1808 void RunTestWithPanel(const char* panel_name) {
1809 OpenDevToolsWindow("about:blank", false);
1810 SwitchToPanel(window_, panel_name);
1811 ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL));
1812
1813 content::RenderProcessHostWatcher crash_observer(
1814 GetInspectedTab(),
1815 content::RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT);
1816 ui_test_utils::NavigateToURL(browser(), GURL(content::kChromeUICrashURL));
1817 crash_observer.Wait();
1818 content::TestNavigationObserver navigation_observer(GetInspectedTab(), 1);
nick3b04f322016-08-31 19:29:191819 chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
caseqc1edde1a2015-09-29 00:17:071820 navigation_observer.Wait();
1821 }
1822};
1823
1824IN_PROC_BROWSER_TEST_F(DevToolsReattachAfterCrashTest,
1825 TestReattachAfterCrashOnTimeline) {
1826 RunTestWithPanel("timeline");
1827}
1828
1829IN_PROC_BROWSER_TEST_F(DevToolsReattachAfterCrashTest,
1830 TestReattachAfterCrashOnNetwork) {
1831 RunTestWithPanel("network");
1832}
1833
dgozmanab680412016-02-04 02:21:371834IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, AutoAttachToWindowOpen) {
1835 OpenDevToolsWindow(kWindowOpenTestPage, false);
1836 DispatchOnTestSuite(window_, "enableAutoAttachToCreatedPages");
1837 DevToolsWindowCreationObserver observer;
1838 ASSERT_TRUE(content::ExecuteScript(
1839 GetInspectedTab(), "window.open('window_open.html', '_blank');"));
1840 observer.WaitForLoad();
1841 DispatchOnTestSuite(observer.devtools_window(), "waitForDebuggerPaused");
1842 DevToolsWindowTesting::CloseDevToolsWindowSync(observer.devtools_window());
1843 CloseDevToolsWindow();
1844}
1845
sergeyvb4eb2472015-03-17 10:51:131846IN_PROC_BROWSER_TEST_F(WorkerDevToolsSanityTest, InspectSharedWorker) {
yurys48be075f2014-10-16 09:04:211847 RunTest("testSharedWorker", kSharedWorkerTestPage, kSharedWorkerTestWorker);
[email protected]1fcef592011-07-20 07:16:361848}
1849
xhwang78ae4c42017-03-08 21:26:111850// Flaky on multiple platforms. See http://crbug.com/432444
[email protected]867fd9232011-10-17 06:32:341851IN_PROC_BROWSER_TEST_F(WorkerDevToolsSanityTest,
xhwang78ae4c42017-03-08 21:26:111852 DISABLED_PauseInSharedWorkerInitialization) {
svaldeza01f7d92015-11-18 17:47:561853 ASSERT_TRUE(spawned_test_server()->Start());
1854 GURL url = spawned_test_server()->GetURL(kReloadSharedWorkerTestPage);
[email protected]9e1ee54c2012-03-12 17:47:131855 ui_test_utils::NavigateToURL(browser(), url);
[email protected]867fd9232011-10-17 06:32:341856
yurys48be075f2014-10-16 09:04:211857 scoped_refptr<WorkerData> worker_data =
1858 WaitForFirstSharedWorker(kReloadSharedWorkerTestWorker);
[email protected]9e1ee54c2012-03-12 17:47:131859 OpenDevToolsWindowForSharedWorker(worker_data.get());
[email protected]867fd9232011-10-17 06:32:341860
vsevika9852412014-10-29 14:20:501861 // We should make sure that the worker inspector has loaded before
1862 // terminating worker.
1863 RunTestFunction(window_, "testPauseInSharedWorkerInitialization1");
1864
[email protected]9e1ee54c2012-03-12 17:47:131865 TerminateWorker(worker_data);
[email protected]867fd9232011-10-17 06:32:341866
[email protected]9e1ee54c2012-03-12 17:47:131867 // Reload page to restart the worker.
1868 ui_test_utils::NavigateToURL(browser(), url);
[email protected]867fd9232011-10-17 06:32:341869
[email protected]9e1ee54c2012-03-12 17:47:131870 // Wait until worker script is paused on the debugger statement.
vsevika9852412014-10-29 14:20:501871 RunTestFunction(window_, "testPauseInSharedWorkerInitialization2");
[email protected]9e1ee54c2012-03-12 17:47:131872 CloseDevToolsWindow();
1873}
1874
[email protected]a2dcc6732013-03-14 13:28:081875class DevToolsAgentHostTest : public InProcessBrowserTest {};
1876
1877// Tests DevToolsAgentHost retention by its target.
1878IN_PROC_BROWSER_TEST_F(DevToolsAgentHostTest, TestAgentHostReleased) {
1879 ui_test_utils::NavigateToURL(browser(), GURL("about:blank"));
[email protected]b3f957e62014-08-08 10:09:021880 WebContents* web_contents = browser()->tab_strip_model()->GetWebContentsAt(0);
1881 DevToolsAgentHost* agent_raw =
1882 DevToolsAgentHost::GetOrCreateFor(web_contents).get();
[email protected]a2dcc6732013-03-14 13:28:081883 const std::string agent_id = agent_raw->GetId();
dchengf4b56572014-08-27 06:59:371884 ASSERT_EQ(agent_raw, DevToolsAgentHost::GetForId(agent_id).get())
1885 << "DevToolsAgentHost cannot be found by id";
[email protected]a2dcc6732013-03-14 13:28:081886 browser()->tab_strip_model()->
1887 CloseWebContentsAt(0, TabStripModel::CLOSE_NONE);
[email protected]cadac622013-06-11 16:46:361888 ASSERT_FALSE(DevToolsAgentHost::GetForId(agent_id).get())
1889 << "DevToolsAgentHost is not released when the tab is closed";
[email protected]a2dcc6732013-03-14 13:28:081890}
1891
vkuzkokov00700c32015-03-17 16:04:071892class RemoteDebuggingTest : public ExtensionApiTest {
avi3ef9ec9e2014-12-22 22:50:171893 void SetUpCommandLine(base::CommandLine* command_line) override {
[email protected]965901382013-04-03 07:38:391894 ExtensionApiTest::SetUpCommandLine(command_line);
1895 command_line->AppendSwitchASCII(switches::kRemoteDebuggingPort, "9222");
[email protected]ead056352013-03-12 08:47:541896
[email protected]965901382013-04-03 07:38:391897 // Override the extension root path.
1898 PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir_);
1899 test_data_dir_ = test_data_dir_.AppendASCII("devtools");
[email protected]ead056352013-03-12 08:47:541900 }
1901};
1902
Nicolas Zea4c8a23e2014-11-07 20:50:161903// Fails on CrOS. crbug.com/431399
1904#if defined(OS_CHROMEOS)
1905#define MAYBE_RemoteDebugger DISABLED_RemoteDebugger
1906#else
1907#define MAYBE_RemoteDebugger RemoteDebugger
1908#endif
1909IN_PROC_BROWSER_TEST_F(RemoteDebuggingTest, MAYBE_RemoteDebugger) {
[email protected]965901382013-04-03 07:38:391910 ASSERT_TRUE(RunExtensionTest("target_list")) << message_;
[email protected]ead056352013-03-12 08:47:541911}
peletskyi5ec60bf2015-03-12 09:53:181912
1913using DevToolsPolicyTest = InProcessBrowserTest;
1914IN_PROC_BROWSER_TEST_F(DevToolsPolicyTest, PolicyTrue) {
1915 browser()->profile()->GetPrefs()->SetBoolean(prefs::kDevToolsDisabled, true);
1916 ui_test_utils::NavigateToURL(browser(), GURL("about:blank"));
1917 content::WebContents* web_contents =
1918 browser()->tab_strip_model()->GetWebContentsAt(0);
1919 scoped_refptr<content::DevToolsAgentHost> agent(
1920 content::DevToolsAgentHost::GetOrCreateFor(web_contents));
1921 DevToolsWindow::OpenDevToolsWindow(web_contents);
1922 DevToolsWindow* window = DevToolsWindow::FindDevToolsWindow(agent.get());
1923 ASSERT_FALSE(window);
1924}
caseqc5e166832015-07-10 07:40:471925
1926class DevToolsPixelOutputTests : public DevToolsSanityTest {
1927 public:
1928 void SetUpCommandLine(base::CommandLine* command_line) override {
1929 command_line->AppendSwitch(switches::kEnablePixelOutputInTests);
1930 command_line->AppendSwitch(switches::kUseGpuInTests);
1931 }
1932};
1933
eugenis2580a3352015-07-10 22:04:541934// This test enables switches::kUseGpuInTests which causes false positives
ccameron606eb382016-09-06 18:57:541935// with MemorySanitizer. This is also flakey on many configurations.
robertshield954f48e2016-01-14 18:09:161936#if defined(MEMORY_SANITIZER) || defined(ADDRESS_SANITIZER) || \
ccameron606eb382016-09-06 18:57:541937 defined(OS_WIN)|| (defined(OS_CHROMEOS) && defined(OFFICIAL_BUILD))
eugenis2580a3352015-07-10 22:04:541938#define MAYBE_TestScreenshotRecording DISABLED_TestScreenshotRecording
1939#else
1940#define MAYBE_TestScreenshotRecording TestScreenshotRecording
1941#endif
eugenis2580a3352015-07-10 22:04:541942IN_PROC_BROWSER_TEST_F(DevToolsPixelOutputTests,
1943 MAYBE_TestScreenshotRecording) {
caseqc5e166832015-07-10 07:40:471944 RunTest("testScreenshotRecording", std::string());
1945}
caseqcfbb3faf2016-02-18 19:15:061946
1947// This test enables switches::kUseGpuInTests which causes false positives
1948// with MemorySanitizer.
timloh0b9fe712017-04-04 05:23:531949// Flaky on multiple platforms https://crbug.com/624215
caseqcfbb3faf2016-02-18 19:15:061950IN_PROC_BROWSER_TEST_F(DevToolsPixelOutputTests,
timloh0b9fe712017-04-04 05:23:531951 DISABLED_TestLatencyInfoInstrumentation) {
caseqcfbb3faf2016-02-18 19:15:061952 WebContents* web_contents = GetInspectedTab();
1953 OpenDevToolsWindow(kLatencyInfoTestPage, false);
caseqcfbb3faf2016-02-18 19:15:061954 DispatchAndWait("startTimeline");
1955
1956 for (int i = 0; i < 3; ++i) {
Blink Reformat1c4d759e2017-04-09 16:34:541957 SimulateMouseEvent(web_contents, blink::WebInputEvent::kMouseMove,
caseqcfbb3faf2016-02-18 19:15:061958 gfx::Point(30, 60));
1959 DispatchInPageAndWait("waitForEvent", "mousemove");
1960 }
1961
nzolghadr656569e2016-08-19 16:53:001962 SimulateMouseClickAt(web_contents, 0,
Blink Reformat1c4d759e2017-04-09 16:34:541963 blink::WebPointerProperties::Button::kLeft,
caseqcfbb3faf2016-02-18 19:15:061964 gfx::Point(30, 60));
1965 DispatchInPageAndWait("waitForEvent", "click");
1966
1967 SimulateMouseWheelEvent(web_contents, gfx::Point(300, 100),
1968 gfx::Vector2d(0, 120));
1969 DispatchInPageAndWait("waitForEvent", "wheel");
1970
1971 SimulateTapAt(web_contents, gfx::Point(30, 60));
1972 DispatchInPageAndWait("waitForEvent", "gesturetap");
1973
1974 DispatchAndWait("stopTimeline");
1975 RunTestMethod("checkInputEventsPresent", "MouseMove", "MouseDown",
1976 "MouseWheel", "GestureTap");
1977
1978 CloseDevToolsWindow();
1979}
dgozman6ca18e32016-06-29 19:30:291980
1981class DevToolsNetInfoTest : public DevToolsSanityTest {
1982 protected:
1983 void SetUpCommandLine(base::CommandLine* command_line) override {
1984 command_line->AppendSwitch(switches::kEnableNetworkInformation);
1985 command_line->AppendSwitch(
1986 switches::kEnableExperimentalWebPlatformFeatures);
1987 }
1988};
1989
1990IN_PROC_BROWSER_TEST_F(DevToolsNetInfoTest, EmulateNetworkConditions) {
1991 RunTest("testEmulateNetworkConditions", kEmulateNetworkConditionsPage);
1992}
kozyatinskiy3ac94392016-07-14 00:07:471993
1994class StaticURLDataSource : public content::URLDataSource {
1995 public:
1996 StaticURLDataSource(const std::string& source, const std::string& content)
1997 : source_(source), content_(content) {}
1998
1999 std::string GetSource() const override { return source_; }
jamedcd8b012016-09-20 02:03:582000 void StartDataRequest(
2001 const std::string& path,
2002 const content::ResourceRequestInfo::WebContentsGetter& wc_getter,
2003 const GotDataCallback& callback) override {
kozyatinskiy3ac94392016-07-14 00:07:472004 std::string data(content_);
2005 callback.Run(base::RefCountedString::TakeString(&data));
2006 }
2007 std::string GetMimeType(const std::string& path) const override {
2008 return "text/html";
2009 }
2010 bool ShouldAddContentSecurityPolicy() const override { return false; }
2011
2012 private:
2013 std::string source_;
2014 std::string content_;
2015 DISALLOW_COPY_AND_ASSIGN(StaticURLDataSource);
2016};
2017
2018class MockWebUIProvider
2019 : public TestChromeWebUIControllerFactory::WebUIProvider {
2020 public:
2021 MockWebUIProvider(const std::string& source, const std::string& content)
2022 : source_(source), content_(content) {}
2023
2024 content::WebUIController* NewWebUI(content::WebUI* web_ui,
2025 const GURL& url) override {
2026 content::URLDataSource::Add(Profile::FromWebUI(web_ui),
2027 new StaticURLDataSource(source_, content_));
2028 return new content::WebUIController(web_ui);
2029 }
2030
2031 private:
2032 std::string source_;
2033 std::string content_;
2034 DISALLOW_COPY_AND_ASSIGN(MockWebUIProvider);
2035};
2036
2037// This tests checks that window is correctly initialized when DevTools is
2038// opened while navigation through history with forward and back actions.
2039// (crbug.com/627407)
kozyatinskiydb4bad92016-10-14 15:49:512040// Flaky on Windows and ChromeOS. http://crbug.com/628174#c4
kozyatinskiy3ac94392016-07-14 00:07:472041IN_PROC_BROWSER_TEST_F(DevToolsSanityTest,
kozyatinskiydb4bad92016-10-14 15:49:512042 DISABLED_TestWindowInitializedOnNavigateBack) {
kozyatinskiy3ac94392016-07-14 00:07:472043 TestChromeWebUIControllerFactory test_factory;
2044 MockWebUIProvider mock_provider("dummyurl",
2045 "<script>\n"
2046 " window.abc = 239;\n"
2047 " console.log(abc);\n"
2048 "</script>");
2049 test_factory.AddFactoryOverride(GURL("chrome://dummyurl").host(),
2050 &mock_provider);
2051 content::WebUIControllerFactory::RegisterFactory(&test_factory);
2052
2053 ui_test_utils::NavigateToURL(browser(), GURL("chrome://dummyurl"));
2054 DevToolsWindow* window =
2055 DevToolsWindowTesting::OpenDevToolsWindowSync(GetInspectedTab(), true);
2056 chrome::DuplicateTab(browser());
2057 chrome::SelectPreviousTab(browser());
2058 ui_test_utils::NavigateToURL(browser(), GURL("about:blank"));
nick3b04f322016-08-31 19:29:192059 chrome::GoBack(browser(), WindowOpenDisposition::CURRENT_TAB);
kozyatinskiy3ac94392016-07-14 00:07:472060 RunTestFunction(window, "testWindowInitializedOnNavigateBack");
2061
2062 DevToolsWindowTesting::CloseDevToolsWindowSync(window);
2063 content::WebUIControllerFactory::UnregisterFactoryForTesting(&test_factory);
2064}
caseqcb5ed932016-10-05 21:37:012065
2066// Tests scripts panel showing.
2067IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestDevToolsSharedWorker) {
2068 RunTest("testDevToolsSharedWorker", url::kAboutBlankURL);
2069}