summaryrefslogtreecommitdiffstats
path: root/content
diff options
context:
space:
mode:
authordgozman <dgozman@chromium.org>2014-09-29 04:04:18 -0700
committerCommit bot <commit-bot@chromium.org>2014-09-29 11:05:10 +0000
commit24bfc91b5903da97ed5f9330b701b92356688108 (patch)
treeb8c308da4cb138dbe8d6997b6fac0ce65f6c3047 /content
parent4396c20d5780ca76d69856cdf7a57c205a632c5f (diff)
downloadchromium_src-24bfc91b5903da97ed5f9330b701b92356688108.zip
chromium_src-24bfc91b5903da97ed5f9330b701b92356688108.tar.gz
chromium_src-24bfc91b5903da97ed5f9330b701b92356688108.tar.bz2
[DevTools] Implement DevToolsManager::Observer which notifies about target updates.
BUG=398049 Review URL: https://codereview.chromium.org/577923002 Cr-Commit-Position: refs/heads/master@{#297154}
Diffstat (limited to 'content')
-rw-r--r--content/browser/devtools/devtools_agent_host_impl.cc9
-rw-r--r--content/browser/devtools/devtools_manager.cc110
-rw-r--r--content/browser/devtools/devtools_manager.h45
-rw-r--r--content/browser/devtools/devtools_manager_unittest.cc205
-rw-r--r--content/browser/devtools/embedded_worker_devtools_manager.cc8
-rw-r--r--content/browser/devtools/render_view_devtools_agent_host.cc12
-rw-r--r--content/browser/devtools/render_view_devtools_agent_host.h3
-rw-r--r--content/browser/web_contents/web_contents_impl.cc4
8 files changed, 367 insertions, 29 deletions
diff --git a/content/browser/devtools/devtools_agent_host_impl.cc b/content/browser/devtools/devtools_agent_host_impl.cc
index 0630a04..b7f9b24 100644
--- a/content/browser/devtools/devtools_agent_host_impl.cc
+++ b/content/browser/devtools/devtools_agent_host_impl.cc
@@ -75,11 +75,10 @@ void DevToolsAgentHostImpl::AttachClient(DevToolsAgentHostClient* client) {
if (client_) {
client_->AgentHostClosed(this, true);
Detach();
- } else {
- DevToolsManager::GetInstance()->OnClientAttached();
}
client_ = client;
Attach();
+ DevToolsManager::GetInstance()->AgentHostChanged(this);
}
void DevToolsAgentHostImpl::DetachClient() {
@@ -88,8 +87,8 @@ void DevToolsAgentHostImpl::DetachClient() {
scoped_refptr<DevToolsAgentHostImpl> protect(this);
client_ = NULL;
- DevToolsManager::GetInstance()->OnClientDetached();
Detach();
+ DevToolsManager::GetInstance()->AgentHostChanged(this);
}
bool DevToolsAgentHostImpl::IsAttached() {
@@ -125,8 +124,8 @@ void DevToolsAgentHostImpl::HostClosed() {
// Clear |client_| before notifying it.
DevToolsAgentHostClient* client = client_;
client_ = NULL;
- DevToolsManager::GetInstance()->OnClientDetached();
client->AgentHostClosed(this, false);
+ DevToolsManager::GetInstance()->AgentHostChanged(this);
}
void DevToolsAgentHostImpl::SendMessageToClient(const std::string& message) {
@@ -150,9 +149,9 @@ void DevToolsAgentHost::DetachAllClients() {
// Clear |client_| before notifying it.
DevToolsAgentHostClient* client = agent_host->client_;
agent_host->client_ = NULL;
- DevToolsManager::GetInstance()->OnClientDetached();
client->AgentHostClosed(agent_host, true);
agent_host->Detach();
+ DevToolsManager::GetInstance()->AgentHostChanged(protect);
}
}
}
diff --git a/content/browser/devtools/devtools_manager.cc b/content/browser/devtools/devtools_manager.cc
index 6d8da53..3b24d5d 100644
--- a/content/browser/devtools/devtools_manager.cc
+++ b/content/browser/devtools/devtools_manager.cc
@@ -6,10 +6,11 @@
#include "base/bind.h"
#include "base/message_loop/message_loop.h"
+#include "content/browser/devtools/devtools_agent_host_impl.h"
#include "content/browser/devtools/devtools_netlog_observer.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/content_browser_client.h"
-#include "content/public/browser/devtools_manager_delegate.h"
+#include "content/public/browser/devtools_target.h"
namespace content {
@@ -20,31 +21,106 @@ DevToolsManager* DevToolsManager::GetInstance() {
DevToolsManager::DevToolsManager()
: delegate_(GetContentClient()->browser()->GetDevToolsManagerDelegate()),
- client_count_(0) {
+ update_target_list_required_(false),
+ update_target_list_scheduled_(false),
+ update_target_list_callback_(base::Bind(
+ &DevToolsManager::UpdateTargetListThrottled,
+ base::Unretained(this))) {
}
DevToolsManager::~DevToolsManager() {
- DCHECK(!client_count_);
+ DCHECK(!attached_hosts_.size());
+ update_target_list_callback_.Cancel();
}
-void DevToolsManager::OnClientAttached() {
- if (!client_count_) {
- BrowserThread::PostTask(
- BrowserThread::IO,
- FROM_HERE,
- base::Bind(&DevToolsNetLogObserver::Attach));
+void DevToolsManager::RenderViewCreated(
+ WebContents* web_contents, RenderViewHost* rvh) {
+ if (observer_list_.might_have_observers()) {
+ // Force agent host creation.
+ DevToolsAgentHost::GetOrCreateFor(web_contents);
}
- client_count_++;
}
-void DevToolsManager::OnClientDetached() {
- client_count_--;
- if (!client_count_) {
- BrowserThread::PostTask(
- BrowserThread::IO,
- FROM_HERE,
- base::Bind(&DevToolsNetLogObserver::Detach));
+void DevToolsManager::AgentHostChanged(
+ scoped_refptr<DevToolsAgentHost> agent_host) {
+ bool was_attached =
+ attached_hosts_.find(agent_host.get()) != attached_hosts_.end();
+ if (agent_host->IsAttached() && !was_attached) {
+ if (!attached_hosts_.size()) {
+ BrowserThread::PostTask(
+ BrowserThread::IO,
+ FROM_HERE,
+ base::Bind(&DevToolsNetLogObserver::Attach));
+ }
+ attached_hosts_.insert(agent_host.get());
+ } else if (!agent_host->IsAttached() && was_attached) {
+ attached_hosts_.erase(agent_host.get());
+ if (!attached_hosts_.size()) {
+ BrowserThread::PostTask(
+ BrowserThread::IO,
+ FROM_HERE,
+ base::Bind(&DevToolsNetLogObserver::Detach));
+ }
}
+
+ UpdateTargetList();
+}
+
+void DevToolsManager::AddObserver(Observer* observer) {
+ observer_list_.AddObserver(observer);
+ UpdateTargetList();
+}
+
+void DevToolsManager::RemoveObserver(Observer* observer) {
+ observer_list_.RemoveObserver(observer);
+}
+
+void DevToolsManager::UpdateTargetList() {
+ if (!observer_list_.might_have_observers())
+ return;
+
+ update_target_list_required_ = true;
+ if (!update_target_list_scheduled_)
+ UpdateTargetListThrottled();
+}
+
+void DevToolsManager::UpdateTargetListThrottled() {
+ if (!update_target_list_required_) {
+ update_target_list_scheduled_ = false;
+ return;
+ }
+
+ update_target_list_scheduled_ = true;
+ base::MessageLoop::current()->PostDelayedTask(
+ FROM_HERE,
+ update_target_list_callback_.callback(),
+ observer_throttle_interval_);
+
+ update_target_list_required_ = false;
+ if (!delegate_) {
+ Observer::TargetList empty_list;
+ NotifyTargetListChanged(empty_list);
+ return;
+ }
+ delegate_->EnumerateTargets(base::Bind(
+ &DevToolsManager::NotifyTargetListChanged,
+ base::Unretained(this)));
+}
+
+void DevToolsManager::NotifyTargetListChanged(
+ const Observer::TargetList& targets) {
+ FOR_EACH_OBSERVER(Observer, observer_list_, TargetListChanged(targets));
+ STLDeleteContainerPointers(targets.begin(), targets.end());
+}
+
+// static
+base::TimeDelta DevToolsManager::observer_throttle_interval_ =
+ base::TimeDelta::FromMilliseconds(500);
+
+// static
+void DevToolsManager::SetObserverThrottleIntervalForTest(
+ base::TimeDelta interval) {
+ observer_throttle_interval_ = interval;
}
} // namespace content
diff --git a/content/browser/devtools/devtools_manager.h b/content/browser/devtools/devtools_manager.h
index 0f91f20..5a86d25 100644
--- a/content/browser/devtools/devtools_manager.h
+++ b/content/browser/devtools/devtools_manager.h
@@ -6,20 +6,39 @@
#define CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_MANAGER_H_
#include <map>
+#include <set>
#include <string>
#include <vector>
+#include "base/cancelable_callback.h"
#include "base/compiler_specific.h"
#include "base/memory/singleton.h"
+#include "base/observer_list.h"
+#include "content/common/content_export.h"
+#include "content/public/browser/devtools_manager_delegate.h"
namespace content {
-class DevToolsManagerDelegate;
+class DevToolsAgentHost;
+class RenderViewHost;
+class WebContents;
// This class is a singleton that manage global DevTools state for the whole
// browser.
-class DevToolsManager {
+class CONTENT_EXPORT DevToolsManager {
public:
+ class Observer {
+ public:
+ virtual ~Observer() {}
+
+ typedef DevToolsManagerDelegate::TargetList TargetList;
+
+ // Called when any target information changed. Targets in the list are
+ // owned by DevToolsManager, so they should not be accessed outside of
+ // this method.
+ virtual void TargetListChanged(const TargetList& targets) {}
+ };
+
// Returns single instance of this class. The instance is destroyed on the
// browser main loop exit so this method MUST NOT be called after that point.
static DevToolsManager* GetInstance();
@@ -28,14 +47,30 @@ class DevToolsManager {
virtual ~DevToolsManager();
DevToolsManagerDelegate* delegate() const { return delegate_.get(); }
- void OnClientAttached();
- void OnClientDetached();
+
+ void AddObserver(Observer* observer);
+ void RemoveObserver(Observer* observer);
+
+ void RenderViewCreated(WebContents* web_contents, RenderViewHost* rvh);
+ void AgentHostChanged(scoped_refptr<DevToolsAgentHost> agent_host);
+
+ static void SetObserverThrottleIntervalForTest(base::TimeDelta interval);
private:
friend struct DefaultSingletonTraits<DevToolsManager>;
+ void UpdateTargetList();
+ void UpdateTargetListThrottled();
+ void NotifyTargetListChanged(const Observer::TargetList& targets);
+
scoped_ptr<DevToolsManagerDelegate> delegate_;
- int client_count_;
+ ObserverList<Observer> observer_list_;
+ std::set<DevToolsAgentHost*> attached_hosts_;
+ bool update_target_list_required_;
+ bool update_target_list_scheduled_;
+ base::CancelableClosure update_target_list_callback_;
+
+ static base::TimeDelta observer_throttle_interval_;
DISALLOW_COPY_AND_ASSIGN(DevToolsManager);
};
diff --git a/content/browser/devtools/devtools_manager_unittest.cc b/content/browser/devtools/devtools_manager_unittest.cc
index 1da4418..2969cc5 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,129 @@ 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:
+ virtual ~ContentBrowserClientWithDevTools() {}
+ virtual content::DevToolsManagerDelegate*
+ GetDevToolsManagerDelegate() OVERRIDE {
+ return new TestDevToolsManagerDelegate();
+ }
+};
+
+class TestDevToolsManagerObserver : public DevToolsManager::Observer {
+ public:
+ TestDevToolsManagerObserver()
+ : updates_count_(0) {}
+ virtual ~TestDevToolsManagerObserver() {}
+
+ int updates_count() { return updates_count_; }
+ const std::vector<scoped_refptr<DevToolsAgentHost>> hosts() {
+ return hosts_;
+ }
+
+ virtual void TargetListChanged(const TargetList& targets) OVERRIDE {
+ updates_count_++;
+ hosts_.clear();
+ for (TargetList::const_iterator it = targets.begin();
+ it != targets.end(); ++it) {
+ hosts_.push_back((*it)->GetAgentHost());
+ }
+ base::MessageLoop::current()->PostTask(
+ FROM_HERE,
+ base::MessageLoop::QuitClosure());
+ }
+
+ private:
+ int updates_count_;
+ std::vector<scoped_refptr<DevToolsAgentHost>> hosts_;
+};
+
} // namespace
class DevToolsManagerTest : public RenderViewHostImplTestHarness {
+ public:
+ DevToolsManagerTest()
+ : old_browser_client_(NULL) {}
+
protected:
virtual void SetUp() OVERRIDE {
RenderViewHostImplTestHarness::SetUp();
TestDevToolsClientHost::ResetCounters();
+ old_browser_client_ = SetBrowserClientForTesting(&browser_client_);
}
+
+ virtual void TearDown() OVERRIDE {
+ SetBrowserClientForTesting(old_browser_client_);
+ RenderViewHostImplTestHarness::TearDown();
+ }
+
+ ContentBrowserClientWithDevTools browser_client_;
+ ContentBrowserClient* old_browser_client_;
};
TEST_F(DevToolsManagerTest, OpenAndManuallyCloseDevToolsClientHost) {
@@ -239,4 +360,88 @@ 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();
+
+ scoped_ptr<TestDevToolsManagerObserver> observer(
+ new TestDevToolsManagerObserver());
+ manager->AddObserver(observer.get());
+ RunMessageLoop();
+ // Added observer should get an update.
+ EXPECT_EQ(1, observer->updates_count());
+ EXPECT_EQ(1u, observer->hosts().size());
+ EXPECT_EQ(contents(), observer->hosts()[0]->GetWebContents());
+ EXPECT_EQ(url1.spec(), observer->hosts()[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->hosts().size());
+ EXPECT_EQ(contents(), observer->hosts()[0]->GetWebContents());
+ EXPECT_EQ(url3.spec(), observer->hosts()[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->hosts().size());
+ EXPECT_EQ(contents(), observer->hosts()[0]->GetWebContents());
+ EXPECT_EQ(url2.spec(), observer->hosts()[0]->GetURL().spec());
+ EXPECT_EQ(DevToolsAgentHost::TYPE_SHARED_WORKER,
+ observer->hosts()[1]->GetType());
+ EXPECT_EQ(shared_worker_url.spec(), observer->hosts()[1]->GetURL().spec());
+
+ EmbeddedWorkerDevToolsManager::GetInstance()->WorkerDestroyed(1, 1);
+ RunMessageLoop();
+ EXPECT_EQ(4, observer->updates_count());
+ EXPECT_EQ(1u, observer->hosts().size());
+ EXPECT_EQ(contents(), observer->hosts()[0]->GetWebContents());
+ EXPECT_EQ(url2.spec(), observer->hosts()[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.get());
+}
+
} // namespace content
diff --git a/content/browser/devtools/embedded_worker_devtools_manager.cc b/content/browser/devtools/embedded_worker_devtools_manager.cc
index 64f30bc..94377b7 100644
--- a/content/browser/devtools/embedded_worker_devtools_manager.cc
+++ b/content/browser/devtools/embedded_worker_devtools_manager.cc
@@ -4,6 +4,7 @@
#include "content/browser/devtools/embedded_worker_devtools_manager.h"
+#include "content/browser/devtools/devtools_manager.h"
#include "content/browser/devtools/devtools_protocol.h"
#include "content/browser/devtools/devtools_protocol_constants.h"
#include "content/browser/devtools/embedded_worker_devtools_agent_host.h"
@@ -104,6 +105,7 @@ bool EmbeddedWorkerDevToolsManager::SharedWorkerCreated(
AgentHostMap::iterator it = FindExistingSharedWorkerAgentHost(instance);
if (it == workers_.end()) {
workers_[id] = new EmbeddedWorkerDevToolsAgentHost(id, instance);
+ DevToolsManager::GetInstance()->AgentHostChanged(workers_[id]);
return false;
}
WorkerRestarted(id, it);
@@ -121,6 +123,7 @@ bool EmbeddedWorkerDevToolsManager::ServiceWorkerCreated(
if (it == workers_.end()) {
workers_[id] = new EmbeddedWorkerDevToolsAgentHost(
id, service_worker_id, debug_service_worker_on_start_);
+ DevToolsManager::GetInstance()->AgentHostChanged(workers_[id]);
return debug_service_worker_on_start_;
}
WorkerRestarted(id, it);
@@ -133,7 +136,9 @@ void EmbeddedWorkerDevToolsManager::WorkerDestroyed(int worker_process_id,
const WorkerId id(worker_process_id, worker_route_id);
AgentHostMap::iterator it = workers_.find(id);
DCHECK(it != workers_.end());
- it->second->WorkerDestroyed();
+ scoped_refptr<EmbeddedWorkerDevToolsAgentHost> agent_host(it->second);
+ agent_host->WorkerDestroyed();
+ DevToolsManager::GetInstance()->AgentHostChanged(agent_host);
}
void EmbeddedWorkerDevToolsManager::WorkerReadyForInspection(
@@ -201,6 +206,7 @@ void EmbeddedWorkerDevToolsManager::WorkerRestarted(
agent_host->WorkerRestarted(id);
workers_.erase(it);
workers_[id] = agent_host;
+ DevToolsManager::GetInstance()->AgentHostChanged(agent_host);
}
void EmbeddedWorkerDevToolsManager::ResetForTesting() {
diff --git a/content/browser/devtools/render_view_devtools_agent_host.cc b/content/browser/devtools/render_view_devtools_agent_host.cc
index 7045b37..7535201 100644
--- a/content/browser/devtools/render_view_devtools_agent_host.cc
+++ b/content/browser/devtools/render_view_devtools_agent_host.cc
@@ -123,6 +123,7 @@ RenderViewDevToolsAgentHost::RenderViewDevToolsAgentHost(RenderViewHost* rvh)
power_handler_->SetNotifier(notifier);
g_instances.Get().push_back(this);
AddRef(); // Balanced in RenderViewHostDestroyed.
+ DevToolsManager::GetInstance()->AgentHostChanged(this);
}
WebContents* RenderViewDevToolsAgentHost::GetWebContents() {
@@ -290,6 +291,7 @@ void RenderViewDevToolsAgentHost::RenderViewDeleted(RenderViewHost* rvh) {
scoped_refptr<RenderViewDevToolsAgentHost> protect(this);
HostClosed();
ClearRenderViewHost();
+ DevToolsManager::GetInstance()->AgentHostChanged(this);
Release();
}
@@ -339,6 +341,16 @@ void RenderViewDevToolsAgentHost::DidDetachInterstitialPage() {
overrides_handler_->DidDetachInterstitialPage();
}
+void RenderViewDevToolsAgentHost::TitleWasSet(
+ NavigationEntry* entry, bool explicit_set) {
+ DevToolsManager::GetInstance()->AgentHostChanged(this);
+}
+
+void RenderViewDevToolsAgentHost::NavigationEntryCommitted(
+ const LoadCommittedDetails& load_details) {
+ DevToolsManager::GetInstance()->AgentHostChanged(this);
+}
+
void RenderViewDevToolsAgentHost::Observe(int type,
const NotificationSource& source,
const NotificationDetails& details) {
diff --git a/content/browser/devtools/render_view_devtools_agent_host.h b/content/browser/devtools/render_view_devtools_agent_host.h
index 7b35388..181b079 100644
--- a/content/browser/devtools/render_view_devtools_agent_host.h
+++ b/content/browser/devtools/render_view_devtools_agent_host.h
@@ -76,6 +76,9 @@ class CONTENT_EXPORT RenderViewDevToolsAgentHost
virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
virtual void DidAttachInterstitialPage() OVERRIDE;
virtual void DidDetachInterstitialPage() OVERRIDE;
+ virtual void TitleWasSet(NavigationEntry* entry, bool explicit_set) OVERRIDE;
+ virtual void NavigationEntryCommitted(
+ const LoadCommittedDetails& load_details) OVERRIDE;
// NotificationObserver overrides:
virtual void Observe(int type,
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index b6ff810..e5529cd 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -23,7 +23,7 @@
#include "content/browser/browser_plugin/browser_plugin_embedder.h"
#include "content/browser/browser_plugin/browser_plugin_guest.h"
#include "content/browser/child_process_security_policy_impl.h"
-#include "content/browser/devtools/render_view_devtools_agent_host.h"
+#include "content/browser/devtools/devtools_manager.h"
#include "content/browser/dom_storage/dom_storage_context_wrapper.h"
#include "content/browser/dom_storage/session_storage_namespace_impl.h"
#include "content/browser/download/download_stats.h"
@@ -3559,6 +3559,8 @@ void WebContentsImpl::RenderViewCreated(RenderViewHost* render_view_host) {
FOR_EACH_OBSERVER(
WebContentsObserver, observers_, RenderFrameCreated(main_frame));
SetAccessibilityModeOnFrame(accessibility_mode_, main_frame);
+
+ DevToolsManager::GetInstance()->RenderViewCreated(this, render_view_host);
}
void WebContentsImpl::RenderViewReady(RenderViewHost* rvh) {