Index: content/browser/devtools/devtools_manager_unittest.cc |
diff --git a/content/browser/devtools/devtools_manager_unittest.cc b/content/browser/devtools/devtools_manager_unittest.cc |
index 1da4418cbdaa148d5c4748478caa5497be05e097..08d778ada10193cd785e47474cd74e3cbcf34811 100644 |
--- a/content/browser/devtools/devtools_manager_unittest.cc |
+++ b/content/browser/devtools/devtools_manager_unittest.cc |
@@ -6,13 +6,19 @@ |
#include "base/memory/scoped_ptr.h" |
#include "base/time/time.h" |
#include "content/browser/devtools/devtools_manager.h" |
+#include "content/browser/devtools/embedded_worker_devtools_manager.h" |
#include "content/browser/devtools/render_view_devtools_agent_host.h" |
+#include "content/browser/shared_worker/shared_worker_instance.h" |
+#include "content/browser/shared_worker/worker_storage_partition.h" |
#include "content/common/view_messages.h" |
+#include "content/public/browser/browser_context.h" |
#include "content/public/browser/content_browser_client.h" |
#include "content/public/browser/devtools_agent_host.h" |
#include "content/public/browser/devtools_external_agent_proxy.h" |
#include "content/public/browser/devtools_external_agent_proxy_delegate.h" |
+#include "content/public/browser/devtools_target.h" |
#include "content/public/browser/web_contents_delegate.h" |
+#include "content/public/test/test_utils.h" |
#include "content/test/test_content_browser_client.h" |
#include "content/test/test_render_view_host.h" |
#include "content/test/test_web_contents.h" |
@@ -93,14 +99,122 @@ class TestWebContentsDelegate : public WebContentsDelegate { |
bool renderer_unresponsive_received_; |
}; |
+class TestTarget : public DevToolsTarget { |
+ public: |
+ explicit TestTarget(scoped_refptr<DevToolsAgentHost> agent_host) |
+ : agent_host_(agent_host) {} |
+ virtual ~TestTarget() {} |
+ |
+ virtual std::string GetId() const OVERRIDE { return agent_host_->GetId(); } |
+ virtual std::string GetParentId() const OVERRIDE { return std::string(); } |
+ virtual std::string GetType() const OVERRIDE { return std::string(); } |
+ virtual std::string GetTitle() const OVERRIDE { |
+ return agent_host_->GetTitle(); |
+ } |
+ virtual std::string GetDescription() const OVERRIDE { return std::string(); } |
+ virtual GURL GetURL() const OVERRIDE { return agent_host_->GetURL(); } |
+ virtual GURL GetFaviconURL() const OVERRIDE { return GURL(); } |
+ virtual base::TimeTicks GetLastActivityTime() const OVERRIDE { |
+ return base::TimeTicks(); |
+ } |
+ virtual bool IsAttached() const OVERRIDE { return agent_host_->IsAttached(); } |
+ virtual scoped_refptr<DevToolsAgentHost> GetAgentHost() const OVERRIDE { |
+ return agent_host_; |
+ } |
+ virtual bool Activate() const OVERRIDE { return agent_host_->Activate(); } |
+ virtual bool Close() const OVERRIDE { return agent_host_->Close(); } |
+ |
+ private: |
+ scoped_refptr<DevToolsAgentHost> agent_host_; |
+}; |
+ |
+class TestDevToolsManagerDelegate : public DevToolsManagerDelegate { |
+ public: |
+ virtual ~TestDevToolsManagerDelegate() {} |
+ |
+ virtual void Inspect(BrowserContext* browser_context, |
+ DevToolsAgentHost* agent_host) OVERRIDE {} |
+ |
+ virtual void DevToolsAgentStateChanged(DevToolsAgentHost* agent_host, |
+ bool attached) OVERRIDE {} |
+ |
+ virtual base::DictionaryValue* HandleCommand( |
+ DevToolsAgentHost* agent_host, |
+ base::DictionaryValue* command) OVERRIDE { return NULL; } |
+ |
+ virtual scoped_ptr<DevToolsTarget> CreateNewTarget(const GURL& url) OVERRIDE { |
+ return scoped_ptr<DevToolsTarget>(); |
+ } |
+ |
+ virtual void EnumerateTargets(TargetCallback callback) OVERRIDE { |
+ TargetList result; |
+ DevToolsAgentHost::List agents = DevToolsAgentHost::GetOrCreateAll(); |
+ for (DevToolsAgentHost::List::iterator it = agents.begin(); |
+ it != agents.end(); ++it) { |
+ if ((*it)->GetType() == DevToolsAgentHost::TYPE_WEB_CONTENTS) |
+ result.insert(result.begin(), new TestTarget(*it)); |
+ else |
+ result.push_back(new TestTarget(*it)); |
+ } |
+ callback.Run(result); |
+ } |
+ |
+ virtual std::string GetPageThumbnailData(const GURL& url) OVERRIDE { |
+ return std::string(); |
+ } |
+}; |
+ |
+class ContentBrowserClientWithDevTools : public TestContentBrowserClient { |
+ public: |
+ explicit ContentBrowserClientWithDevTools(DevToolsManagerDelegate* delegate) |
+ : delegate_(delegate) {} |
+ virtual ~ContentBrowserClientWithDevTools() {} |
+ |
+ virtual content::DevToolsManagerDelegate* |
+ GetDevToolsManagerDelegate() OVERRIDE { |
+ return delegate_; |
+ } |
+ private: |
+ DevToolsManagerDelegate* delegate_; |
+}; |
+ |
+class TestDevToolsManagerObserver : public DevToolsManager::Observer { |
+ public: |
+ TestDevToolsManagerObserver() |
+ : updates_count_(0) {} |
+ virtual ~TestDevToolsManagerObserver() {} |
+ |
+ int updates_count() { return updates_count_; } |
+ const TargetList& target_list() { return target_list_; } |
+ |
+ virtual void TargetListChanged(const TargetList& targets) OVERRIDE { |
+ updates_count_++; |
+ target_list_ = targets; |
+ base::MessageLoop::current()->PostTask( |
+ FROM_HERE, |
+ base::MessageLoop::QuitClosure()); |
+ } |
+ |
+ private: |
+ int updates_count_; |
+ TargetList target_list_; |
+}; |
+ |
} // namespace |
class DevToolsManagerTest : public RenderViewHostImplTestHarness { |
+ public: |
+ DevToolsManagerTest() |
+ : delegate_(new TestDevToolsManagerDelegate()) {} |
+ |
protected: |
virtual void SetUp() OVERRIDE { |
RenderViewHostImplTestHarness::SetUp(); |
TestDevToolsClientHost::ResetCounters(); |
+ SetBrowserClientForTesting(new ContentBrowserClientWithDevTools(delegate_)); |
} |
+ |
+ TestDevToolsManagerDelegate* delegate_; |
}; |
TEST_F(DevToolsManagerTest, OpenAndManuallyCloseDevToolsClientHost) { |
@@ -239,4 +353,96 @@ TEST_F(DevToolsManagerTest, TestExternalProxy) { |
client_host.Close(); |
} |
+TEST_F(DevToolsManagerTest, TestObserver) { |
+ GURL url1("data:text/html,<body>Body1</body>"); |
+ GURL url2("data:text/html,<body>Body2</body>"); |
+ GURL url3("data:text/html,<body>Body3</body>"); |
+ |
+ DevToolsManager* manager = DevToolsManager::GetInstance(); |
+ DevToolsManager::SetObserverThrottleIntervalForTest( |
+ base::TimeDelta::FromMilliseconds(200)); |
+ |
+ contents()->NavigateAndCommit(url1); |
+ RunAllPendingInMessageLoop(); |
+ |
+ TestDevToolsManagerObserver* observer = new TestDevToolsManagerObserver(); |
+ manager->AddObserver(observer); |
+ RunMessageLoop(); |
+ // Added observer should get an update. |
+ EXPECT_EQ(1, observer->updates_count()); |
+ EXPECT_EQ(1u, observer->target_list().size()); |
+ EXPECT_EQ(contents(), |
+ observer->target_list()[0]->GetAgentHost()->GetWebContents()); |
+ EXPECT_EQ(url1.spec(), |
+ observer->target_list()[0]->GetURL().spec()); |
+ |
+ contents()->NavigateAndCommit(url2); |
+ RunAllPendingInMessageLoop(); |
+ contents()->NavigateAndCommit(url3); |
+ RunMessageLoop(); |
+ // Updates should be coalesced. |
+ EXPECT_EQ(2, observer->updates_count()); |
+ EXPECT_EQ(1u, observer->target_list().size()); |
+ EXPECT_EQ(contents(), |
+ observer->target_list()[0]->GetAgentHost()->GetWebContents()); |
+ EXPECT_EQ(url3.spec(), |
+ observer->target_list()[0]->GetURL().spec()); |
+ |
+ base::MessageLoop::current()->PostDelayedTask( |
+ FROM_HERE, |
+ base::MessageLoop::QuitClosure(), |
+ base::TimeDelta::FromMilliseconds(250)); |
+ base::MessageLoop::current()->Run(); |
+ // Check there were no extra updates. |
+ EXPECT_EQ(2, observer->updates_count()); |
+ |
+ scoped_ptr<WorkerStoragePartition> partition(new WorkerStoragePartition( |
+ browser_context()->GetRequestContext(), |
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL)); |
+ WorkerStoragePartitionId partition_id(*partition.get()); |
+ |
+ GURL shared_worker_url("http://example.com/shared_worker.js"); |
+ SharedWorkerInstance shared_worker( |
+ shared_worker_url, |
+ base::string16(), |
+ base::string16(), |
+ blink::WebContentSecurityPolicyTypeReport, |
+ browser_context()->GetResourceContext(), |
+ partition_id); |
+ EmbeddedWorkerDevToolsManager::GetInstance()->SharedWorkerCreated( |
+ 1, 1, shared_worker); |
+ contents()->NavigateAndCommit(url2); |
+ |
+ RunMessageLoop(); |
+ EXPECT_EQ(3, observer->updates_count()); |
+ EXPECT_EQ(2u, observer->target_list().size()); |
+ EXPECT_EQ(contents(), |
+ observer->target_list()[0]->GetAgentHost()->GetWebContents()); |
+ EXPECT_EQ(url2.spec(), |
+ observer->target_list()[0]->GetURL().spec()); |
+ EXPECT_EQ(DevToolsAgentHost::TYPE_SHARED_WORKER, |
+ observer->target_list()[1]->GetAgentHost()->GetType()); |
+ EXPECT_EQ(shared_worker_url.spec(), |
+ observer->target_list()[1]->GetURL().spec()); |
+ |
+ EmbeddedWorkerDevToolsManager::GetInstance()->WorkerDestroyed(1, 1); |
+ RunMessageLoop(); |
+ EXPECT_EQ(4, observer->updates_count()); |
+ EXPECT_EQ(1u, observer->target_list().size()); |
+ EXPECT_EQ(contents(), |
+ observer->target_list()[0]->GetAgentHost()->GetWebContents()); |
+ EXPECT_EQ(url2.spec(), |
+ observer->target_list()[0]->GetURL().spec()); |
+ |
+ base::MessageLoop::current()->PostDelayedTask( |
+ FROM_HERE, |
+ base::MessageLoop::QuitClosure(), |
+ base::TimeDelta::FromMilliseconds(250)); |
+ base::MessageLoop::current()->Run(); |
+ // Check there were no extra updates. |
+ EXPECT_EQ(4, observer->updates_count()); |
+ |
+ manager->RemoveObserver(observer); |
+} |
+ |
} // namespace content |