- 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:
Marshall Greenblatt 2011-01-25 18:37:27 +00:00
parent c9b8e88dd9
commit ca3a392c33
24 changed files with 667 additions and 30 deletions

11
cef.gyp
View File

@ -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',

View File

@ -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;
}

View File

@ -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;

View File

@ -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

View 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;
}

View 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

View 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);
}

View 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

View 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();")));
}

View 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

View File

@ -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()

View File

@ -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)

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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);
}

View File

@ -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;

View File

@ -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();

View File

@ -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);
}
}

View File

@ -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

View File

@ -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,

View File

@ -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

View File

@ -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

View File

@ -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())

View File

@ -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