mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-02-02 12:17:15 +01:00
- Add developer tools support (issue #127).
- Send title change notifications generated after page content is done loading. - Restore windows and bring to the front in BrowserWebViewDelegate::show(). git-svn-id: https://chromiumembedded.googlecode.com/svn/trunk@168 5089003a-bbd8-11dd-ad1f-f1f9622dbc98
This commit is contained in:
parent
c9b8e88dd9
commit
ca3a392c33
11
cef.gyp
11
cef.gyp
@ -244,6 +244,10 @@
|
||||
'../third_party/libxslt/libxslt.gyp:libxslt',
|
||||
'../third_party/modp_b64/modp_b64.gyp:modp_b64',
|
||||
'../third_party/WebKit/Source/WebCore/WebCore.gyp/WebCore.gyp:webcore',
|
||||
'../third_party/WebKit/WebKit/chromium/WebKit.gyp:concatenated_devtools_css',
|
||||
'../third_party/WebKit/WebKit/chromium/WebKit.gyp:concatenated_devtools_js',
|
||||
'../third_party/WebKit/WebKit/chromium/WebKit.gyp:devtools_html',
|
||||
'../third_party/WebKit/WebKit/chromium/WebKit.gyp:inspector_resources',
|
||||
'../third_party/WebKit/WebKit/chromium/WebKit.gyp:webkit',
|
||||
'../third_party/zlib/zlib.gyp:zlib',
|
||||
'../ui/ui.gyp:ui_base',
|
||||
@ -333,6 +337,7 @@
|
||||
'../breakpad/breakpad.gyp:breakpad_handler',
|
||||
],
|
||||
'sources': [
|
||||
'$(OutDir)/obj/global_intermediate/webkit/webkit_chromium_resources.rc',
|
||||
'$(OutDir)/obj/global_intermediate/webkit/webkit_resources.rc',
|
||||
'$(OutDir)/obj/global_intermediate/webkit/webkit_strings_en-US.rc',
|
||||
'include/cef_types_win.h',
|
||||
@ -472,6 +477,12 @@
|
||||
'libcef/browser_appcache_system.h',
|
||||
'libcef/browser_database_system.cc',
|
||||
'libcef/browser_database_system.h',
|
||||
'libcef/browser_devtools_agent.cc',
|
||||
'libcef/browser_devtools_agent.h',
|
||||
'libcef/browser_devtools_callargs.cc',
|
||||
'libcef/browser_devtools_callargs.h',
|
||||
'libcef/browser_devtools_client.cc',
|
||||
'libcef/browser_devtools_client.h',
|
||||
'libcef/browser_file_system.cc',
|
||||
'libcef/browser_file_system.h',
|
||||
'libcef/browser_file_writer.cc',
|
||||
|
@ -441,6 +441,15 @@ public:
|
||||
// Change the zoom level to the specified value.
|
||||
/*--cef()--*/
|
||||
virtual void SetZoomLevel(double zoomLevel) =0;
|
||||
|
||||
// Open developer tools in its own window.
|
||||
/*--cef()--*/
|
||||
virtual void ShowDevTools() =0;
|
||||
|
||||
// Explicitly close the developer tools window if one exists for this browser
|
||||
// instance.
|
||||
/*--cef()--*/
|
||||
virtual void CloseDevTools() =0;
|
||||
};
|
||||
|
||||
|
||||
@ -1818,6 +1827,7 @@ public:
|
||||
accelerated_compositing_disabled = r.accelerated_compositing_disabled;
|
||||
accelerated_layers_disabled = r.accelerated_layers_disabled;
|
||||
accelerated_2d_canvas_disabled = r.accelerated_2d_canvas_disabled;
|
||||
developer_tools_disabled = r.developer_tools_disabled;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
@ -263,6 +263,13 @@ typedef struct _cef_browser_t
|
||||
void (CEF_CALLBACK *set_zoom_level)(struct _cef_browser_t* self,
|
||||
double zoomLevel);
|
||||
|
||||
// Open developer tools in its own window.
|
||||
void (CEF_CALLBACK *show_dev_tools)(struct _cef_browser_t* self);
|
||||
|
||||
// Explicitly close the developer tools window if one exists for this browser
|
||||
// instance.
|
||||
void (CEF_CALLBACK *close_dev_tools)(struct _cef_browser_t* self);
|
||||
|
||||
} cef_browser_t;
|
||||
|
||||
|
||||
|
@ -233,6 +233,9 @@ typedef struct _cef_browser_settings_t
|
||||
|
||||
// Set to true (1) to disable accelerated 2d canvas.
|
||||
bool accelerated_2d_canvas_disabled;
|
||||
|
||||
// Set to true (1) to disable developer tools (WebKit inspector).
|
||||
bool developer_tools_disabled;
|
||||
} cef_browser_settings_t;
|
||||
|
||||
// Define handler return value types. Returning RV_HANDLED indicates
|
||||
|
162
libcef/browser_devtools_agent.cc
Normal file
162
libcef/browser_devtools_agent.cc
Normal file
@ -0,0 +1,162 @@
|
||||
// Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#include "browser_devtools_agent.h"
|
||||
|
||||
#include "base/message_loop.h"
|
||||
#include "grit/webkit_chromium_resources.h"
|
||||
#include "third_party/WebKit/WebKit/chromium/public/WebDevToolsAgent.h"
|
||||
#include "third_party/WebKit/WebKit/chromium/public/WebView.h"
|
||||
#include "browser_devtools_callargs.h"
|
||||
#include "browser_devtools_client.h"
|
||||
#include "webkit/glue/webkit_glue.h"
|
||||
|
||||
using WebKit::WebCString;
|
||||
using WebKit::WebDevToolsAgent;
|
||||
using WebKit::WebDevToolsMessageData;
|
||||
using WebKit::WebString;
|
||||
using WebKit::WebView;
|
||||
|
||||
namespace {
|
||||
|
||||
class WebKitClientMessageLoopImpl
|
||||
: public WebKit::WebDevToolsAgentClient::WebKitClientMessageLoop {
|
||||
public:
|
||||
WebKitClientMessageLoopImpl() : message_loop_(MessageLoop::current()) { }
|
||||
virtual ~WebKitClientMessageLoopImpl() {
|
||||
message_loop_ = NULL;
|
||||
}
|
||||
virtual void run() {
|
||||
bool old_state = message_loop_->NestableTasksAllowed();
|
||||
message_loop_->SetNestableTasksAllowed(true);
|
||||
message_loop_->Run();
|
||||
message_loop_->SetNestableTasksAllowed(old_state);
|
||||
}
|
||||
virtual void quitNow() {
|
||||
message_loop_->QuitNow();
|
||||
}
|
||||
private:
|
||||
MessageLoop* message_loop_;
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
// static
|
||||
void BrowserDevToolsAgent::DispatchMessageLoop() {
|
||||
MessageLoop* current = MessageLoop::current();
|
||||
bool old_state = current->NestableTasksAllowed();
|
||||
current->SetNestableTasksAllowed(true);
|
||||
current->RunAllPending();
|
||||
current->SetNestableTasksAllowed(old_state);
|
||||
}
|
||||
|
||||
BrowserDevToolsAgent::BrowserDevToolsAgent()
|
||||
: ALLOW_THIS_IN_INITIALIZER_LIST(call_method_factory_(this)),
|
||||
dev_tools_client_(NULL) {
|
||||
static int dev_tools_agent_counter;
|
||||
routing_id_ = ++dev_tools_agent_counter;
|
||||
if (routing_id_ == 1)
|
||||
WebDevToolsAgent::setMessageLoopDispatchHandler(
|
||||
&BrowserDevToolsAgent::DispatchMessageLoop);
|
||||
}
|
||||
|
||||
BrowserDevToolsAgent::~BrowserDevToolsAgent() {
|
||||
}
|
||||
|
||||
void BrowserDevToolsAgent::SetWebView(WebKit::WebView* web_view) {
|
||||
web_view_ = web_view;
|
||||
}
|
||||
|
||||
void BrowserDevToolsAgent::sendMessageToInspectorFrontend(
|
||||
const WebString& data) {
|
||||
if (dev_tools_client_)
|
||||
dev_tools_client_->AsyncCall(BrowserDevToolsCallArgs(data));
|
||||
}
|
||||
|
||||
void BrowserDevToolsAgent::runtimePropertyChanged(
|
||||
const WebKit::WebString& name,
|
||||
const WebKit::WebString& value) {
|
||||
// TODO: Implement.
|
||||
}
|
||||
|
||||
WebCString BrowserDevToolsAgent::debuggerScriptSource() {
|
||||
base::StringPiece debuggerScriptjs =
|
||||
webkit_glue::GetDataResource(IDR_DEVTOOLS_DEBUGGER_SCRIPT_JS);
|
||||
return WebCString(debuggerScriptjs.data(), debuggerScriptjs.length());
|
||||
}
|
||||
|
||||
WebKit::WebDevToolsAgentClient::WebKitClientMessageLoop*
|
||||
BrowserDevToolsAgent::createClientMessageLoop() {
|
||||
return new WebKitClientMessageLoopImpl();
|
||||
}
|
||||
|
||||
void BrowserDevToolsAgent::AsyncCall(const BrowserDevToolsCallArgs &args) {
|
||||
MessageLoop::current()->PostDelayedTask(
|
||||
FROM_HERE,
|
||||
call_method_factory_.NewRunnableMethod(&BrowserDevToolsAgent::Call,
|
||||
args),
|
||||
0);
|
||||
}
|
||||
|
||||
void BrowserDevToolsAgent::Call(const BrowserDevToolsCallArgs &args) {
|
||||
WebDevToolsAgent* web_agent = GetWebAgent();
|
||||
if (web_agent)
|
||||
web_agent->dispatchOnInspectorBackend(args.data_);
|
||||
if (BrowserDevToolsCallArgs::calls_count() == 1 && dev_tools_client_)
|
||||
dev_tools_client_->all_messages_processed();
|
||||
}
|
||||
|
||||
void BrowserDevToolsAgent::DelayedFrontendLoaded() {
|
||||
WebDevToolsAgent *web_agent = GetWebAgent();
|
||||
if (web_agent)
|
||||
web_agent->frontendLoaded();
|
||||
}
|
||||
|
||||
WebDevToolsAgent* BrowserDevToolsAgent::GetWebAgent() {
|
||||
if (!web_view_)
|
||||
return NULL;
|
||||
return web_view_->devToolsAgent();
|
||||
}
|
||||
|
||||
void BrowserDevToolsAgent::attach(BrowserDevToolsClient* client) {
|
||||
DCHECK(!dev_tools_client_);
|
||||
dev_tools_client_ = client;
|
||||
WebDevToolsAgent *web_agent = GetWebAgent();
|
||||
if (web_agent)
|
||||
web_agent->attach();
|
||||
}
|
||||
|
||||
void BrowserDevToolsAgent::detach() {
|
||||
DCHECK(dev_tools_client_);
|
||||
WebDevToolsAgent* web_agent = GetWebAgent();
|
||||
if (web_agent)
|
||||
web_agent->detach();
|
||||
dev_tools_client_ = NULL;
|
||||
}
|
||||
|
||||
void BrowserDevToolsAgent::frontendLoaded() {
|
||||
MessageLoop::current()->PostDelayedTask(
|
||||
FROM_HERE,
|
||||
call_method_factory_.NewRunnableMethod(
|
||||
&BrowserDevToolsAgent::DelayedFrontendLoaded),
|
||||
0);
|
||||
}
|
||||
|
||||
bool BrowserDevToolsAgent::setTimelineProfilingEnabled(bool enabled) {
|
||||
WebDevToolsAgent* agent = GetWebAgent();
|
||||
if (!agent)
|
||||
return false;
|
||||
agent->setTimelineProfilingEnabled(enabled);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool BrowserDevToolsAgent::evaluateInWebInspector(
|
||||
long call_id,
|
||||
const std::string& script) {
|
||||
WebDevToolsAgent* agent = GetWebAgent();
|
||||
if (!agent)
|
||||
return false;
|
||||
agent->evaluateInWebInspector(call_id, WebString::fromUTF8(script));
|
||||
return true;
|
||||
}
|
68
libcef/browser_devtools_agent.h
Normal file
68
libcef/browser_devtools_agent.h
Normal file
@ -0,0 +1,68 @@
|
||||
// Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef _BROWSER_DEVTOOLS_AGENT_H
|
||||
#define _BROWSER_DEVTOOLS_AGENT_H
|
||||
|
||||
#include "base/task.h"
|
||||
|
||||
#include "third_party/WebKit/WebKit/chromium/public/WebDevToolsAgentClient.h"
|
||||
|
||||
namespace WebKit {
|
||||
|
||||
class WebDevToolsAgent;
|
||||
class WebView;
|
||||
struct WebDevToolsMessageData;
|
||||
|
||||
} // namespace WebKit
|
||||
|
||||
class BrowserDevToolsCallArgs;
|
||||
class BrowserDevToolsClient;
|
||||
|
||||
class BrowserDevToolsAgent : public WebKit::WebDevToolsAgentClient {
|
||||
|
||||
public:
|
||||
BrowserDevToolsAgent();
|
||||
virtual ~BrowserDevToolsAgent();
|
||||
|
||||
void SetWebView(WebKit::WebView* web_view);
|
||||
|
||||
// WebDevToolsAgentClient implementation.
|
||||
virtual void sendMessageToInspectorFrontend(
|
||||
const WebKit::WebString& data);
|
||||
virtual int hostIdentifier() { return routing_id_; }
|
||||
virtual void runtimePropertyChanged(const WebKit::WebString& name,
|
||||
const WebKit::WebString& value);
|
||||
virtual WebKit::WebCString debuggerScriptSource();
|
||||
|
||||
virtual WebKit::WebDevToolsAgentClient::WebKitClientMessageLoop*
|
||||
createClientMessageLoop();
|
||||
|
||||
void AsyncCall(const BrowserDevToolsCallArgs& args);
|
||||
|
||||
void attach(BrowserDevToolsClient* client);
|
||||
void detach();
|
||||
void frontendLoaded();
|
||||
|
||||
bool evaluateInWebInspector(long call_id, const std::string& script);
|
||||
bool setTimelineProfilingEnabled(bool enable);
|
||||
|
||||
BrowserDevToolsClient* client() { return dev_tools_client_; }
|
||||
|
||||
private:
|
||||
void Call(const BrowserDevToolsCallArgs& args);
|
||||
void DelayedFrontendLoaded();
|
||||
static void DispatchMessageLoop();
|
||||
WebKit::WebDevToolsAgent* GetWebAgent();
|
||||
|
||||
ScopedRunnableMethodFactory<BrowserDevToolsAgent> call_method_factory_;
|
||||
BrowserDevToolsClient* dev_tools_client_;
|
||||
int routing_id_;
|
||||
WebKit::WebDevToolsAgent* web_dev_tools_agent_;
|
||||
WebKit::WebView* web_view_;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(BrowserDevToolsAgent);
|
||||
};
|
||||
|
||||
#endif // _BROWSER_DEVTOOLS_AGENT_H
|
27
libcef/browser_devtools_callargs.cc
Normal file
27
libcef/browser_devtools_callargs.cc
Normal file
@ -0,0 +1,27 @@
|
||||
// Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#include "browser_devtools_callargs.h"
|
||||
|
||||
#include "base/logging.h"
|
||||
|
||||
// static
|
||||
int BrowserDevToolsCallArgs::calls_count_ = 0;
|
||||
|
||||
BrowserDevToolsCallArgs::BrowserDevToolsCallArgs(
|
||||
const WebKit::WebString& data)
|
||||
: data_(data) {
|
||||
++calls_count_;
|
||||
}
|
||||
|
||||
BrowserDevToolsCallArgs::BrowserDevToolsCallArgs(
|
||||
const BrowserDevToolsCallArgs& args)
|
||||
: data_(args.data_) {
|
||||
++calls_count_;
|
||||
}
|
||||
|
||||
BrowserDevToolsCallArgs::~BrowserDevToolsCallArgs() {
|
||||
--calls_count_;
|
||||
DCHECK(calls_count_ >= 0);
|
||||
}
|
28
libcef/browser_devtools_callargs.h
Normal file
28
libcef/browser_devtools_callargs.h
Normal file
@ -0,0 +1,28 @@
|
||||
// Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef _BROWSER_DEVTOOLS_CALLARGS_H
|
||||
#define _BROWSER_DEVTOOLS_CALLARGS_H
|
||||
|
||||
#include "base/basictypes.h"
|
||||
|
||||
#include "third_party/WebKit/WebKit/chromium/public/WebString.h"
|
||||
|
||||
class BrowserDevToolsCallArgs {
|
||||
public:
|
||||
explicit BrowserDevToolsCallArgs(const WebKit::WebString& data);
|
||||
|
||||
BrowserDevToolsCallArgs(const BrowserDevToolsCallArgs& args);
|
||||
|
||||
~BrowserDevToolsCallArgs();
|
||||
|
||||
static int calls_count() { return calls_count_; }
|
||||
|
||||
WebKit::WebString data_;
|
||||
|
||||
private:
|
||||
static int calls_count_;
|
||||
};
|
||||
|
||||
#endif // _BROWSER_DEVTOOLS_CALLARGS_H
|
94
libcef/browser_devtools_client.cc
Normal file
94
libcef/browser_devtools_client.cc
Normal file
@ -0,0 +1,94 @@
|
||||
// Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#include "third_party/WebKit/WebKit/chromium/public/WebDevToolsAgent.h"
|
||||
#include "third_party/WebKit/WebKit/chromium/public/WebDevToolsFrontend.h"
|
||||
#include "third_party/WebKit/WebKit/chromium/public/WebFrame.h"
|
||||
#include "third_party/WebKit/WebKit/chromium/public/WebString.h"
|
||||
#include "third_party/WebKit/WebKit/chromium/public/WebScriptSource.h"
|
||||
#include "third_party/WebKit/WebKit/chromium/public/WebView.h"
|
||||
|
||||
#undef LOG
|
||||
#include "browser_devtools_agent.h"
|
||||
#include "browser_devtools_callargs.h"
|
||||
#include "browser_devtools_client.h"
|
||||
#include "browser_impl.h"
|
||||
|
||||
#include "base/command_line.h"
|
||||
#include "base/message_loop.h"
|
||||
|
||||
using WebKit::WebDevToolsAgent;
|
||||
using WebKit::WebDevToolsFrontend;
|
||||
using WebKit::WebDevToolsMessageData;
|
||||
using WebKit::WebString;
|
||||
using WebKit::WebView;
|
||||
|
||||
BrowserDevToolsClient::BrowserDevToolsClient(CefBrowserImpl* browser,
|
||||
BrowserDevToolsAgent *agent)
|
||||
: ALLOW_THIS_IN_INITIALIZER_LIST(call_method_factory_(this)),
|
||||
browser_(browser),
|
||||
dev_tools_agent_(agent),
|
||||
web_view_(browser->GetWebView()) {
|
||||
web_tools_frontend_.reset(WebDevToolsFrontend::create(web_view_, this,
|
||||
WebString::fromUTF8("en-US")));
|
||||
dev_tools_agent_->attach(this);
|
||||
}
|
||||
|
||||
BrowserDevToolsClient::~BrowserDevToolsClient() {
|
||||
// It is a chance that page will be destroyed at detach step of
|
||||
// dev_tools_agent_ and we should clean pending requests a bit earlier.
|
||||
call_method_factory_.RevokeAll();
|
||||
if (dev_tools_agent_)
|
||||
dev_tools_agent_->detach();
|
||||
}
|
||||
|
||||
void BrowserDevToolsClient::sendFrontendLoaded() {
|
||||
if (dev_tools_agent_)
|
||||
dev_tools_agent_->frontendLoaded();
|
||||
}
|
||||
|
||||
void BrowserDevToolsClient::sendMessageToBackend(
|
||||
const WebString& data) {
|
||||
if (dev_tools_agent_)
|
||||
dev_tools_agent_->AsyncCall(BrowserDevToolsCallArgs(data));
|
||||
}
|
||||
|
||||
void BrowserDevToolsClient::sendDebuggerCommandToAgent(
|
||||
const WebString& command) {
|
||||
WebDevToolsAgent::executeDebuggerCommand(command, 1);
|
||||
}
|
||||
|
||||
void BrowserDevToolsClient::activateWindow() {
|
||||
NOTIMPLEMENTED();
|
||||
}
|
||||
|
||||
void BrowserDevToolsClient::closeWindow() {
|
||||
NOTIMPLEMENTED();
|
||||
}
|
||||
|
||||
void BrowserDevToolsClient::dockWindow() {
|
||||
NOTIMPLEMENTED();
|
||||
}
|
||||
|
||||
void BrowserDevToolsClient::undockWindow() {
|
||||
NOTIMPLEMENTED();
|
||||
}
|
||||
|
||||
void BrowserDevToolsClient::AsyncCall(const BrowserDevToolsCallArgs &args) {
|
||||
MessageLoop::current()->PostDelayedTask(FROM_HERE,
|
||||
call_method_factory_.NewRunnableMethod(&BrowserDevToolsClient::Call,
|
||||
args), 0);
|
||||
}
|
||||
|
||||
void BrowserDevToolsClient::Call(const BrowserDevToolsCallArgs &args) {
|
||||
web_tools_frontend_->dispatchOnInspectorFrontend(args.data_);
|
||||
if (BrowserDevToolsCallArgs::calls_count() == 1)
|
||||
all_messages_processed();
|
||||
}
|
||||
|
||||
void BrowserDevToolsClient::all_messages_processed() {
|
||||
web_view_->mainFrame()->executeScript(WebKit::WebScriptSource(
|
||||
WebString::fromUTF8("if (window.WebInspector && "
|
||||
"WebInspector.queuesAreEmpty) WebInspector.queuesAreEmpty();")));
|
||||
}
|
59
libcef/browser_devtools_client.h
Normal file
59
libcef/browser_devtools_client.h
Normal file
@ -0,0 +1,59 @@
|
||||
// Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef _BROWSER_DEVTOOLS_CLIENT_H
|
||||
#define _BROWSER_DEVTOOLS_CLIENT_H
|
||||
|
||||
#include "base/scoped_ptr.h"
|
||||
#include "base/task.h"
|
||||
|
||||
#include "third_party/WebKit/WebKit/chromium/public/WebDevToolsFrontendClient.h"
|
||||
|
||||
namespace WebKit {
|
||||
|
||||
class WebDevToolsFrontend;
|
||||
struct WebDevToolsMessageData;
|
||||
|
||||
} // namespace WebKit
|
||||
|
||||
class BrowserDevToolsCallArgs;
|
||||
class BrowserDevToolsAgent;
|
||||
class CefBrowserImpl;
|
||||
|
||||
class BrowserDevToolsClient: public WebKit::WebDevToolsFrontendClient {
|
||||
|
||||
public:
|
||||
BrowserDevToolsClient(CefBrowserImpl* browser,
|
||||
BrowserDevToolsAgent* agent);
|
||||
virtual ~BrowserDevToolsClient();
|
||||
|
||||
// WebDevToolsFrontendClient implementation
|
||||
virtual void sendFrontendLoaded();
|
||||
virtual void sendMessageToBackend(const WebKit::WebString& data);
|
||||
virtual void sendDebuggerCommandToAgent(const WebKit::WebString& command);
|
||||
|
||||
virtual void activateWindow();
|
||||
virtual void closeWindow();
|
||||
virtual void dockWindow();
|
||||
virtual void undockWindow();
|
||||
|
||||
void AsyncCall(const BrowserDevToolsCallArgs& args);
|
||||
|
||||
void all_messages_processed();
|
||||
|
||||
CefBrowserImpl* browser() { return browser_; }
|
||||
|
||||
private:
|
||||
void Call(const BrowserDevToolsCallArgs& args);
|
||||
|
||||
ScopedRunnableMethodFactory<BrowserDevToolsClient> call_method_factory_;
|
||||
CefBrowserImpl* browser_;
|
||||
BrowserDevToolsAgent* dev_tools_agent_;
|
||||
WebKit::WebView* web_view_;
|
||||
scoped_ptr<WebKit::WebDevToolsFrontend> web_tools_frontend_;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(BrowserDevToolsClient);
|
||||
};
|
||||
|
||||
#endif // _BROWSER_DEVTOOLS_CLIENT_H
|
@ -10,6 +10,8 @@
|
||||
#include "request_impl.h"
|
||||
#include "stream_impl.h"
|
||||
|
||||
#include "base/file_path.h"
|
||||
#include "base/path_service.h"
|
||||
#include "base/synchronization/waitable_event.h"
|
||||
#include "base/utf_string_conversions.h"
|
||||
#include "third_party/WebKit/WebKit/chromium/public/WebDocument.h"
|
||||
@ -232,6 +234,18 @@ void CefBrowserImpl::StopFinding(bool clearSelection)
|
||||
&CefBrowserImpl::UIT_StopFinding, clearSelection));
|
||||
}
|
||||
|
||||
void CefBrowserImpl::ShowDevTools()
|
||||
{
|
||||
CefThread::PostTask(CefThread::UI, FROM_HERE, NewRunnableMethod(this,
|
||||
&CefBrowserImpl::UIT_ShowDevTools));
|
||||
}
|
||||
|
||||
void CefBrowserImpl::CloseDevTools()
|
||||
{
|
||||
CefThread::PostTask(CefThread::UI, FROM_HERE, NewRunnableMethod(this,
|
||||
&CefBrowserImpl::UIT_CloseDevTools));
|
||||
}
|
||||
|
||||
CefRefPtr<CefFrame> CefBrowserImpl::GetCefFrame(WebFrame* frame)
|
||||
{
|
||||
CefRefPtr<CefFrame> cef_frame;
|
||||
@ -573,6 +587,12 @@ void CefBrowserImpl::UIT_DestroyBrowser()
|
||||
}
|
||||
GetWebViewDelegate()->RevokeDragDrop();
|
||||
|
||||
if (dev_tools_agent_.get()) {
|
||||
BrowserDevToolsClient* client = dev_tools_agent_->client();
|
||||
if (client)
|
||||
client->browser()->UIT_DestroyBrowser();
|
||||
}
|
||||
|
||||
// Clean up anything associated with the WebViewHost widget.
|
||||
GetWebViewHost()->webwidget()->close();
|
||||
webviewhost_.reset();
|
||||
@ -1171,6 +1191,38 @@ void CefBrowserImpl::UIT_SetZoomLevel(CefFrame* frame, double zoomLevel)
|
||||
frame->Release();
|
||||
}
|
||||
|
||||
void CefBrowserImpl::UIT_ShowDevTools()
|
||||
{
|
||||
REQUIRE_UIT();
|
||||
|
||||
if(!dev_tools_agent_.get())
|
||||
return;
|
||||
|
||||
BrowserDevToolsClient* client = dev_tools_agent_->client();
|
||||
if (!client) {
|
||||
// Create the inspector window.
|
||||
FilePath dir_exe;
|
||||
PathService::Get(base::DIR_EXE, &dir_exe);
|
||||
FilePath devtools_path =
|
||||
dir_exe.AppendASCII("resources/inspector/devtools.html");
|
||||
|
||||
CefPopupFeatures features;
|
||||
CefRefPtr<CefBrowserImpl> browser =
|
||||
UIT_CreatePopupWindow(devtools_path.value(), features);
|
||||
browser->CreateDevToolsClient(dev_tools_agent_.get());
|
||||
browser->UIT_Show(WebKit::WebNavigationPolicyNewWindow);
|
||||
} else {
|
||||
// Give focus to the existing inspector window.
|
||||
client->browser()->UIT_Show(WebKit::WebNavigationPolicyNewWindow);
|
||||
}
|
||||
}
|
||||
|
||||
void CefBrowserImpl::CreateDevToolsClient(BrowserDevToolsAgent *agent)
|
||||
{
|
||||
dev_tools_client_.reset(new BrowserDevToolsClient(this, agent));
|
||||
}
|
||||
|
||||
|
||||
// CefFrameImpl
|
||||
|
||||
bool CefFrameImpl::IsFocused()
|
||||
|
@ -9,6 +9,8 @@
|
||||
#include "include/cef.h"
|
||||
|
||||
#include "webview_host.h"
|
||||
#include "browser_devtools_agent.h"
|
||||
#include "browser_devtools_client.h"
|
||||
#include "browser_webview_delegate.h"
|
||||
#include "browser_navigation_controller.h"
|
||||
#include "cef_thread.h"
|
||||
@ -65,6 +67,8 @@ public:
|
||||
virtual void StopFinding(bool clearSelection);
|
||||
virtual double GetZoomLevel();
|
||||
virtual void SetZoomLevel(double zoomLevel);
|
||||
virtual void ShowDevTools();
|
||||
virtual void CloseDevTools();
|
||||
|
||||
// CefFrames are light-weight objects managed by the browser and loosely
|
||||
// coupled to a WebFrame object by name. If a CefFrame object does not
|
||||
@ -232,12 +236,17 @@ public:
|
||||
const WebKit::WebRect& selection_rect,
|
||||
int active_match_ordinal, bool final_update);
|
||||
void UIT_SetZoomLevel(CefFrame* frame, double zoomLevel);
|
||||
void UIT_ShowDevTools();
|
||||
void UIT_CloseDevTools();
|
||||
|
||||
static bool ImplementsThreadSafeReferenceCounting() { return true; }
|
||||
|
||||
const CefBrowserSettings& settings() const { return settings_; }
|
||||
const FilePath& file_system_root() const { return file_system_root_.path(); }
|
||||
|
||||
protected:
|
||||
void CreateDevToolsClient(BrowserDevToolsAgent* agent);
|
||||
|
||||
protected:
|
||||
CefWindowInfo window_info_;
|
||||
CefBrowserSettings settings_;
|
||||
@ -250,6 +259,9 @@ protected:
|
||||
scoped_ptr<BrowserWebViewDelegate> popup_delegate_;
|
||||
scoped_ptr<BrowserNavigationController> nav_controller_;
|
||||
|
||||
scoped_ptr<BrowserDevToolsAgent> dev_tools_agent_;
|
||||
scoped_ptr<BrowserDevToolsClient> dev_tools_client_;
|
||||
|
||||
CefString title_;
|
||||
|
||||
#if defined(OS_WIN)
|
||||
|
@ -41,16 +41,22 @@ void CefBrowserImpl::UIT_CreateBrowser(const CefString& url)
|
||||
|
||||
// Add the new browser to the list maintained by the context
|
||||
_Context->AddBrowser(this);
|
||||
|
||||
|
||||
if (!settings_.developer_tools_disabled)
|
||||
dev_tools_agent_.reset(new BrowserDevToolsAgent());
|
||||
|
||||
WebPreferences prefs;
|
||||
BrowserToWebSettings(settings_, prefs);
|
||||
|
||||
// Create the webview host object
|
||||
webviewhost_.reset(
|
||||
WebViewHost::Create(window_info_.m_ParentWidget, gfx::Rect(),
|
||||
delegate_.get(), NULL, prefs));
|
||||
delegate_.get(), dev_tools_agent_.get(), prefs));
|
||||
delegate_->RegisterDragDrop();
|
||||
|
||||
|
||||
if (!settings_.developer_tools_disabled)
|
||||
dev_tools_agent_->SetWebView(webviewhost_->webview());
|
||||
|
||||
window_info_.m_Widget = webviewhost_->view_handle();
|
||||
|
||||
if(handler_.get()) {
|
||||
@ -128,3 +134,14 @@ int CefBrowserImpl::UIT_GetPagesCount(WebKit::WebFrame* frame)
|
||||
NOTIMPLEMENTED();
|
||||
return 0;
|
||||
}
|
||||
|
||||
void CefBrowserImpl::UIT_CloseDevTools()
|
||||
{
|
||||
REQUIRE_UIT();
|
||||
|
||||
if(!dev_tools_agent_.get())
|
||||
return;
|
||||
|
||||
// TODO(port): Add implementation.
|
||||
NOTIMPLEMENTED();
|
||||
}
|
||||
|
@ -40,7 +40,10 @@ void CefBrowserImpl::UIT_CreateBrowser(const CefString& url)
|
||||
|
||||
// Add the new browser to the list maintained by the context
|
||||
_Context->AddBrowser(this);
|
||||
|
||||
|
||||
if (!settings_.developer_tools_disabled)
|
||||
dev_tools_agent_.reset(new BrowserDevToolsAgent());
|
||||
|
||||
NSView* parentView = (NSView*)window_info_.m_ParentView;
|
||||
gfx::Rect contentRect(window_info_.m_x, window_info_.m_y,
|
||||
window_info_.m_nWidth, window_info_.m_nHeight);
|
||||
@ -51,9 +54,12 @@ void CefBrowserImpl::UIT_CreateBrowser(const CefString& url)
|
||||
// Create the webview host object
|
||||
webviewhost_.reset(
|
||||
WebViewHost::Create(parentView, contentRect, delegate_.get(),
|
||||
NULL, prefs));
|
||||
dev_tools_agent_.get(), prefs));
|
||||
delegate_->RegisterDragDrop();
|
||||
|
||||
|
||||
if (!settings_.developer_tools_disabled)
|
||||
dev_tools_agent_->SetWebView(webviewhost_->webview());
|
||||
|
||||
BrowserWebView* browserView = (BrowserWebView*)webviewhost_->view_handle();
|
||||
browserView.browser = this;
|
||||
window_info_.m_View = (void*)browserView;
|
||||
@ -137,3 +143,14 @@ int CefBrowserImpl::UIT_GetPagesCount(WebKit::WebFrame* frame)
|
||||
NOTIMPLEMENTED();
|
||||
return 0;
|
||||
}
|
||||
|
||||
void CefBrowserImpl::UIT_CloseDevTools()
|
||||
{
|
||||
REQUIRE_UIT();
|
||||
|
||||
if(!dev_tools_agent_.get())
|
||||
return;
|
||||
|
||||
// TODO(port): Add implementation.
|
||||
NOTIMPLEMENTED();
|
||||
}
|
||||
|
@ -112,7 +112,10 @@ void CefBrowserImpl::UIT_CreateBrowser(const CefString& url)
|
||||
// Set window user data to this object for future reference from the window
|
||||
// procedure
|
||||
app::win::SetWindowUserData(window_info_.m_hWnd, this);
|
||||
|
||||
|
||||
if (!settings_.developer_tools_disabled)
|
||||
dev_tools_agent_.reset(new BrowserDevToolsAgent());
|
||||
|
||||
// Add a reference that will be released in UIT_DestroyBrowser().
|
||||
AddRef();
|
||||
|
||||
@ -125,7 +128,10 @@ void CefBrowserImpl::UIT_CreateBrowser(const CefString& url)
|
||||
// Create the webview host object
|
||||
webviewhost_.reset(
|
||||
WebViewHost::Create(window_info_.m_hWnd, gfx::Rect(), delegate_.get(),
|
||||
NULL, prefs));
|
||||
dev_tools_agent_.get(), prefs));
|
||||
|
||||
if (!settings_.developer_tools_disabled)
|
||||
dev_tools_agent_->SetWebView(webviewhost_->webview());
|
||||
|
||||
if (!settings_.drag_drop_disabled)
|
||||
delegate_->RegisterDragDrop();
|
||||
@ -481,3 +487,15 @@ int CefBrowserImpl::UIT_GetPagesCount(WebKit::WebFrame* frame)
|
||||
|
||||
return page_count;
|
||||
}
|
||||
|
||||
void CefBrowserImpl::UIT_CloseDevTools()
|
||||
{
|
||||
REQUIRE_UIT();
|
||||
|
||||
if(!dev_tools_agent_.get())
|
||||
return;
|
||||
|
||||
BrowserDevToolsClient* client = dev_tools_agent_->client();
|
||||
if (client)
|
||||
PostMessage(client->browser()->GetMainWndHandle(), WM_CLOSE, 0, 0);
|
||||
}
|
||||
|
@ -91,7 +91,7 @@ void BrowserToWebSettings(const CefBrowserSettings& cef, WebPreferences& web)
|
||||
web.loads_images_automatically = !cef.image_load_disabled;
|
||||
web.plugins_enabled = !cef.plugins_disabled;
|
||||
web.dom_paste_enabled = !cef.dom_paste_disabled;
|
||||
web.developer_extras_enabled = false;
|
||||
web.developer_extras_enabled = !cef.developer_tools_disabled;
|
||||
web.inspector_settings.clear();
|
||||
web.site_specific_quirks_enabled = !cef.site_specific_quirks_disabled;
|
||||
web.shrinks_standalone_images_to_fit = cef.shrink_standalone_images_to_fit;
|
||||
|
@ -754,7 +754,8 @@ void BrowserWebViewDelegate::didClearWindowObject(WebFrame* frame) {
|
||||
|
||||
void BrowserWebViewDelegate::didReceiveTitle(
|
||||
WebFrame* frame, const WebString& title) {
|
||||
if (frame == top_loading_frame_ && is_main_content_) {
|
||||
if (top_loading_frame_ == NULL ||
|
||||
(frame == top_loading_frame_ && is_main_content_)) {
|
||||
CefString titleStr = string16(title);
|
||||
browser_->UIT_SetTitle(titleStr);
|
||||
CefRefPtr<CefHandler> handler = browser_->GetHandler();
|
||||
|
@ -58,8 +58,8 @@ WebWidget* BrowserWebViewDelegate::createPopupMenu(
|
||||
void BrowserWebViewDelegate::show(WebNavigationPolicy) {
|
||||
if (WebWidgetHost* host = GetWidgetHost()) {
|
||||
HWND root = GetAncestor(host->view_handle(), GA_ROOT);
|
||||
ShowWindow(root, SW_SHOW);
|
||||
UpdateWindow(root);
|
||||
ShowWindow(root, SW_SHOWNORMAL);
|
||||
SetWindowPos(root, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -257,6 +257,25 @@ void CEF_CALLBACK browser_set_zoom_level(struct _cef_browser_t* self,
|
||||
return CefBrowserCppToC::Get(self)->SetZoomLevel(zoomLevel);
|
||||
}
|
||||
|
||||
void CEF_CALLBACK browser_show_dev_tools(struct _cef_browser_t* self)
|
||||
{
|
||||
DCHECK(self);
|
||||
if(!self)
|
||||
return;
|
||||
|
||||
|
||||
CefBrowserCppToC::Get(self)->ShowDevTools();
|
||||
}
|
||||
|
||||
void CEF_CALLBACK browser_close_dev_tools(struct _cef_browser_t* self)
|
||||
{
|
||||
DCHECK(self);
|
||||
if(!self)
|
||||
return;
|
||||
|
||||
CefBrowserCppToC::Get(self)->CloseDevTools();
|
||||
}
|
||||
|
||||
|
||||
// CONSTRUCTOR - Do not edit by hand.
|
||||
|
||||
@ -282,6 +301,8 @@ CefBrowserCppToC::CefBrowserCppToC(CefBrowser* cls)
|
||||
struct_.struct_.stop_finding = browser_stop_finding;
|
||||
struct_.struct_.get_zoom_level = browser_get_zoom_level;
|
||||
struct_.struct_.set_zoom_level = browser_set_zoom_level;
|
||||
struct_.struct_.show_dev_tools = browser_show_dev_tools;
|
||||
struct_.struct_.close_dev_tools = browser_close_dev_tools;
|
||||
}
|
||||
|
||||
#ifdef _DEBUG
|
||||
|
@ -212,6 +212,22 @@ void CefBrowserCToCpp::SetZoomLevel(double zoomLevel)
|
||||
return struct_->set_zoom_level(struct_, zoomLevel);
|
||||
}
|
||||
|
||||
void CefBrowserCToCpp::ShowDevTools()
|
||||
{
|
||||
if (CEF_MEMBER_MISSING(struct_, show_dev_tools))
|
||||
return;
|
||||
|
||||
struct_->show_dev_tools(struct_);
|
||||
}
|
||||
|
||||
void CefBrowserCToCpp::CloseDevTools()
|
||||
{
|
||||
if (CEF_MEMBER_MISSING(struct_, close_dev_tools))
|
||||
return;
|
||||
|
||||
struct_->close_dev_tools(struct_);
|
||||
}
|
||||
|
||||
|
||||
#ifdef _DEBUG
|
||||
template<> long CefCToCpp<CefBrowserCToCpp, CefBrowser,
|
||||
|
@ -51,6 +51,8 @@ public:
|
||||
virtual void StopFinding(bool clearSelection);
|
||||
virtual double GetZoomLevel();
|
||||
virtual void SetZoomLevel(double zoomLevel);
|
||||
virtual void ShowDevTools();
|
||||
virtual void CloseDevTools();
|
||||
};
|
||||
|
||||
#endif // USING_CEF_SHARED
|
||||
|
@ -84,6 +84,8 @@ BEGIN
|
||||
MENUITEM "Zoom In", ID_TESTS_ZOOM_IN
|
||||
MENUITEM "Zoom Out", ID_TESTS_ZOOM_OUT
|
||||
MENUITEM "Reset Zoom", ID_TESTS_ZOOM_RESET
|
||||
MENUITEM "Show Developer Tools", ID_TESTS_DEVTOOLS_SHOW
|
||||
MENUITEM "Close Developer Tools", ID_TESTS_DEVTOOLS_CLOSE
|
||||
END
|
||||
END
|
||||
|
||||
|
@ -389,23 +389,23 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
}
|
||||
return 0;
|
||||
|
||||
case WM_COMMAND:
|
||||
case WM_COMMAND:
|
||||
{
|
||||
CefRefPtr<CefBrowser> browser;
|
||||
if(g_handler.get())
|
||||
browser = g_handler->GetBrowser();
|
||||
|
||||
wmId = LOWORD(wParam);
|
||||
wmEvent = HIWORD(wParam);
|
||||
// Parse the menu selections:
|
||||
switch (wmId)
|
||||
{
|
||||
case IDM_ABOUT:
|
||||
wmId = LOWORD(wParam);
|
||||
wmEvent = HIWORD(wParam);
|
||||
// Parse the menu selections:
|
||||
switch (wmId)
|
||||
{
|
||||
case IDM_ABOUT:
|
||||
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
|
||||
return 0;
|
||||
case IDM_EXIT:
|
||||
DestroyWindow(hWnd);
|
||||
return 0;
|
||||
return 0;
|
||||
case IDM_EXIT:
|
||||
DestroyWindow(hWnd);
|
||||
return 0;
|
||||
case ID_WARN_CONSOLEMESSAGE:
|
||||
if(g_handler.get()) {
|
||||
std::wstringstream ss;
|
||||
@ -468,7 +468,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
browser->Reload();
|
||||
return 0;
|
||||
case IDC_NAV_STOP: // Stop button
|
||||
if(browser.get())
|
||||
if(browser.get())
|
||||
browser->StopLoad();
|
||||
return 0;
|
||||
case ID_TESTS_GETSOURCE: // Test the GetSource function
|
||||
@ -585,14 +585,22 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
if(browser.get())
|
||||
browser->SetZoomLevel(0.0);
|
||||
return 0;
|
||||
case ID_TESTS_DEVTOOLS_SHOW:
|
||||
if (browser.get())
|
||||
browser->ShowDevTools();
|
||||
return 0;
|
||||
case ID_TESTS_DEVTOOLS_CLOSE:
|
||||
if (browser.get())
|
||||
browser->CloseDevTools();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
break;
|
||||
|
||||
case WM_PAINT:
|
||||
hdc = BeginPaint(hWnd, &ps);
|
||||
EndPaint(hWnd, &ps);
|
||||
return 0;
|
||||
case WM_PAINT:
|
||||
hdc = BeginPaint(hWnd, &ps);
|
||||
EndPaint(hWnd, &ps);
|
||||
return 0;
|
||||
|
||||
case WM_SETFOCUS:
|
||||
if(g_handler.get() && g_handler->GetBrowserHwnd())
|
||||
|
@ -45,6 +45,8 @@
|
||||
#define ID_TESTS_ZOOM_IN 32785
|
||||
#define ID_TESTS_ZOOM_OUT 32786
|
||||
#define ID_TESTS_ZOOM_RESET 32787
|
||||
#define ID_TESTS_DEVTOOLS_SHOW 32788
|
||||
#define ID_TESTS_DEVTOOLS_CLOSE 32789
|
||||
#define IDC_STATIC -1
|
||||
#define IDS_LOGO 1000
|
||||
#define IDS_UIPLUGIN 1001
|
||||
@ -61,7 +63,7 @@
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NO_MFC 1
|
||||
#define _APS_NEXT_RESOURCE_VALUE 130
|
||||
#define _APS_NEXT_COMMAND_VALUE 32788
|
||||
#define _APS_NEXT_COMMAND_VALUE 32790
|
||||
#define _APS_NEXT_CONTROL_VALUE 1000
|
||||
#define _APS_NEXT_SYMED_VALUE 110
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user