From f816c01e9c6f6f0365ba80ba3f661e38461a0537 Mon Sep 17 00:00:00 2001 From: "mpcomplete@chromium.org" Date: Fri, 26 Jun 2009 21:48:32 +0000 Subject: Add notifications for when V8Proxy creates or destroys a V8 Context. BUG=no TEST=no Review URL: http://codereview.chromium.org/147124 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@19424 0039d316-1c4b-4281-b951-d872f2087c98 --- chrome/renderer/extensions/event_bindings.cc | 17 +++++++++++++++++ chrome/renderer/extensions/event_bindings.h | 5 +++++ chrome/renderer/render_view.cc | 9 +++++++++ chrome/renderer/render_view.h | 2 ++ webkit/glue/webframe.h | 14 ++++++++++++++ webkit/glue/webframe_impl.cc | 11 +++++++++++ webkit/glue/webframe_impl.h | 6 ++++++ webkit/glue/webframeloaderclient_impl.cc | 14 ++++++++++++++ webkit/glue/webframeloaderclient_impl.h | 5 ++--- webkit/glue/webview_delegate.h | 10 ++++++++++ webkit/port/bindings/v8/v8_proxy.cpp | 3 +++ 11 files changed, 93 insertions(+), 3 deletions(-) diff --git a/chrome/renderer/extensions/event_bindings.cc b/chrome/renderer/extensions/event_bindings.cc index 576beba..7c988e2 100644 --- a/chrome/renderer/extensions/event_bindings.cc +++ b/chrome/renderer/extensions/event_bindings.cc @@ -12,6 +12,7 @@ #include "chrome/renderer/js_only_v8_extensions.h" #include "chrome/renderer/render_thread.h" #include "grit/renderer_resources.h" +#include "webkit/glue/webframe.h" namespace { @@ -164,6 +165,22 @@ void EventBindings::SetRenderThread(RenderThreadBase* thread) { render_thread = thread; } +// static +void EventBindings::HandleContextCreated(WebFrame* frame) { + v8::HandleScope handle_scope; + v8::Local context = frame->GetScriptContext(); + DCHECK(!context.IsEmpty()); + // TODO(mpcomplete): register it +} + +// static +void EventBindings::HandleContextDestroyed(WebFrame* frame) { + v8::HandleScope handle_scope; + v8::Local context = frame->GetScriptContext(); + DCHECK(!context.IsEmpty()); + // TODO(mpcomplete): unregister it, dispatch event +} + void EventBindings::CallFunction(const std::string& function_name, int argc, v8::Handle* argv) { for (ContextList::iterator it = GetRegisteredContexts().begin(); diff --git a/chrome/renderer/extensions/event_bindings.h b/chrome/renderer/extensions/event_bindings.h index 0ca59c0..a026c19 100644 --- a/chrome/renderer/extensions/event_bindings.h +++ b/chrome/renderer/extensions/event_bindings.h @@ -10,6 +10,7 @@ #include class RenderThreadBase; +class WebFrame; // This class deals with the javascript bindings related to Event objects. class EventBindings { @@ -20,6 +21,10 @@ class EventBindings { // Allow RenderThread to be mocked out. static void SetRenderThread(RenderThreadBase* thread); + // Handle a script context coming / going away. + static void HandleContextCreated(WebFrame* frame); + static void HandleContextDestroyed(WebFrame* frame); + // Calls the given function in each registered context which is listening // for events. The function can be an object property, ie: // "chromium.Event.dispatch_". diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc index 051b8d6..d1aea1c 100644 --- a/chrome/renderer/render_view.cc +++ b/chrome/renderer/render_view.cc @@ -35,6 +35,7 @@ #include "chrome/renderer/audio_message_filter.h" #include "chrome/renderer/devtools_agent.h" #include "chrome/renderer/devtools_client.h" +#include "chrome/renderer/extensions/event_bindings.h" #include "chrome/renderer/extensions/extension_process_bindings.h" #include "chrome/renderer/localized_error.h" #include "chrome/renderer/media/audio_renderer_impl.h" @@ -1425,6 +1426,14 @@ void RenderView::DocumentElementAvailable(WebFrame* frame) { frame, UserScript::DOCUMENT_START); } +void RenderView::DidCreateScriptContext(WebFrame* webframe) { + EventBindings::HandleContextCreated(webframe); +} + +void RenderView::DidDestroyScriptContext(WebFrame* webframe) { + EventBindings::HandleContextDestroyed(webframe); +} + WindowOpenDisposition RenderView::DispositionForNavigationAction( WebView* webview, WebFrame* frame, diff --git a/chrome/renderer/render_view.h b/chrome/renderer/render_view.h index 07cbc02..97f8130 100644 --- a/chrome/renderer/render_view.h +++ b/chrome/renderer/render_view.h @@ -222,6 +222,8 @@ class RenderView : public RenderWidget, virtual void WindowObjectCleared(WebFrame* webframe); virtual void DocumentElementAvailable(WebFrame* webframe); + virtual void DidCreateScriptContext(WebFrame* webframe); + virtual void DidDestroyScriptContext(WebFrame* webframe); virtual WindowOpenDisposition DispositionForNavigationAction( WebView* webview, diff --git a/webkit/glue/webframe.h b/webkit/glue/webframe.h index 2a7f524..1f5974c 100644 --- a/webkit/glue/webframe.h +++ b/webkit/glue/webframe.h @@ -11,6 +11,7 @@ #include "base/string16.h" #include "skia/ext/bitmap_platform_device.h" #include "skia/ext/platform_canvas.h" +#include "webkit/api/public/WebCommon.h" class GURL; class WebView; @@ -30,6 +31,13 @@ struct WebSize; struct WebURLError; } +#if WEBKIT_USING_V8 +namespace v8 { + template class Local; + class Context; +} +#endif + // Every frame in a web page is represented by one WebFrame, including the // outermost frame. class WebFrame { @@ -69,6 +77,12 @@ class WebFrame { virtual NPObject* GetWindowNPObject() = 0; +#if WEBKIT_USING_V8 + // Returns the V8 context for this frame, or an empty handle if there is + // none. + virtual v8::Local GetScriptContext() = 0; +#endif + // Loads the given WebURLRequest. virtual void LoadRequest(const WebKit::WebURLRequest& request) = 0; diff --git a/webkit/glue/webframe_impl.cc b/webkit/glue/webframe_impl.cc index 7a8f190..a02e73a 100644 --- a/webkit/glue/webframe_impl.cc +++ b/webkit/glue/webframe_impl.cc @@ -819,6 +819,17 @@ NPObject* WebFrameImpl::GetWindowNPObject() { return frame_->script()->windowScriptNPObject(); } +#if USE(V8) + // Returns the V8 context for this frame, or an empty handle if there is + // none. +v8::Local WebFrameImpl::GetScriptContext() { + if (!frame_) + return v8::Local(); + + return frame_->script()->proxy()->GetContext(); +} +#endif + void WebFrameImpl::InvalidateArea(AreaToInvalidate area) { ASSERT(frame() && frame()->view()); #if defined(OS_WIN) || defined(OS_LINUX) diff --git a/webkit/glue/webframe_impl.h b/webkit/glue/webframe_impl.h index 9a344c0c..f164214 100644 --- a/webkit/glue/webframe_impl.h +++ b/webkit/glue/webframe_impl.h @@ -119,6 +119,12 @@ class WebFrameImpl : public WebFrame, public base::RefCounted { virtual NPObject* GetWindowNPObject(); +#if USE(V8) + // Returns the V8 context for this frame, or an empty handle if there is + // none. + virtual v8::Local GetScriptContext(); +#endif + virtual void GetContentAsPlainText(int max_chars, std::wstring* text) const; virtual bool Find( int request_id, diff --git a/webkit/glue/webframeloaderclient_impl.cc b/webkit/glue/webframeloaderclient_impl.cc index dc0e9c0..5def74f 100644 --- a/webkit/glue/webframeloaderclient_impl.cc +++ b/webkit/glue/webframeloaderclient_impl.cc @@ -125,6 +125,20 @@ void WebFrameLoaderClient::documentElementAvailable() { d->DocumentElementAvailable(webframe_); } +void WebFrameLoaderClient::didCreateScriptContext() { + WebViewImpl* webview = webframe_->GetWebViewImpl(); + WebViewDelegate* d = webview->delegate(); + if (d) + d->DidCreateScriptContext(webframe_); +} + +void WebFrameLoaderClient::didDestroyScriptContext() { + WebViewImpl* webview = webframe_->GetWebViewImpl(); + WebViewDelegate* d = webview->delegate(); + if (d) + d->DidDestroyScriptContext(webframe_); +} + void WebFrameLoaderClient::didPerformFirstNavigation() const { } diff --git a/webkit/glue/webframeloaderclient_impl.h b/webkit/glue/webframeloaderclient_impl.h index e5d6927..e31e7e4 100644 --- a/webkit/glue/webframeloaderclient_impl.h +++ b/webkit/glue/webframeloaderclient_impl.h @@ -44,9 +44,8 @@ class WebFrameLoaderClient : public WebCore::FrameLoaderClient { virtual void windowObjectCleared(); virtual void documentElementAvailable(); - // TODO(mpcomplete): roll DEPS - virtual void didCreateScriptContext() {} - virtual void didDestroyScriptContext() {} + virtual void didCreateScriptContext(); + virtual void didDestroyScriptContext(); virtual bool hasWebView() const; // mainly for assertions virtual bool hasFrameView() const; // ditto diff --git a/webkit/glue/webview_delegate.h b/webkit/glue/webview_delegate.h index bd081c4..94fd4f5 100644 --- a/webkit/glue/webview_delegate.h +++ b/webkit/glue/webview_delegate.h @@ -210,6 +210,16 @@ class WebViewDelegate : virtual public WebWidgetDelegate { virtual void DocumentElementAvailable(WebFrame* webframe) { } + // Notifies that a new script context has been created for this frame. + // This is similar to WindowObjectCleared but only called once per frame + // context. + virtual void DidCreateScriptContext(WebFrame* webframe) { + } + + // Notifies that this frame's script context has been destroyed. + virtual void DidDestroyScriptContext(WebFrame* webframe) { + } + // PolicyDelegate ---------------------------------------------------------- // This method is called to notify the delegate, and let it modify a diff --git a/webkit/port/bindings/v8/v8_proxy.cpp b/webkit/port/bindings/v8/v8_proxy.cpp index d11ee18..e1f23ef 100644 --- a/webkit/port/bindings/v8/v8_proxy.cpp +++ b/webkit/port/bindings/v8/v8_proxy.cpp @@ -45,6 +45,7 @@ #include "CSSMutableStyleDeclaration.h" #include "DOMObjectsInclude.h" #include "DocumentLoader.h" +#include "FrameLoaderClient.h" #include "ScriptController.h" #include "V8CustomBinding.h" #include "V8DOMMap.h" @@ -1931,6 +1932,7 @@ void V8Proxy::ClearDocumentWrapperCache() void V8Proxy::DisposeContextHandles() { if (!m_context.IsEmpty()) { + m_frame->loader()->client()->didDestroyScriptContext(); m_context.Dispose(); m_context.Clear(); } @@ -2334,6 +2336,7 @@ void V8Proxy::InitContextIfNeeded() SetSecurityToken(); + m_frame->loader()->client()->didCreateScriptContext(); m_frame->loader()->dispatchWindowObjectAvailable(); } -- cgit v1.1