| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/basictypes.h" | 5 #include "base/basictypes.h" |
| 6 #include "base/time.h" | 6 #include "base/time.h" |
| 7 #include "content/browser/debugger/devtools_client_host.h" | 7 #include "content/browser/debugger/devtools_manager_impl.h" |
| 8 #include "content/browser/debugger/devtools_manager.h" | |
| 9 #include "content/browser/debugger/render_view_devtools_agent_host.h" | 8 #include "content/browser/debugger/render_view_devtools_agent_host.h" |
| 10 #include "content/browser/mock_content_browser_client.h" | 9 #include "content/browser/mock_content_browser_client.h" |
| 11 #include "content/browser/renderer_host/test_render_view_host.h" | 10 #include "content/browser/renderer_host/test_render_view_host.h" |
| 12 #include "content/browser/tab_contents/tab_contents_delegate.h" | 11 #include "content/browser/tab_contents/tab_contents_delegate.h" |
| 13 #include "content/browser/tab_contents/test_tab_contents.h" | 12 #include "content/browser/tab_contents/test_tab_contents.h" |
| 14 #include "content/common/view_messages.h" | 13 #include "content/common/view_messages.h" |
| 15 #include "content/public/browser/content_browser_client.h" | 14 #include "content/public/browser/content_browser_client.h" |
| 15 #include "content/public/browser/devtools_agent_host_registry.h" |
| 16 #include "content/public/browser/devtools_client_host.h" |
| 16 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
| 17 | 18 |
| 18 using base::TimeDelta; | 19 using base::TimeDelta; |
| 20 using content::DevToolsAgentHost; |
| 21 using content::DevToolsAgentHostRegistry; |
| 22 using content::DevToolsClientHost; |
| 23 using content::DevToolsManager; |
| 24 using content::DevToolsManagerImpl; |
| 19 | 25 |
| 20 namespace { | 26 namespace { |
| 21 | 27 |
| 22 class TestDevToolsClientHost : public DevToolsClientHost { | 28 class TestDevToolsClientHost : public DevToolsClientHost { |
| 23 public: | 29 public: |
| 24 TestDevToolsClientHost() | 30 TestDevToolsClientHost() |
| 25 : last_sent_message(NULL), | 31 : last_sent_message(NULL), |
| 26 closed_(false) { | 32 closed_(false) { |
| 27 } | 33 } |
| 28 | 34 |
| 29 virtual ~TestDevToolsClientHost() { | 35 virtual ~TestDevToolsClientHost() { |
| 30 EXPECT_TRUE(closed_); | 36 EXPECT_TRUE(closed_); |
| 31 } | 37 } |
| 32 | 38 |
| 33 virtual void Close() { | 39 virtual void Close(DevToolsManager* manager) { |
| 34 EXPECT_FALSE(closed_); | 40 EXPECT_FALSE(closed_); |
| 35 close_counter++; | 41 close_counter++; |
| 36 NotifyCloseListener(); | 42 manager->ClientHostClosing(this); |
| 37 closed_ = true; | 43 closed_ = true; |
| 38 } | 44 } |
| 39 virtual void InspectedTabClosing() { | 45 virtual void InspectedTabClosing() { |
| 40 Close(); | 46 FAIL(); |
| 41 } | 47 } |
| 42 | 48 |
| 43 virtual void SetInspectedTabUrl(const std::string& url) { | 49 virtual void SetInspectedTabUrl(const std::string& url) { |
| 44 } | 50 } |
| 45 | 51 |
| 46 virtual void SendMessageToClient(const IPC::Message& message) { | 52 virtual void DispatchOnInspectorFrontend(const std::string& message) { |
| 47 last_sent_message = &message; | 53 last_sent_message = &message; |
| 48 } | 54 } |
| 49 | 55 |
| 50 virtual void TabReplaced(TabContents* new_tab) { | 56 virtual void TabReplaced(TabContents* new_tab) { |
| 51 } | 57 } |
| 52 | 58 |
| 53 static void ResetCounters() { | 59 static void ResetCounters() { |
| 54 close_counter = 0; | 60 close_counter = 0; |
| 55 } | 61 } |
| 56 | 62 |
| 57 static int close_counter; | 63 static int close_counter; |
| 58 | 64 |
| 59 const IPC::Message* last_sent_message; | 65 const std::string* last_sent_message; |
| 60 | 66 |
| 61 private: | 67 private: |
| 62 bool closed_; | 68 bool closed_; |
| 63 | 69 |
| 64 virtual void FrameNavigating(const std::string& url) {} | 70 virtual void FrameNavigating(const std::string& url) {} |
| 65 | 71 |
| 66 DISALLOW_COPY_AND_ASSIGN(TestDevToolsClientHost); | 72 DISALLOW_COPY_AND_ASSIGN(TestDevToolsClientHost); |
| 67 }; | 73 }; |
| 68 | 74 |
| 69 int TestDevToolsClientHost::close_counter = 0; | 75 int TestDevToolsClientHost::close_counter = 0; |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 RenderViewHostTestHarness::TearDown(); | 128 RenderViewHostTestHarness::TearDown(); |
| 123 content::GetContentClient()->set_browser(original_browser_client_); | 129 content::GetContentClient()->set_browser(original_browser_client_); |
| 124 } | 130 } |
| 125 | 131 |
| 126 private: | 132 private: |
| 127 content::ContentBrowserClient* original_browser_client_; | 133 content::ContentBrowserClient* original_browser_client_; |
| 128 DevToolsManagerTestBrowserClient browser_client_; | 134 DevToolsManagerTestBrowserClient browser_client_; |
| 129 }; | 135 }; |
| 130 | 136 |
| 131 TEST_F(DevToolsManagerTest, OpenAndManuallyCloseDevToolsClientHost) { | 137 TEST_F(DevToolsManagerTest, OpenAndManuallyCloseDevToolsClientHost) { |
| 132 DevToolsManager manager; | 138 DevToolsManagerImpl manager; |
| 133 | 139 |
| 134 DevToolsClientHost* host = manager.GetDevToolsClientHostFor(rvh()); | 140 DevToolsAgentHost* agent = |
| 141 DevToolsAgentHostRegistry::GetDevToolsAgentHost(rvh()); |
| 142 DevToolsClientHost* host = manager.GetDevToolsClientHostFor(agent); |
| 135 EXPECT_TRUE(NULL == host); | 143 EXPECT_TRUE(NULL == host); |
| 136 | 144 |
| 137 TestDevToolsClientHost client_host; | 145 TestDevToolsClientHost client_host; |
| 138 manager.RegisterDevToolsClientHostFor(rvh(), &client_host); | 146 manager.RegisterDevToolsClientHostFor(agent, &client_host); |
| 139 // Test that just registered devtools host is returned. | 147 // Test that just registered devtools host is returned. |
| 140 host = manager.GetDevToolsClientHostFor(rvh()); | 148 host = manager.GetDevToolsClientHostFor(agent); |
| 141 EXPECT_TRUE(&client_host == host); | 149 EXPECT_TRUE(&client_host == host); |
| 142 EXPECT_EQ(0, TestDevToolsClientHost::close_counter); | 150 EXPECT_EQ(0, TestDevToolsClientHost::close_counter); |
| 143 | 151 |
| 144 // Test that the same devtools host is returned. | 152 // Test that the same devtools host is returned. |
| 145 host = manager.GetDevToolsClientHostFor(rvh()); | 153 host = manager.GetDevToolsClientHostFor(agent); |
| 146 EXPECT_TRUE(&client_host == host); | 154 EXPECT_TRUE(&client_host == host); |
| 147 EXPECT_EQ(0, TestDevToolsClientHost::close_counter); | 155 EXPECT_EQ(0, TestDevToolsClientHost::close_counter); |
| 148 | 156 |
| 149 client_host.Close(); | 157 client_host.Close(&manager); |
| 150 EXPECT_EQ(1, TestDevToolsClientHost::close_counter); | 158 EXPECT_EQ(1, TestDevToolsClientHost::close_counter); |
| 151 host = manager.GetDevToolsClientHostFor(rvh()); | 159 host = manager.GetDevToolsClientHostFor(agent); |
| 152 EXPECT_TRUE(NULL == host); | 160 EXPECT_TRUE(NULL == host); |
| 153 } | 161 } |
| 154 | 162 |
| 155 TEST_F(DevToolsManagerTest, ForwardMessageToClient) { | 163 TEST_F(DevToolsManagerTest, ForwardMessageToClient) { |
| 156 DevToolsManager manager; | 164 DevToolsManagerImpl manager; |
| 157 | 165 |
| 158 TestDevToolsClientHost client_host; | 166 TestDevToolsClientHost client_host; |
| 159 manager.RegisterDevToolsClientHostFor(rvh(), &client_host); | 167 DevToolsAgentHost* agent_host = |
| 168 DevToolsAgentHostRegistry::GetDevToolsAgentHost(rvh()); |
| 169 manager.RegisterDevToolsClientHostFor(agent_host, &client_host); |
| 160 EXPECT_EQ(0, TestDevToolsClientHost::close_counter); | 170 EXPECT_EQ(0, TestDevToolsClientHost::close_counter); |
| 161 | 171 |
| 162 IPC::Message m; | 172 std::string m = "test message"; |
| 163 DevToolsAgentHost* agent_host = RenderViewDevToolsAgentHost::FindFor(rvh()); | 173 agent_host = DevToolsAgentHostRegistry::GetDevToolsAgentHost(rvh()); |
| 164 manager.ForwardToDevToolsClient(agent_host, m); | 174 manager.DispatchOnInspectorFrontend(agent_host, m); |
| 165 EXPECT_TRUE(&m == client_host.last_sent_message); | 175 EXPECT_TRUE(&m == client_host.last_sent_message); |
| 166 | 176 |
| 167 client_host.Close(); | 177 client_host.Close(&manager); |
| 168 EXPECT_EQ(1, TestDevToolsClientHost::close_counter); | 178 EXPECT_EQ(1, TestDevToolsClientHost::close_counter); |
| 169 } | 179 } |
| 170 | 180 |
| 171 TEST_F(DevToolsManagerTest, NoUnresponsiveDialogInInspectedTab) { | 181 TEST_F(DevToolsManagerTest, NoUnresponsiveDialogInInspectedTab) { |
| 172 TestRenderViewHost* inspected_rvh = rvh(); | 182 TestRenderViewHost* inspected_rvh = rvh(); |
| 173 inspected_rvh->set_render_view_created(true); | 183 inspected_rvh->set_render_view_created(true); |
| 174 EXPECT_FALSE(contents()->delegate()); | 184 EXPECT_FALSE(contents()->delegate()); |
| 175 TestTabContentsDelegate delegate; | 185 TestTabContentsDelegate delegate; |
| 176 contents()->set_delegate(&delegate); | 186 contents()->set_delegate(&delegate); |
| 177 | 187 |
| 178 TestDevToolsClientHost client_host; | 188 TestDevToolsClientHost client_host; |
| 189 DevToolsAgentHost* agent_host = |
| 190 DevToolsAgentHostRegistry::GetDevToolsAgentHost(inspected_rvh); |
| 179 DevToolsManager::GetInstance()-> | 191 DevToolsManager::GetInstance()-> |
| 180 RegisterDevToolsClientHostFor(inspected_rvh, &client_host); | 192 RegisterDevToolsClientHostFor(agent_host, &client_host); |
| 181 | 193 |
| 182 // Start with a short timeout. | 194 // Start with a short timeout. |
| 183 inspected_rvh->StartHangMonitorTimeout(TimeDelta::FromMilliseconds(10)); | 195 inspected_rvh->StartHangMonitorTimeout(TimeDelta::FromMilliseconds(10)); |
| 184 // Wait long enough for first timeout and see if it fired. | 196 // Wait long enough for first timeout and see if it fired. |
| 185 MessageLoop::current()->PostDelayedTask(FROM_HERE, | 197 MessageLoop::current()->PostDelayedTask(FROM_HERE, |
| 186 new MessageLoop::QuitTask(), 10); | 198 new MessageLoop::QuitTask(), 10); |
| 187 MessageLoop::current()->Run(); | 199 MessageLoop::current()->Run(); |
| 188 EXPECT_FALSE(delegate.renderer_unresponsive_received()); | 200 EXPECT_FALSE(delegate.renderer_unresponsive_received()); |
| 189 | 201 |
| 190 // Now close devtools and check that the notification is delivered. | 202 // Now close devtools and check that the notification is delivered. |
| 191 client_host.Close(); | 203 client_host.Close(DevToolsManager::GetInstance()); |
| 192 // Start with a short timeout. | 204 // Start with a short timeout. |
| 193 inspected_rvh->StartHangMonitorTimeout(TimeDelta::FromMilliseconds(10)); | 205 inspected_rvh->StartHangMonitorTimeout(TimeDelta::FromMilliseconds(10)); |
| 194 // Wait long enough for first timeout and see if it fired. | 206 // Wait long enough for first timeout and see if it fired. |
| 195 MessageLoop::current()->PostDelayedTask(FROM_HERE, | 207 MessageLoop::current()->PostDelayedTask(FROM_HERE, |
| 196 new MessageLoop::QuitTask(), 10); | 208 new MessageLoop::QuitTask(), 10); |
| 197 MessageLoop::current()->Run(); | 209 MessageLoop::current()->Run(); |
| 198 EXPECT_TRUE(delegate.renderer_unresponsive_received()); | 210 EXPECT_TRUE(delegate.renderer_unresponsive_received()); |
| 199 | 211 |
| 200 contents()->set_delegate(NULL); | 212 contents()->set_delegate(NULL); |
| 201 } | 213 } |
| 202 | 214 |
| 203 TEST_F(DevToolsManagerTest, ReattachOnCancelPendingNavigation) { | 215 TEST_F(DevToolsManagerTest, ReattachOnCancelPendingNavigation) { |
| 204 contents()->transition_cross_site = true; | 216 contents()->transition_cross_site = true; |
| 205 // Navigate to URL. First URL should use first RenderViewHost. | 217 // Navigate to URL. First URL should use first RenderViewHost. |
| 206 const GURL url("http://www.google.com"); | 218 const GURL url("http://www.google.com"); |
| 207 controller().LoadURL( | 219 controller().LoadURL( |
| 208 url, GURL(), content::PAGE_TRANSITION_TYPED, std::string()); | 220 url, GURL(), content::PAGE_TRANSITION_TYPED, std::string()); |
| 209 ViewHostMsg_FrameNavigate_Params params1; | 221 ViewHostMsg_FrameNavigate_Params params1; |
| 210 InitNavigateParams(¶ms1, 1, url, content::PAGE_TRANSITION_TYPED); | 222 InitNavigateParams(¶ms1, 1, url, content::PAGE_TRANSITION_TYPED); |
| 211 TestRenderViewHost* orig_rvh = rvh(); | 223 TestRenderViewHost* orig_rvh = rvh(); |
| 212 contents()->TestDidNavigate(orig_rvh, params1); | 224 contents()->TestDidNavigate(orig_rvh, params1); |
| 213 EXPECT_FALSE(contents()->cross_navigation_pending()); | 225 EXPECT_FALSE(contents()->cross_navigation_pending()); |
| 214 | 226 |
| 215 TestDevToolsClientHost client_host; | 227 TestDevToolsClientHost client_host; |
| 216 DevToolsManager* devtools_manager = DevToolsManager::GetInstance(); | 228 DevToolsManager* devtools_manager = DevToolsManager::GetInstance(); |
| 217 devtools_manager->RegisterDevToolsClientHostFor(rvh(), &client_host); | 229 devtools_manager->RegisterDevToolsClientHostFor( |
| 230 DevToolsAgentHostRegistry::GetDevToolsAgentHost(rvh()), |
| 231 &client_host); |
| 218 | 232 |
| 219 // Navigate to new site which should get a new RenderViewHost. | 233 // Navigate to new site which should get a new RenderViewHost. |
| 220 const GURL url2("http://www.yahoo.com"); | 234 const GURL url2("http://www.yahoo.com"); |
| 221 controller().LoadURL( | 235 controller().LoadURL( |
| 222 url2, GURL(), content::PAGE_TRANSITION_TYPED, std::string()); | 236 url2, GURL(), content::PAGE_TRANSITION_TYPED, std::string()); |
| 223 EXPECT_TRUE(contents()->cross_navigation_pending()); | 237 EXPECT_TRUE(contents()->cross_navigation_pending()); |
| 224 EXPECT_EQ(&client_host, | 238 EXPECT_EQ(&client_host, devtools_manager->GetDevToolsClientHostFor( |
| 225 devtools_manager->GetDevToolsClientHostFor(pending_rvh())); | 239 DevToolsAgentHostRegistry::GetDevToolsAgentHost(pending_rvh()))); |
| 226 | 240 |
| 227 // Interrupt pending navigation and navigate back to the original site. | 241 // Interrupt pending navigation and navigate back to the original site. |
| 228 controller().LoadURL( | 242 controller().LoadURL( |
| 229 url, GURL(), content::PAGE_TRANSITION_TYPED, std::string()); | 243 url, GURL(), content::PAGE_TRANSITION_TYPED, std::string()); |
| 230 contents()->TestDidNavigate(orig_rvh, params1); | 244 contents()->TestDidNavigate(orig_rvh, params1); |
| 231 EXPECT_FALSE(contents()->cross_navigation_pending()); | 245 EXPECT_FALSE(contents()->cross_navigation_pending()); |
| 232 EXPECT_EQ(&client_host, devtools_manager->GetDevToolsClientHostFor(rvh())); | 246 EXPECT_EQ(&client_host, devtools_manager->GetDevToolsClientHostFor( |
| 233 client_host.Close(); | 247 DevToolsAgentHostRegistry::GetDevToolsAgentHost(rvh()))); |
| 248 client_host.Close(DevToolsManager::GetInstance()); |
| 234 } | 249 } |
| OLD | NEW |