Enable calling WebContents::openDevTools for BrowserWindow's WebContents

This commit is contained in:
Cheng Zhao 2015-06-05 15:41:03 +08:00
parent 67144aaf2a
commit 94d69777fa
5 changed files with 78 additions and 43 deletions

View file

@ -95,17 +95,21 @@ content::ServiceWorkerContext* GetServiceWorkerContext(
if (!context || !site_instance)
return nullptr;
content::StoragePartition* storage_partition =
content::BrowserContext::GetStoragePartition(
context, site_instance);
DCHECK(storage_partition);
auto storage_partition =
content::BrowserContext::GetStoragePartition(context, site_instance);
if (!storage_partition)
return nullptr;
return storage_partition->GetServiceWorkerContext();
}
} // namespace
WebContents::WebContents(brightray::InspectableWebContents* web_contents)
: WebContents(web_contents->GetWebContents()) {
inspectable_web_contents_ = web_contents;
}
WebContents::WebContents(content::WebContents* web_contents)
: CommonWebContentsDelegate(false),
content::WebContentsObserver(web_contents),
@ -113,7 +117,8 @@ WebContents::WebContents(content::WebContents* web_contents)
guest_opaque_(true),
guest_host_(nullptr),
auto_size_enabled_(false),
is_full_page_plugin_(false) {
is_full_page_plugin_(false),
inspectable_web_contents_(nullptr) {
}
WebContents::WebContents(const mate::Dictionary& options)
@ -136,6 +141,7 @@ WebContents::WebContents(const mate::Dictionary& options)
auto web_contents = content::WebContents::Create(params);
InitWithWebContents(web_contents, GetWindowFromGuest(web_contents));
inspectable_web_contents_ = managed_web_contents();
Observe(GetWebContents());
}
@ -525,25 +531,67 @@ void WebContents::ExecuteJavaScript(const base::string16& code) {
}
void WebContents::OpenDevTools() {
if (!inspectable_web_contents())
return;
inspectable_web_contents()->SetCanDock(false);
inspectable_web_contents()->ShowDevTools();
}
void WebContents::CloseDevTools() {
if (!inspectable_web_contents())
return;
inspectable_web_contents()->CloseDevTools();
}
bool WebContents::IsDevToolsOpened() {
if (!inspectable_web_contents())
return false;
return inspectable_web_contents()->IsDevToolsViewShowing();
}
void WebContents::InspectElement(int x, int y) {
if (!inspectable_web_contents())
return;
OpenDevTools();
scoped_refptr<content::DevToolsAgentHost> agent(
content::DevToolsAgentHost::GetOrCreateFor(web_contents()));
agent->InspectElement(x, y);
}
void WebContents::InspectServiceWorker() {
if (!inspectable_web_contents())
return;
for (const auto& agent_host : content::DevToolsAgentHost::GetOrCreateAll()) {
if (agent_host->GetType() ==
content::DevToolsAgentHost::TYPE_SERVICE_WORKER) {
OpenDevTools();
inspectable_web_contents()->AttachTo(agent_host);
break;
}
}
}
void WebContents::HasServiceWorker(
const base::Callback<void(bool)>& callback) {
auto context = GetServiceWorkerContext(web_contents());
if (!context)
return;
context->CheckHasServiceWorker(web_contents()->GetLastCommittedURL(),
GURL::EmptyGURL(),
callback);
}
void WebContents::UnregisterServiceWorker(
const base::Callback<void(bool)>& callback) {
auto context = GetServiceWorkerContext(web_contents());
if (!context)
return;
context->UnregisterServiceWorker(web_contents()->GetLastCommittedURL(),
callback);
}
void WebContents::Undo() {
web_contents()->Undo();
}
@ -669,38 +717,6 @@ bool WebContents::IsGuest() const {
return is_guest();
}
void WebContents::HasServiceWorker(
const base::Callback<void(bool)>& callback) {
auto context = GetServiceWorkerContext(web_contents());
if (!context)
return;
context->CheckHasServiceWorker(web_contents()->GetLastCommittedURL(),
GURL::EmptyGURL(),
callback);
}
void WebContents::UnregisterServiceWorker(
const base::Callback<void(bool)>& callback) {
auto context = GetServiceWorkerContext(web_contents());
if (!context)
return;
context->UnregisterServiceWorker(web_contents()->GetLastCommittedURL(),
callback);
}
void WebContents::InspectServiceWorker() {
for (const auto& agent_host : content::DevToolsAgentHost::GetOrCreateAll()) {
if (agent_host->GetType() ==
content::DevToolsAgentHost::TYPE_SERVICE_WORKER) {
OpenDevTools();
inspectable_web_contents()->AttachTo(agent_host);
break;
}
}
}
mate::ObjectTemplateBuilder WebContents::GetObjectTemplateBuilder(
v8::Isolate* isolate) {
if (template_.IsEmpty())
@ -781,6 +797,12 @@ gfx::Size WebContents::GetDefaultSize() const {
}
}
// static
mate::Handle<WebContents> WebContents::CreateFrom(
v8::Isolate* isolate, brightray::InspectableWebContents* web_contents) {
return mate::CreateHandle(isolate, new WebContents(web_contents));
}
// static
mate::Handle<WebContents> WebContents::CreateFrom(
v8::Isolate* isolate, content::WebContents* web_contents) {

View file

@ -52,6 +52,8 @@ class WebContents : public mate::EventEmitter,
public content::GpuDataManagerObserver {
public:
// Create from an existing WebContents.
static mate::Handle<WebContents> CreateFrom(
v8::Isolate* isolate, brightray::InspectableWebContents* web_contents);
static mate::Handle<WebContents> CreateFrom(
v8::Isolate* isolate, content::WebContents* web_contents);
@ -80,9 +82,9 @@ class WebContents : public mate::EventEmitter,
void CloseDevTools();
bool IsDevToolsOpened();
void InspectElement(int x, int y);
void InspectServiceWorker();
void HasServiceWorker(const base::Callback<void(bool)>&);
void UnregisterServiceWorker(const base::Callback<void(bool)>&);
void InspectServiceWorker();
// Editing commands.
void Undo();
@ -113,11 +115,14 @@ class WebContents : public mate::EventEmitter,
// Returns whether this guest has an associated embedder.
bool attached() const { return !!embedder_web_contents_; }
content::WebContents* web_contents() const {
return content::WebContentsObserver::web_contents();
// Returns the current InspectableWebContents object, nullptr will be returned
// if current WebContents can not beinspected, e.g. it is the devtools.
brightray::InspectableWebContents* inspectable_web_contents() const {
return inspectable_web_contents_;
}
protected:
explicit WebContents(brightray::InspectableWebContents* web_contents);
explicit WebContents(content::WebContents* web_contents);
explicit WebContents(const mate::Dictionary& options);
~WebContents();
@ -257,6 +262,10 @@ class WebContents : public mate::EventEmitter,
// Whether the guest view is inside a plugin document.
bool is_full_page_plugin_;
// Current InspectableWebContents object, can be nullptr for WebContents of
// devtools. It is a weak reference.
brightray::InspectableWebContents* inspectable_web_contents_;
DISALLOW_COPY_AND_ASSIGN(WebContents);
};

View file

@ -473,7 +473,7 @@ bool Window::IsVisibleOnAllWorkspaces() {
}
mate::Handle<WebContents> Window::GetWebContents(v8::Isolate* isolate) const {
return WebContents::CreateFrom(isolate, window_->GetWebContents());
return WebContents::CreateFrom(isolate, window_->managed_web_contents());
}
mate::Handle<WebContents> Window::GetDevToolsWebContents(

View file

@ -38,7 +38,7 @@ class CommonWebContentsDelegate
// Returns the WebContents of devtools.
content::WebContents* GetDevToolsWebContents() const;
brightray::InspectableWebContents* inspectable_web_contents() const {
brightray::InspectableWebContents* managed_web_contents() const {
return web_contents_.get();
}

View file

@ -212,6 +212,10 @@ class NativeWindow : public CommonWebContentsDelegate,
observers_.RemoveObserver(obs);
}
brightray::InspectableWebContents* inspectable_web_contents() const {
return managed_web_contents();
}
bool has_frame() const { return has_frame_; }
bool is_html_api_fullscreen() const { return html_fullscreen_; }