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