diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index bcf42553e983..9c878adf507e 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -10,6 +10,9 @@ #include "atom/common/native_mate_converters/gurl_converter.h" #include "atom/common/native_mate_converters/string16_converter.h" #include "atom/common/native_mate_converters/value_converter.h" +#include "atom/browser/atom_javascript_dialog_manager.h" +#include "brightray/browser/inspectable_web_contents.h" +#include "brightray/browser/inspectable_web_contents_view.h" #include "base/strings/utf_string_conversions.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_process_host.h" @@ -58,6 +61,9 @@ WebContents::WebContents(const mate::Dictionary& options) storage_.reset(content::WebContents::Create(params)); storage_->SetDelegate(this); Observe(storage_.get()); + + inspectable_web_contents_.reset( + brightray::InspectableWebContents::Create(storage_.get())); } WebContents::~WebContents() { @@ -368,6 +374,13 @@ void WebContents::ExecuteJavaScript(const base::string16& code) { web_contents()->GetMainFrame()->ExecuteJavaScript(code); } +void WebContents::OpenDevTools() { + inspectable_web_contents()->ShowDevTools(); + + // force the inspectable web contents to be undocked when it is opened. + inspectable_web_contents()->GetView()->SetIsDocked(false); +} + bool WebContents::SendIPCMessage(const base::string16& channel, const base::ListValue& args) { return Send(new AtomViewMsg_Message(routing_id(), channel, args)); @@ -442,6 +455,7 @@ mate::ObjectTemplateBuilder WebContents::GetObjectTemplateBuilder( .SetMethod("setAutoSize", &WebContents::SetAutoSize) .SetMethod("setAllowTransparency", &WebContents::SetAllowTransparency) .SetMethod("isGuest", &WebContents::is_guest) + .SetMethod("openDevTools", &WebContents::OpenDevTools) .Build()); return mate::ObjectTemplateBuilder( diff --git a/atom/browser/api/atom_api_web_contents.h b/atom/browser/api/atom_api_web_contents.h index 679f0c091df5..45fccba6e3e3 100644 --- a/atom/browser/api/atom_api_web_contents.h +++ b/atom/browser/api/atom_api_web_contents.h @@ -11,12 +11,20 @@ #include "content/public/browser/browser_plugin_guest_delegate.h" #include "content/public/browser/web_contents_delegate.h" #include "content/public/browser/web_contents_observer.h" +#include "brightray/browser/default_web_contents_delegate.h" +#include "brightray/browser/inspectable_web_contents_delegate.h" +#include "brightray/browser/inspectable_web_contents_impl.h" #include "native_mate/handle.h" namespace mate { class Dictionary; } +namespace brightray { + class InspectableWebContents; + class InspectableWebContentsImpl; +} + namespace atom { namespace api { @@ -57,6 +65,7 @@ class WebContents : public mate::EventEmitter, void SetUserAgent(const std::string& user_agent); void InsertCSS(const std::string& css); void ExecuteJavaScript(const base::string16& code); + void OpenDevTools(); bool SendIPCMessage(const base::string16& channel, const base::ListValue& args); @@ -83,6 +92,11 @@ class WebContents : public mate::EventEmitter, explicit WebContents(const mate::Dictionary& options); ~WebContents(); + brightray::InspectableWebContentsImpl* inspectable_web_contents() const { + return static_cast( + inspectable_web_contents_.get()); + } + // mate::Wrappable: virtual mate::ObjectTemplateBuilder GetObjectTemplateBuilder( v8::Isolate* isolate) override; @@ -180,6 +194,11 @@ class WebContents : public mate::EventEmitter, // The WebContents that attaches this guest view. content::WebContents* embedder_web_contents_; + // Notice that inspectable_web_contents_ must be placed after dialog_manager_, + // so we can make sure inspectable_web_contents_ is destroyed before + // dialog_manager_, otherwise a crash would happen. + scoped_ptr inspectable_web_contents_; + // The size of the container element. gfx::Size element_size_; diff --git a/atom/renderer/lib/web-view.coffee b/atom/renderer/lib/web-view.coffee index 8061f9b049c2..e198c2b820f7 100644 --- a/atom/renderer/lib/web-view.coffee +++ b/atom/renderer/lib/web-view.coffee @@ -517,7 +517,8 @@ registerWebViewElement = -> "isCrashed" "setUserAgent" "executeJavaScript" - "insertCSS" + "insertCSS", + "openDevTools", "send" ] diff --git a/docs/api/web-view-tag.md b/docs/api/web-view-tag.md index 10bc067df4b4..55c524b0d9e4 100644 --- a/docs/api/web-view-tag.md +++ b/docs/api/web-view-tag.md @@ -169,6 +169,10 @@ Injects CSS into guest page. Evaluate `code` in guest page. +### ``.openDevTools() + +Open a devtools instance for the webview's contents. + ### ``.send(channel[, args...]) * `channel` String