Commit 24bfc91b authored by dgozman's avatar dgozman Committed by Commit bot

[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}
parent 4396c20d
...@@ -75,11 +75,10 @@ void DevToolsAgentHostImpl::AttachClient(DevToolsAgentHostClient* client) { ...@@ -75,11 +75,10 @@ void DevToolsAgentHostImpl::AttachClient(DevToolsAgentHostClient* client) {
if (client_) { if (client_) {
client_->AgentHostClosed(this, true); client_->AgentHostClosed(this, true);
Detach(); Detach();
} else {
DevToolsManager::GetInstance()->OnClientAttached();
} }
client_ = client; client_ = client;
Attach(); Attach();
DevToolsManager::GetInstance()->AgentHostChanged(this);
} }
void DevToolsAgentHostImpl::DetachClient() { void DevToolsAgentHostImpl::DetachClient() {
...@@ -88,8 +87,8 @@ void DevToolsAgentHostImpl::DetachClient() { ...@@ -88,8 +87,8 @@ void DevToolsAgentHostImpl::DetachClient() {
scoped_refptr<DevToolsAgentHostImpl> protect(this); scoped_refptr<DevToolsAgentHostImpl> protect(this);
client_ = NULL; client_ = NULL;
DevToolsManager::GetInstance()->OnClientDetached();
Detach(); Detach();
DevToolsManager::GetInstance()->AgentHostChanged(this);
} }
bool DevToolsAgentHostImpl::IsAttached() { bool DevToolsAgentHostImpl::IsAttached() {
...@@ -125,8 +124,8 @@ void DevToolsAgentHostImpl::HostClosed() { ...@@ -125,8 +124,8 @@ void DevToolsAgentHostImpl::HostClosed() {
// Clear |client_| before notifying it. // Clear |client_| before notifying it.
DevToolsAgentHostClient* client = client_; DevToolsAgentHostClient* client = client_;
client_ = NULL; client_ = NULL;
DevToolsManager::GetInstance()->OnClientDetached();
client->AgentHostClosed(this, false); client->AgentHostClosed(this, false);
DevToolsManager::GetInstance()->AgentHostChanged(this);
} }
void DevToolsAgentHostImpl::SendMessageToClient(const std::string& message) { void DevToolsAgentHostImpl::SendMessageToClient(const std::string& message) {
...@@ -150,9 +149,9 @@ void DevToolsAgentHost::DetachAllClients() { ...@@ -150,9 +149,9 @@ void DevToolsAgentHost::DetachAllClients() {
// Clear |client_| before notifying it. // Clear |client_| before notifying it.
DevToolsAgentHostClient* client = agent_host->client_; DevToolsAgentHostClient* client = agent_host->client_;
agent_host->client_ = NULL; agent_host->client_ = NULL;
DevToolsManager::GetInstance()->OnClientDetached();
client->AgentHostClosed(agent_host, true); client->AgentHostClosed(agent_host, true);
agent_host->Detach(); agent_host->Detach();
DevToolsManager::GetInstance()->AgentHostChanged(protect);
} }
} }
} }
......
...@@ -6,10 +6,11 @@ ...@@ -6,10 +6,11 @@
#include "base/bind.h" #include "base/bind.h"
#include "base/message_loop/message_loop.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/browser/devtools/devtools_netlog_observer.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "content/public/browser/content_browser_client.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 { namespace content {
...@@ -20,31 +21,106 @@ DevToolsManager* DevToolsManager::GetInstance() { ...@@ -20,31 +21,106 @@ DevToolsManager* DevToolsManager::GetInstance() {
DevToolsManager::DevToolsManager() DevToolsManager::DevToolsManager()
: delegate_(GetContentClient()->browser()->GetDevToolsManagerDelegate()), : 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() { DevToolsManager::~DevToolsManager() {
DCHECK(!client_count_); DCHECK(!attached_hosts_.size());
update_target_list_callback_.Cancel();
} }
void DevToolsManager::OnClientAttached() { void DevToolsManager::RenderViewCreated(
if (!client_count_) { WebContents* web_contents, RenderViewHost* rvh) {
if (observer_list_.might_have_observers()) {
// Force agent host creation.
DevToolsAgentHost::GetOrCreateFor(web_contents);
}
}
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::PostTask(
BrowserThread::IO, BrowserThread::IO,
FROM_HERE, FROM_HERE,
base::Bind(&DevToolsNetLogObserver::Attach)); base::Bind(&DevToolsNetLogObserver::Attach));
} }
client_count_++; attached_hosts_.insert(agent_host.get());
} } else if (!agent_host->IsAttached() && was_attached) {
attached_hosts_.erase(agent_host.get());
void DevToolsManager::OnClientDetached() { if (!attached_hosts_.size()) {
client_count_--;
if (!client_count_) {
BrowserThread::PostTask( BrowserThread::PostTask(
BrowserThread::IO, BrowserThread::IO,
FROM_HERE, FROM_HERE,
base::Bind(&DevToolsNetLogObserver::Detach)); 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 } // namespace content
...@@ -6,20 +6,39 @@ ...@@ -6,20 +6,39 @@
#define CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_MANAGER_H_ #define CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_MANAGER_H_
#include <map> #include <map>
#include <set>
#include <string> #include <string>
#include <vector> #include <vector>
#include "base/cancelable_callback.h"
#include "base/compiler_specific.h" #include "base/compiler_specific.h"
#include "base/memory/singleton.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 { namespace content {
class DevToolsManagerDelegate; class DevToolsAgentHost;
class RenderViewHost;
class WebContents;
// This class is a singleton that manage global DevTools state for the whole // This class is a singleton that manage global DevTools state for the whole
// browser. // browser.
class DevToolsManager { class CONTENT_EXPORT DevToolsManager {
public: 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 // 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. // browser main loop exit so this method MUST NOT be called after that point.
static DevToolsManager* GetInstance(); static DevToolsManager* GetInstance();
...@@ -28,14 +47,30 @@ class DevToolsManager { ...@@ -28,14 +47,30 @@ class DevToolsManager {
virtual ~DevToolsManager(); virtual ~DevToolsManager();
DevToolsManagerDelegate* delegate() const { return delegate_.get(); } 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: private:
friend struct DefaultSingletonTraits<DevToolsManager>; friend struct DefaultSingletonTraits<DevToolsManager>;
void UpdateTargetList();
void UpdateTargetListThrottled();
void NotifyTargetListChanged(const Observer::TargetList& targets);
scoped_ptr<DevToolsManagerDelegate> delegate_; 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); DISALLOW_COPY_AND_ASSIGN(DevToolsManager);
}; };
......
...@@ -6,13 +6,19 @@ ...@@ -6,13 +6,19 @@
#include "base/memory/scoped_ptr.h" #include "base/memory/scoped_ptr.h"
#include "base/time/time.h" #include "base/time/time.h"
#include "content/browser/devtools/devtools_manager.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/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/common/view_messages.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/content_browser_client.h" #include "content/public/browser/content_browser_client.h"
#include "content/public/browser/devtools_agent_host.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.h"
#include "content/public/browser/devtools_external_agent_proxy_delegate.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/browser/web_contents_delegate.h"
#include "content/public/test/test_utils.h"
#include "content/test/test_content_browser_client.h" #include "content/test/test_content_browser_client.h"
#include "content/test/test_render_view_host.h" #include "content/test/test_render_view_host.h"
#include "content/test/test_web_contents.h" #include "content/test/test_web_contents.h"
...@@ -93,14 +99,129 @@ class TestWebContentsDelegate : public WebContentsDelegate { ...@@ -93,14 +99,129 @@ class TestWebContentsDelegate : public WebContentsDelegate {
bool renderer_unresponsive_received_; 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 } // namespace
class DevToolsManagerTest : public RenderViewHostImplTestHarness { class DevToolsManagerTest : public RenderViewHostImplTestHarness {
public:
DevToolsManagerTest()
: old_browser_client_(NULL) {}
protected: protected:
virtual void SetUp() OVERRIDE { virtual void SetUp() OVERRIDE {
RenderViewHostImplTestHarness::SetUp(); RenderViewHostImplTestHarness::SetUp();
TestDevToolsClientHost::ResetCounters(); 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) { TEST_F(DevToolsManagerTest, OpenAndManuallyCloseDevToolsClientHost) {
...@@ -239,4 +360,88 @@ TEST_F(DevToolsManagerTest, TestExternalProxy) { ...@@ -239,4 +360,88 @@ TEST_F(DevToolsManagerTest, TestExternalProxy) {
client_host.Close(); 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 } // namespace content
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include "content/browser/devtools/embedded_worker_devtools_manager.h" #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.h"
#include "content/browser/devtools/devtools_protocol_constants.h" #include "content/browser/devtools/devtools_protocol_constants.h"
#include "content/browser/devtools/embedded_worker_devtools_agent_host.h" #include "content/browser/devtools/embedded_worker_devtools_agent_host.h"
...@@ -104,6 +105,7 @@ bool EmbeddedWorkerDevToolsManager::SharedWorkerCreated( ...@@ -104,6 +105,7 @@ bool EmbeddedWorkerDevToolsManager::SharedWorkerCreated(
AgentHostMap::iterator it = FindExistingSharedWorkerAgentHost(instance); AgentHostMap::iterator it = FindExistingSharedWorkerAgentHost(instance);
if (it == workers_.end()) { if (it == workers_.end()) {
workers_[id] = new EmbeddedWorkerDevToolsAgentHost(id, instance); workers_[id] = new EmbeddedWorkerDevToolsAgentHost(id, instance);
DevToolsManager::GetInstance()->AgentHostChanged(workers_[id]);
return false; return false;
} }
WorkerRestarted(id, it); WorkerRestarted(id, it);
...@@ -121,6 +123,7 @@ bool EmbeddedWorkerDevToolsManager::ServiceWorkerCreated( ...@@ -121,6 +123,7 @@ bool EmbeddedWorkerDevToolsManager::ServiceWorkerCreated(
if (it == workers_.end()) { if (it == workers_.end()) {
workers_[id] = new EmbeddedWorkerDevToolsAgentHost( workers_[id] = new EmbeddedWorkerDevToolsAgentHost(
id, service_worker_id, debug_service_worker_on_start_); id, service_worker_id, debug_service_worker_on_start_);
DevToolsManager::GetInstance()->AgentHostChanged(workers_[id]);
return debug_service_worker_on_start_; return debug_service_worker_on_start_;
} }
WorkerRestarted(id, it); WorkerRestarted(id, it);
...@@ -133,7 +136,9 @@ void EmbeddedWorkerDevToolsManager::WorkerDestroyed(int worker_process_id, ...@@ -133,7 +136,9 @@ void EmbeddedWorkerDevToolsManager::WorkerDestroyed(int worker_process_id,
const WorkerId id(worker_process_id, worker_route_id); const WorkerId id(worker_process_id, worker_route_id);
AgentHostMap::iterator it = workers_.find(id); AgentHostMap::iterator it = workers_.find(id);
DCHECK(it != workers_.end()); 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( void EmbeddedWorkerDevToolsManager::WorkerReadyForInspection(
...@@ -201,6 +206,7 @@ void EmbeddedWorkerDevToolsManager::WorkerRestarted( ...@@ -201,6 +206,7 @@ void EmbeddedWorkerDevToolsManager::WorkerRestarted(
agent_host->WorkerRestarted(id); agent_host->WorkerRestarted(id);
workers_.erase(it); workers_.erase(it);
workers_[id] = agent_host; workers_[id] = agent_host;
DevToolsManager::GetInstance()->AgentHostChanged(agent_host);
} }
void EmbeddedWorkerDevToolsManager::ResetForTesting() { void EmbeddedWorkerDevToolsManager::ResetForTesting() {
......
...@@ -123,6 +123,7 @@ RenderViewDevToolsAgentHost::RenderViewDevToolsAgentHost(RenderViewHost* rvh) ...@@ -123,6 +123,7 @@ RenderViewDevToolsAgentHost::RenderViewDevToolsAgentHost(RenderViewHost* rvh)
power_handler_->SetNotifier(notifier); power_handler_->SetNotifier(notifier);
g_instances.Get().push_back(this); g_instances.Get().push_back(this);
AddRef(); // Balanced in RenderViewHostDestroyed. AddRef(); // Balanced in RenderViewHostDestroyed.
DevToolsManager::GetInstance()->AgentHostChanged(this);
} }
WebContents* RenderViewDevToolsAgentHost::GetWebContents() { WebContents* RenderViewDevToolsAgentHost::GetWebContents() {
...@@ -290,6 +291,7 @@ void RenderViewDevToolsAgentHost::RenderViewDeleted(RenderViewHost* rvh) { ...@@ -290,6 +291,7 @@ void RenderViewDevToolsAgentHost::RenderViewDeleted(RenderViewHost* rvh) {
scoped_refptr<RenderViewDevToolsAgentHost> protect(this); scoped_refptr<RenderViewDevToolsAgentHost> protect(this);
HostClosed(); HostClosed();
ClearRenderViewHost(); ClearRenderViewHost();
DevToolsManager::GetInstance()->AgentHostChanged(this);
Release(); Release();
} }
...@@ -339,6 +341,16 @@ void RenderViewDevToolsAgentHost::DidDetachInterstitialPage() { ...@@ -339,6 +341,16 @@ void RenderViewDevToolsAgentHost::DidDetachInterstitialPage() {
overrides_handler_->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, void RenderViewDevToolsAgentHost::Observe(int type,
const NotificationSource& source, const NotificationSource& source,
const NotificationDetails& details) { const NotificationDetails& details) {
......
...@@ -76,6 +76,9 @@ class CONTENT_EXPORT RenderViewDevToolsAgentHost ...@@ -76,6 +76,9 @@ class CONTENT_EXPORT RenderViewDevToolsAgentHost
virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
virtual void DidAttachInterstitialPage() OVERRIDE; virtual void DidAttachInterstitialPage() OVERRIDE;
virtual void DidDetachInterstitialPage() OVERRIDE; virtual void DidDetachInterstitialPage() OVERRIDE;
virtual void TitleWasSet(NavigationEntry* entry, bool explicit_set) OVERRIDE;
virtual void NavigationEntryCommitted(
const LoadCommittedDetails& load_details) OVERRIDE;
// NotificationObserver overrides: // NotificationObserver overrides:
virtual void Observe(int type, virtual void Observe(int type,
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
#include "content/browser/browser_plugin/browser_plugin_embedder.h" #include "content/browser/browser_plugin/browser_plugin_embedder.h"
#include "content/browser/browser_plugin/browser_plugin_guest.h" #include "content/browser/browser_plugin/browser_plugin_guest.h"
#include "content/browser/child_process_security_policy_impl.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/dom_storage_context_wrapper.h"
#include "content/browser/dom_storage/session_storage_namespace_impl.h" #include "content/browser/dom_storage/session_storage_namespace_impl.h"
#include "content/browser/download/download_stats.h" #include "content/browser/download/download_stats.h"
...@@ -3559,6 +3559,8 @@ void WebContentsImpl::RenderViewCreated(RenderViewHost* render_view_host) { ...@@ -3559,6 +3559,8 @@ void WebContentsImpl::RenderViewCreated(RenderViewHost* render_view_host) {
FOR_EACH_OBSERVER( FOR_EACH_OBSERVER(
WebContentsObserver, observers_, RenderFrameCreated(main_frame)); WebContentsObserver, observers_, RenderFrameCreated(main_frame));
SetAccessibilityModeOnFrame(accessibility_mode_, main_frame); SetAccessibilityModeOnFrame(accessibility_mode_, main_frame);
DevToolsManager::GetInstance()->RenderViewCreated(this, render_view_host);
} }
void WebContentsImpl::RenderViewReady(RenderViewHost* rvh) { void WebContentsImpl::RenderViewReady(RenderViewHost* rvh) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment