- 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

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