diff --git a/CHROMIUM_BUILD_COMPATIBILITY.txt b/CHROMIUM_BUILD_COMPATIBILITY.txt index a4968e59a..064abe146 100644 --- a/CHROMIUM_BUILD_COMPATIBILITY.txt +++ b/CHROMIUM_BUILD_COMPATIBILITY.txt @@ -17,5 +17,5 @@ { 'chromium_url': 'http://src.chromium.org/svn/trunk/src', - 'chromium_revision': '224845', + 'chromium_revision': '228917', } diff --git a/cef.gyp b/cef.gyp index 1243a208a..26b5d7df2 100644 --- a/cef.gyp +++ b/cef.gyp @@ -800,9 +800,9 @@ '<(DEPTH)/ui/gl/gl.gyp:gl', '<(DEPTH)/ui/ui.gyp:ui', '<(DEPTH)/v8/tools/gyp/v8.gyp:v8', + '<(DEPTH)/webkit/glue/webkit_glue.gyp:glue', '<(DEPTH)/webkit/storage_browser.gyp:webkit_storage_browser', '<(DEPTH)/webkit/storage_common.gyp:webkit_storage_common', - '<(DEPTH)/webkit/support/webkit_support.gyp:glue', # Necessary to generate the grit include files. 'cef_pak', ], diff --git a/libcef/browser/devtools_delegate.cc b/libcef/browser/devtools_delegate.cc index 7e4cabe75..852765279 100644 --- a/libcef/browser/devtools_delegate.cc +++ b/libcef/browser/devtools_delegate.cc @@ -14,105 +14,96 @@ #include "base/rand_util.h" #include "base/strings/stringprintf.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/utf_string_conversions.h" +#include "content/public/browser/devtools_agent_host.h" #include "base/time/time.h" #include "content/public/browser/devtools_http_handler.h" -#include "content/public/browser/render_process_host.h" +#include "content/public/browser/devtools_target.h" +#include "content/public/browser/favicon_status.h" +#include "content/public/browser/navigation_entry.h" #include "content/public/browser/render_view_host.h" #include "content/public/browser/render_widget_host_iterator.h" +#include "content/public/browser/web_contents.h" +#include "content/public/browser/web_contents_delegate.h" #include "content/public/common/content_switches.h" #include "content/public/common/url_constants.h" #include "grit/cef_resources.h" +#include "net/base/escape.h" #include "net/socket/tcp_listen_socket.h" #include "ui/base/layout.h" #include "ui/base/resource/resource_bundle.h" -// CefDevToolsBindingHandler +namespace { -CefDevToolsBindingHandler::CefDevToolsBindingHandler() { -} +const char kTargetTypePage[] = "page"; -std::string CefDevToolsBindingHandler::GetIdentifier( - content::DevToolsAgentHost* agent_host) { - GarbageCollect(); +class Target : public content::DevToolsTarget { + public: + explicit Target(content::WebContents* web_contents); - const std::string& identifier = - GetIdentifier(agent_host->GetRenderViewHost()); - agents_map_[identifier] = agent_host; - return identifier; -} - -content::DevToolsAgentHost* CefDevToolsBindingHandler::ForIdentifier( - const std::string& identifier) { - GarbageCollect(); - - // Return the existing agent host, if any. - AgentsMap::const_iterator it = agents_map_.find(identifier); - if (it != agents_map_.end()) - return it->second; - - // Iterate through the existing RVH instances to find a match. - for (content::RenderProcessHost::iterator it( - content::RenderProcessHost::AllHostsIterator()); - !it.IsAtEnd(); it.Advance()) { - content::RenderProcessHost* render_process_host = it.GetCurrentValue(); - DCHECK(render_process_host); - - // Ignore processes that don't have a connection, such as crashed contents. - if (!render_process_host->HasConnection()) - continue; - - scoped_ptr widgets( - content::RenderWidgetHost::GetRenderWidgetHosts()); - while (content::RenderWidgetHost* widget = widgets->GetNextHost()) { - if (!widget->IsRenderView()) - continue; - - content::RenderViewHost* host = content::RenderViewHost::From(widget); - if (GetIdentifier(host) == identifier) { - // May create a new agent host. - scoped_refptr agent_host( - content::DevToolsAgentHost::GetOrCreateFor(host)); - agents_map_[identifier] = agent_host; - return agent_host; - } - } + virtual std::string GetId() const OVERRIDE { return id_; } + virtual std::string GetType() const OVERRIDE { return kTargetTypePage; } + virtual std::string GetTitle() const OVERRIDE { return title_; } + virtual std::string GetDescription() const OVERRIDE { return std::string(); } + virtual GURL GetUrl() const OVERRIDE { return url_; } + virtual GURL GetFaviconUrl() const OVERRIDE { return favicon_url_; } + virtual base::TimeTicks GetLastActivityTime() const OVERRIDE { + return last_activity_time_; } - - return NULL; -} - -std::string CefDevToolsBindingHandler::GetIdentifier( - content::RenderViewHost* rvh) { - int process_id = rvh->GetProcess()->GetID(); - int routing_id = rvh->GetRoutingID(); - - if (random_seed_.empty()) { - // Generate a random seed that is used to make identifier guessing more - // difficult. - random_seed_ = base::StringPrintf("%lf|%u", - base::Time::Now().ToDoubleT(), base::RandInt(0, INT_MAX)); + virtual bool IsAttached() const OVERRIDE { + return agent_host_->IsAttached(); } - - // Create a key that combines RVH IDs and the random seed. - std::string key = base::StringPrintf("%d|%d|%s", - process_id, - routing_id, - random_seed_.c_str()); - - // Return an MD5 hash of the key. - return base::MD5String(key); -} - -void CefDevToolsBindingHandler::GarbageCollect() { - AgentsMap::iterator it = agents_map_.begin(); - while (it != agents_map_.end()) { - if (!it->second->GetRenderViewHost()) - agents_map_.erase(it++); - else - ++it; + virtual scoped_refptr GetAgentHost() const + OVERRIDE { + return agent_host_; } + virtual bool Activate() const OVERRIDE; + virtual bool Close() const OVERRIDE; + + private: + scoped_refptr agent_host_; + std::string id_; + std::string title_; + GURL url_; + GURL favicon_url_; + base::TimeTicks last_activity_time_; +}; + +Target::Target(content::WebContents* web_contents) { + agent_host_ = + content::DevToolsAgentHost::GetOrCreateFor( + web_contents->GetRenderViewHost()); + id_ = agent_host_->GetId(); + title_ = UTF16ToUTF8(net::EscapeForHTML(web_contents->GetTitle())); + url_ = web_contents->GetURL(); + content::NavigationController& controller = web_contents->GetController(); + content::NavigationEntry* entry = controller.GetActiveEntry(); + if (entry != NULL && entry->GetURL().is_valid()) + favicon_url_ = entry->GetFavicon().url; + last_activity_time_ = web_contents->GetLastSelectedTime(); } +bool Target::Activate() const { + content::RenderViewHost* rvh = agent_host_->GetRenderViewHost(); + if (!rvh) + return false; + content::WebContents* web_contents = + content::WebContents::FromRenderViewHost(rvh); + if (!web_contents) + return false; + web_contents->GetDelegate()->ActivateContents(web_contents); + return true; +} + +bool Target::Close() const { + content::RenderViewHost* rvh = agent_host_->GetRenderViewHost(); + if (!rvh) + return false; + rvh->ClosePage(); + return true; +} + +} // namespace // CefDevToolsDelegate @@ -121,9 +112,6 @@ CefDevToolsDelegate::CefDevToolsDelegate(int port) { new net::TCPListenSocketFactory("127.0.0.1", port), "", this); - - binding_.reset(new CefDevToolsBindingHandler()); - devtools_http_handler_->SetDevToolsAgentHostBinding(binding_.get()); } CefDevToolsDelegate::~CefDevToolsDelegate() { @@ -151,17 +139,43 @@ std::string CefDevToolsDelegate::GetPageThumbnailData(const GURL& url) { return std::string(); } -content::RenderViewHost* CefDevToolsDelegate::CreateNewTarget() { - return NULL; +scoped_ptr CefDevToolsDelegate::CreateNewTarget() { + return scoped_ptr(); } -content::DevToolsHttpHandlerDelegate::TargetType - CefDevToolsDelegate::GetTargetType(content::RenderViewHost*) { - return kTargetTypeTab; +scoped_ptr CefDevToolsDelegate::CreateTargetForId( + const std::string& id) { + scoped_ptr target; + + std::vector rvh_list = + content::DevToolsAgentHost::GetValidRenderViewHosts(); + for (std::vector::iterator it = rvh_list.begin(); + it != rvh_list.end(); ++it) { + scoped_refptr agent_host( + content::DevToolsAgentHost::GetOrCreateFor(*it)); + if (agent_host->GetId() == id) { + content::WebContents* web_contents = + content::WebContents::FromRenderViewHost(*it); + target.reset(new Target(web_contents)); + break; + } + } + + return target.Pass(); } -std::string CefDevToolsDelegate::GetViewDescription(content::RenderViewHost*) { - return std::string(); +void CefDevToolsDelegate::EnumerateTargets(TargetCallback callback) { + TargetList targets; + std::vector rvh_list = + content::DevToolsAgentHost::GetValidRenderViewHosts(); + for (std::vector::iterator it = rvh_list.begin(); + it != rvh_list.end(); ++it) { + content::WebContents* web_contents = + content::WebContents::FromRenderViewHost(*it); + if (web_contents) + targets.push_back(new Target(web_contents)); + } + callback.Run(targets); } scoped_ptr @@ -181,8 +195,11 @@ std::string CefDevToolsDelegate::GetDevToolsURL(content::RenderViewHost* rvh, if (!base::StringToInt(port_str, &port)) return std::string(); - std::string page_id = binding_->GetIdentifier(rvh); - std::string host = http_scheme ? + scoped_refptr agent_host( + content::DevToolsAgentHost::GetOrCreateFor(rvh)); + + const std::string& page_id = agent_host->GetId(); + const std::string& host = http_scheme ? base::StringPrintf("http://localhost:%d/devtools/", port) : base::StringPrintf("%s://%s/devtools/", chrome::kChromeDevToolsScheme, scheme::kChromeDevToolsHost); diff --git a/libcef/browser/devtools_delegate.h b/libcef/browser/devtools_delegate.h index 383fedb1c..cd6d4192c 100644 --- a/libcef/browser/devtools_delegate.h +++ b/libcef/browser/devtools_delegate.h @@ -20,33 +20,6 @@ namespace content { class RenderViewHost; } -class CefDevToolsBindingHandler - : public content::DevToolsHttpHandler::DevToolsAgentHostBinding { - public: - CefDevToolsBindingHandler(); - - // DevToolsAgentHostBinding overrides. - virtual std::string GetIdentifier( - content::DevToolsAgentHost* agent_host) OVERRIDE; - virtual content::DevToolsAgentHost* ForIdentifier( - const std::string& identifier) OVERRIDE; - - std::string GetIdentifier(content::RenderViewHost* rvh); - - private: - void GarbageCollect(); - - std::string random_seed_; - - // Map of identifier to DevToolsAgentHost. Keeps the DevToolsAgentHost objects - // alive until the associated RVH is disconnected. - typedef std::map > - AgentsMap; - AgentsMap agents_map_; - - DISALLOW_COPY_AND_ASSIGN(CefDevToolsBindingHandler); -}; - class CefDevToolsDelegate : public content::DevToolsHttpHandlerDelegate { public: explicit CefDevToolsDelegate(int port); @@ -60,9 +33,10 @@ class CefDevToolsDelegate : public content::DevToolsHttpHandlerDelegate { virtual bool BundlesFrontendResources() OVERRIDE; virtual base::FilePath GetDebugFrontendDir() OVERRIDE; virtual std::string GetPageThumbnailData(const GURL& url) OVERRIDE; - virtual content::RenderViewHost* CreateNewTarget() OVERRIDE; - virtual TargetType GetTargetType(content::RenderViewHost*) OVERRIDE; - virtual std::string GetViewDescription(content::RenderViewHost*) OVERRIDE; + virtual scoped_ptr CreateNewTarget() OVERRIDE; + virtual scoped_ptr CreateTargetForId( + const std::string& id) OVERRIDE; + virtual void EnumerateTargets(TargetCallback callback) OVERRIDE; virtual scoped_ptr CreateSocketForTethering( net::StreamListenSocket::Delegate* delegate, std::string* name) OVERRIDE; @@ -72,7 +46,6 @@ class CefDevToolsDelegate : public content::DevToolsHttpHandlerDelegate { private: content::DevToolsHttpHandler* devtools_http_handler_; - scoped_ptr binding_; DISALLOW_COPY_AND_ASSIGN(CefDevToolsDelegate); }; diff --git a/libcef/browser/resource_dispatcher_host_delegate.cc b/libcef/browser/resource_dispatcher_host_delegate.cc index c4933378b..df7066b27 100644 --- a/libcef/browser/resource_dispatcher_host_delegate.cc +++ b/libcef/browser/resource_dispatcher_host_delegate.cc @@ -65,7 +65,6 @@ void CefResourceDispatcherHostDelegate::RequestBeginning( ResourceType::Type resource_type, int child_id, int route_id, - bool is_continuation_of_transferred_request, ScopedVector* throttles) { if (resource_type == ResourceType::MAIN_FRAME || resource_type == ResourceType::SUB_FRAME) { diff --git a/libcef/browser/resource_dispatcher_host_delegate.h b/libcef/browser/resource_dispatcher_host_delegate.h index b54d66a20..b6ccc86ab 100644 --- a/libcef/browser/resource_dispatcher_host_delegate.h +++ b/libcef/browser/resource_dispatcher_host_delegate.h @@ -24,7 +24,6 @@ class CefResourceDispatcherHostDelegate ResourceType::Type resource_type, int child_id, int route_id, - bool is_continuation_of_transferred_request, ScopedVector* throttles) OVERRIDE; virtual bool HandleExternalProtocol(const GURL& url, int child_id, diff --git a/libcef/common/request_impl.cc b/libcef/common/request_impl.cc index 57ab7014d..dd6ca6a19 100644 --- a/libcef/common/request_impl.cc +++ b/libcef/common/request_impl.cc @@ -544,7 +544,7 @@ net::UploadDataStream* CefPostDataImpl::Get() { static_cast(it->get())->Get()); } - return new net::UploadDataStream(&element_readers, 0); + return new net::UploadDataStream(element_readers.Pass(), 0); } void CefPostDataImpl::Set(const WebKit::WebHTTPBody& data) { diff --git a/libcef/renderer/content_renderer_client.cc b/libcef/renderer/content_renderer_client.cc index d54235bf6..2e37f3c02 100644 --- a/libcef/renderer/content_renderer_client.cc +++ b/libcef/renderer/content_renderer_client.cc @@ -7,6 +7,7 @@ #include "config.h" MSVC_PUSH_WARNING_LEVEL(0); +#include "bindings/v8/V8Binding.h" #include "bindings/v8/V8RecursionScope.h" #include "bindings/v8/V8Utilities.h" MSVC_POP_WARNING(); @@ -546,7 +547,7 @@ void CefContentRendererClient::DidCreateScriptContext( v8::HandleScope handle_scope(webkit_glue::GetV8Isolate(frame)); v8::Context::Scope scope(context); WebCore::V8RecursionScope recursion_scope( - WebCore::getScriptExecutionContext()); + WebCore::toExecutionContext(context)); CefRefPtr contextPtr(new CefV8ContextImpl(context)); @@ -579,7 +580,7 @@ void CefContentRendererClient::WillReleaseScriptContext( v8::HandleScope handle_scope(webkit_glue::GetV8Isolate(frame)); v8::Context::Scope scope(context); WebCore::V8RecursionScope recursion_scope( - WebCore::getScriptExecutionContext()); + WebCore::toExecutionContext(context)); CefRefPtr contextPtr(new CefV8ContextImpl(context)); diff --git a/libcef/renderer/v8_impl.cc b/libcef/renderer/v8_impl.cc index 5ea1498db..9bd6f901e 100644 --- a/libcef/renderer/v8_impl.cc +++ b/libcef/renderer/v8_impl.cc @@ -14,7 +14,7 @@ #include "config.h" MSVC_PUSH_WARNING_LEVEL(0); -#include "core/page/Frame.h" +#include "core/frame/Frame.h" #include "core/workers/WorkerGlobalScope.h" #include "bindings/v8/ScriptController.h" #include "bindings/v8/V8Binding.h" @@ -478,7 +478,7 @@ void GetCefString(v8::Handle str, CefString& out) { // V8 function callback. void FunctionCallbackImpl(const v8::FunctionCallbackInfo& info) { WebCore::V8RecursionScope recursion_scope( - WebCore::toScriptExecutionContext(v8::Context::GetCurrent())); + WebCore::toExecutionContext(v8::Context::GetCurrent())); CefV8Handler* handler = static_cast(v8::External::Cast(*info.Data())->Value()); @@ -516,7 +516,7 @@ void AccessorGetterCallbackImpl( v8::Local property, const v8::PropertyCallbackInfo& info) { WebCore::V8RecursionScope recursion_scope( - WebCore::toScriptExecutionContext(v8::Context::GetCurrent())); + WebCore::toExecutionContext(v8::Context::GetCurrent())); v8::Handle obj = info.This(); @@ -554,7 +554,7 @@ void AccessorSetterCallbackImpl( v8::Local value, const v8::PropertyCallbackInfo& info) { WebCore::V8RecursionScope recursion_scope( - WebCore::toScriptExecutionContext(v8::Context::GetCurrent())); + WebCore::toExecutionContext(v8::Context::GetCurrent())); v8::Handle obj = info.This(); @@ -599,8 +599,8 @@ v8::Local CallV8Function(v8::Handle context, WebCore::WorkerScriptController::controllerForContext(); DCHECK(controller); if (controller) { - func_rv = WebCore::ScriptController::callFunctionWithInstrumentation( - controller->workerGlobalScope()->scriptExecutionContext(), + func_rv = WebCore::ScriptController::callFunction( + controller->workerGlobalScope()->executionContext(), function, receiver, argc, args, isolate); } } diff --git a/patch/patch.cfg b/patch/patch.cfg index 93ff8d5fe..3e54631ef 100644 --- a/patch/patch.cfg +++ b/patch/patch.cfg @@ -12,32 +12,37 @@ patches = [ 'path': '../tools/gritsettings/', }, { + # Fix Xcode 4 build on OS X Lion. # http://codereview.chromium.org/8086022/ 'name': 'build', 'path': '../build/', }, { + # Support loading of password protected zip archives. # http://code.google.com/p/chromiumembedded/issues/detail?id=496 'name': 'zlib', 'path': '../third_party/zlib/', }, { + # Avoid MessageLoop assertion on OS X. # http://code.google.com/p/chromiumembedded/issues/detail?id=443 'name': 'message_loop_443', 'path': '../base/message_loop/', }, { + # Disable event type assertion in WebNode::addEventListener. # http://code.google.com/p/chromiumembedded/issues/detail?id=933 'name': 'webkit_933', 'path': '../third_party/WebKit/Source/web/', }, { + # Fix ninja output for localization directories on OS X. # http://code.google.com/p/gyp/issues/detail?id=331 'name': 'gyp_331', 'path': '../tools/gyp/pylib/', }, { - # Enable popups in offscreen rendering on Mac + # Enable popups in offscreen rendering on OS X. 'name': 'webkit_popups', 'path': '../third_party/WebKit/', }, @@ -48,6 +53,13 @@ patches = [ 'path': '../ui/base/cocoa/', }, { + # Support direct access to DevTools URLs. + # https://codereview.chromium.org/27600002/ + 'name': 'devtools_target', + 'path': '../content/', + }, + { + # Disable scollbar bounce and overlay on OS X. # http://code.google.com/p/chromiumembedded/issues/detail?id=364 'name': 'spi_webcore_364', 'path': '../third_party/WebKit/Source/core/', diff --git a/patch/patches/devtools_target.patch b/patch/patches/devtools_target.patch new file mode 100644 index 000000000..ac5dd7ff7 --- /dev/null +++ b/patch/patches/devtools_target.patch @@ -0,0 +1,43 @@ +Index: browser/devtools/devtools_http_handler_impl.cc +=================================================================== +--- browser/devtools/devtools_http_handler_impl.cc (revision 228917) ++++ browser/devtools/devtools_http_handler_impl.cc (working copy) +@@ -542,9 +542,17 @@ + + DevToolsTarget* DevToolsHttpHandlerImpl::GetTarget(const std::string& id) { + TargetMap::const_iterator it = target_map_.find(id); +- if (it == target_map_.end()) +- return NULL; +- return it->second; ++ if (it != target_map_.end()) ++ return it->second; ++ ++ scoped_ptr target(delegate_->CreateTargetForId(id)); ++ if (target) { ++ DCHECK_EQ(id, target->GetId()); ++ target_map_[id] = target.release(); ++ return target_map_[id]; ++ } ++ ++ return NULL; + } + + void DevToolsHttpHandlerImpl::OnThumbnailRequestUI( +Index: public/browser/devtools_http_handler_delegate.h +=================================================================== +--- public/browser/devtools_http_handler_delegate.h (revision 228917) ++++ public/browser/devtools_http_handler_delegate.h (working copy) +@@ -39,6 +39,13 @@ + // Creates new inspectable target. + virtual scoped_ptr CreateNewTarget() = 0; + ++ // Creates an inspectable target for the specified |id|. Called in cases where ++ // the target has not been enumerated (for example, direct URL access where ++ // the discovery JSON was not loaded first). This method was added for ++ // Chromium Embedded Framework. ++ virtual scoped_ptr CreateTargetForId( ++ const std::string& id) = 0; ++ + typedef std::vector TargetList; + typedef base::Callback TargetCallback; + diff --git a/patch/patches/spi_webcore_364.patch b/patch/patches/spi_webcore_364.patch index 7ea5b0214..66c526451 100644 --- a/patch/patches/spi_webcore_364.patch +++ b/patch/patches/spi_webcore_364.patch @@ -1,8 +1,8 @@ -Index: page/FrameView.cpp +Index: frame/FrameView.cpp =================================================================== ---- page/FrameView.cpp (revision 158192) -+++ page/FrameView.cpp (working copy) -@@ -189,8 +189,10 @@ +--- frame/FrameView.cpp (revision 159695) ++++ frame/FrameView.cpp (working copy) +@@ -198,8 +198,10 @@ if (!isMainFrame()) return; @@ -15,9 +15,9 @@ Index: page/FrameView.cpp PassRefPtr FrameView::create(Frame* frame) Index: platform/mac/NSScrollerImpDetails.mm =================================================================== ---- platform/mac/NSScrollerImpDetails.mm (revision 158192) +--- platform/mac/NSScrollerImpDetails.mm (revision 159695) +++ platform/mac/NSScrollerImpDetails.mm (working copy) -@@ -34,6 +34,7 @@ +@@ -33,6 +33,7 @@ bool isScrollbarOverlayAPIAvailable() { @@ -25,7 +25,7 @@ Index: platform/mac/NSScrollerImpDetails.mm static bool apiAvailable; static bool shouldInitialize = true; if (shouldInitialize) { -@@ -44,6 +45,9 @@ +@@ -43,6 +44,9 @@ && [scrollerImpPairClass instancesRespondToSelector:@selector(scrollerStyle)]; } return apiAvailable; diff --git a/patch/patches/webkit_popups.patch b/patch/patches/webkit_popups.patch index fc687df3a..9cf2d259c 100644 --- a/patch/patches/webkit_popups.patch +++ b/patch/patches/webkit_popups.patch @@ -1,20 +1,20 @@ Index: public/web/WebView.h =================================================================== ---- public/web/WebView.h (revision 158192) +--- public/web/WebView.h (revision 159695) +++ public/web/WebView.h (working copy) -@@ -444,6 +444,7 @@ +@@ -447,6 +447,7 @@ // Sets whether select popup menus should be rendered by the browser. - WEBKIT_EXPORT static void setUseExternalPopupMenus(bool); + BLINK_EXPORT static void setUseExternalPopupMenus(bool); + virtual void setUseExternalPopupMenusThisInstance(bool) = 0; // Visited link state -------------------------------------------------- Index: Source/web/ChromeClientImpl.cpp =================================================================== ---- Source/web/ChromeClientImpl.cpp (revision 158192) +--- Source/web/ChromeClientImpl.cpp (revision 159695) +++ Source/web/ChromeClientImpl.cpp (working copy) -@@ -878,7 +878,7 @@ +@@ -875,7 +875,7 @@ PassRefPtr ChromeClientImpl::createPopupMenu(Frame& frame, PopupMenuClient* client) const { @@ -25,17 +25,17 @@ Index: Source/web/ChromeClientImpl.cpp return adoptRef(new PopupMenuChromium(frame, client)); Index: Source/web/WebViewImpl.cpp =================================================================== ---- Source/web/WebViewImpl.cpp (revision 158192) +--- Source/web/WebViewImpl.cpp (revision 159695) +++ Source/web/WebViewImpl.cpp (working copy) -@@ -397,6 +397,7 @@ +@@ -411,6 +411,7 @@ , m_fakePageScaleAnimationPageScaleFactor(0) , m_fakePageScaleAnimationUseAnchor(false) , m_contextMenuAllowed(false) + , m_shouldUseExternalPopupMenus(shouldUseExternalPopupMenus) , m_doingDragAndDrop(false) , m_ignoreInputEvents(false) - , m_suppressNextKeypressEvent(false) -@@ -3709,9 +3710,14 @@ + , m_compositorDeviceScaleFactorOverride(0) +@@ -3751,9 +3752,14 @@ updateLayerTreeViewport(); } @@ -53,9 +53,9 @@ Index: Source/web/WebViewImpl.cpp void WebViewImpl::startDragging(Frame* frame, Index: Source/web/WebViewImpl.h =================================================================== ---- Source/web/WebViewImpl.h (revision 158192) +--- Source/web/WebViewImpl.h (revision 159695) +++ Source/web/WebViewImpl.h (working copy) -@@ -422,7 +422,8 @@ +@@ -424,7 +424,8 @@ // Returns true if popup menus should be rendered by the browser, false if // they should be rendered by WebKit (which is the default). @@ -65,7 +65,7 @@ Index: Source/web/WebViewImpl.h bool contextMenuAllowed() const { -@@ -723,6 +724,8 @@ +@@ -727,6 +728,8 @@ bool m_contextMenuAllowed;