extension_devtools_browsertests.cc revision 201ade2fbba22bfb27ae029f4d23fca6ded109a0
1// Copyright (c) 2009 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "base/ref_counted.h" 6#include "base/stringprintf.h" 7#include "chrome/browser/browser_list.h" 8#include "chrome/browser/debugger/devtools_client_host.h" 9#include "chrome/browser/debugger/devtools_manager.h" 10#include "chrome/browser/extensions/extension_devtools_browsertest.h" 11#include "chrome/browser/extensions/extension_error_reporter.h" 12#include "chrome/browser/extensions/extension_host.h" 13#include "chrome/browser/extensions/extension_process_manager.h" 14#include "chrome/browser/extensions/extensions_service.h" 15#include "chrome/browser/extensions/extension_tabs_module.h" 16#include "chrome/browser/profile.h" 17#include "chrome/browser/renderer_host/render_view_host.h" 18#include "chrome/browser/renderer_host/site_instance.h" 19#include "chrome/browser/tab_contents/tab_contents.h" 20#include "chrome/browser/tabs/tab_strip_model.h" 21#include "chrome/browser/ui/browser.h" 22#include "chrome/common/chrome_paths.h" 23#include "chrome/common/devtools_messages.h" 24#include "chrome/common/notification_service.h" 25#include "chrome/common/url_constants.h" 26#include "chrome/test/ui_test_utils.h" 27#include "net/base/net_util.h" 28 29// Looks for an ExtensionHost whose URL has the given path component (including 30// leading slash). Also verifies that the expected number of hosts are loaded. 31static ExtensionHost* FindHostWithPath(ExtensionProcessManager* manager, 32 const std::string& path, 33 int expected_hosts) { 34 ExtensionHost* host = NULL; 35 int num_hosts = 0; 36 for (ExtensionProcessManager::const_iterator iter = manager->begin(); 37 iter != manager->end(); ++iter) { 38 if ((*iter)->GetURL().path() == path) { 39 EXPECT_FALSE(host); 40 host = *iter; 41 } 42 num_hosts++; 43 } 44 EXPECT_EQ(expected_hosts, num_hosts); 45 EXPECT_TRUE(host); 46 return host; 47} 48 49// Tests for the experimental timeline extensions API. 50// TODO(johnnyg): crbug.com/52544 Test was broken by webkit r65510. 51IN_PROC_BROWSER_TEST_F(ExtensionDevToolsBrowserTest, FLAKY_TimelineApi) { 52 ASSERT_TRUE(LoadExtension( 53 test_data_dir_.AppendASCII("devtools").AppendASCII("timeline_api"))); 54 55 // Get the ExtensionHost that is hosting our background page. 56 ExtensionProcessManager* manager = 57 browser()->profile()->GetExtensionProcessManager(); 58 ExtensionHost* host = FindHostWithPath(manager, "/background.html", 1); 59 60 // Grab a handle to the DevToolsManager so we can forward messages to it. 61 DevToolsManager* devtools_manager = DevToolsManager::GetInstance(); 62 63 // Grab the tab_id of whatever tab happens to be first. 64 TabContents* tab_contents = browser()->GetTabContentsAt(0); 65 ASSERT_TRUE(tab_contents); 66 int tab_id = ExtensionTabUtil::GetTabId(tab_contents); 67 68 // Test setup. 69 bool result = false; 70 std::wstring register_listeners_js = base::StringPrintf( 71 L"setListenersOnTab(%d)", tab_id); 72 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( 73 host->render_view_host(), L"", register_listeners_js, &result)); 74 EXPECT_TRUE(result); 75 76 // Setting the events should have caused an ExtensionDevToolsBridge to be 77 // registered for the tab's RenderViewHost. 78 DevToolsClientHost* devtools_client_host = 79 devtools_manager->GetDevToolsClientHostFor( 80 tab_contents->render_view_host()); 81 ASSERT_TRUE(devtools_client_host); 82 83 // Test onPageEvent event. 84 result = false; 85 86 DevToolsClientMsg_DispatchToAPU pageEventMessage(""); 87 devtools_client_host->SendMessageToClient(pageEventMessage); 88 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( 89 host->render_view_host(), L"", L"testReceivePageEvent()", &result)); 90 EXPECT_TRUE(result); 91 92 // Test onTabClose event. 93 result = false; 94 devtools_manager->UnregisterDevToolsClientHostFor( 95 tab_contents->render_view_host()); 96 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( 97 host->render_view_host(), L"", L"testReceiveTabCloseEvent()", &result)); 98 EXPECT_TRUE(result); 99} 100 101 102// Tests that ref counting of listeners from multiple processes works. 103IN_PROC_BROWSER_TEST_F(ExtensionDevToolsBrowserTest, ProcessRefCounting) { 104 ASSERT_TRUE(LoadExtension( 105 test_data_dir_.AppendASCII("devtools").AppendASCII("timeline_api"))); 106 107 // Get the ExtensionHost that is hosting our background page. 108 ExtensionProcessManager* manager = 109 browser()->profile()->GetExtensionProcessManager(); 110 ExtensionHost* host_one = FindHostWithPath(manager, "/background.html", 1); 111 112 ASSERT_TRUE(LoadExtension( 113 test_data_dir_.AppendASCII("devtools").AppendASCII("timeline_api_two"))); 114 ExtensionHost* host_two = FindHostWithPath(manager, 115 "/background_two.html", 2); 116 117 DevToolsManager* devtools_manager = DevToolsManager::GetInstance(); 118 119 // Grab the tab_id of whatever tab happens to be first. 120 TabContents* tab_contents = browser()->GetTabContentsAt(0); 121 ASSERT_TRUE(tab_contents); 122 int tab_id = ExtensionTabUtil::GetTabId(tab_contents); 123 124 // Test setup. 125 bool result = false; 126 std::wstring register_listeners_js = base::StringPrintf( 127 L"setListenersOnTab(%d)", tab_id); 128 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( 129 host_one->render_view_host(), L"", register_listeners_js, &result)); 130 EXPECT_TRUE(result); 131 132 // Setting the event listeners should have caused an ExtensionDevToolsBridge 133 // to be registered for the tab's RenderViewHost. 134 ASSERT_TRUE(devtools_manager->GetDevToolsClientHostFor( 135 tab_contents->render_view_host())); 136 137 // Register listeners from the second extension as well. 138 std::wstring script = base::StringPrintf(L"registerListenersForTab(%d)", 139 tab_id); 140 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( 141 host_two->render_view_host(), L"", script, &result)); 142 EXPECT_TRUE(result); 143 144 // Removing the listeners from the first extension should leave the bridge 145 // alive. 146 result = false; 147 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( 148 host_one->render_view_host(), L"", L"unregisterListeners()", &result)); 149 EXPECT_TRUE(result); 150 ASSERT_TRUE(devtools_manager->GetDevToolsClientHostFor( 151 tab_contents->render_view_host())); 152 153 // Removing the listeners from the second extension should tear the bridge 154 // down. 155 result = false; 156 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( 157 host_two->render_view_host(), L"", L"unregisterListeners()", &result)); 158 EXPECT_TRUE(result); 159 ASSERT_FALSE(devtools_manager->GetDevToolsClientHostFor( 160 tab_contents->render_view_host())); 161} 162