diff options
Diffstat (limited to 'Source/WebCore/bindings/v8/custom/V8DOMWindowCustom.cpp')
-rw-r--r-- | Source/WebCore/bindings/v8/custom/V8DOMWindowCustom.cpp | 81 |
1 files changed, 37 insertions, 44 deletions
diff --git a/Source/WebCore/bindings/v8/custom/V8DOMWindowCustom.cpp b/Source/WebCore/bindings/v8/custom/V8DOMWindowCustom.cpp index 0dcc29952..3fe880a78 100644 --- a/Source/WebCore/bindings/v8/custom/V8DOMWindowCustom.cpp +++ b/Source/WebCore/bindings/v8/custom/V8DOMWindowCustom.cpp @@ -31,7 +31,7 @@ #include "config.h" #include "V8DOMWindow.h" -#include <wtf/ArrayBuffer.h> +#include "BindingState.h" #include "Chrome.h" #include "ContentSecurityPolicy.h" #include "DOMTimer.h" @@ -56,8 +56,6 @@ #include "SharedWorkerRepository.h" #include "Storage.h" #include "V8Binding.h" -#include "V8BindingMacros.h" -#include "V8BindingState.h" #include "V8EventListener.h" #include "V8GCForContextDispose.h" #include "V8HiddenPropertyName.h" @@ -66,6 +64,7 @@ #include "V8Proxy.h" #include "V8Utilities.h" #include "WindowFeatures.h" +#include <wtf/ArrayBuffer.h> namespace WebCore { @@ -107,7 +106,7 @@ v8::Handle<v8::Value> WindowSetTimeoutImpl(const v8::Arguments& args, bool singl if (argumentCount >= 2) timeout = args[1]->Int32Value(); - if (!V8BindingSecurity::canAccessFrame(V8BindingState::Only(), imp->frame(), true)) + if (!BindingSecurity::shouldAllowAccessToFrame(BindingState::instance(), imp->frame())) return v8::Undefined(); int id; @@ -152,7 +151,7 @@ v8::Handle<v8::Value> V8DOMWindow::eventAccessorGetter(v8::Local<v8::String> nam return v8::Undefined(); Frame* frame = V8DOMWindow::toNative(holder)->frame(); - if (!V8BindingSecurity::canAccessFrame(V8BindingState::Only(), frame, true)) + if (!BindingSecurity::shouldAllowAccessToFrame(BindingState::instance(), frame)) return v8::Undefined(); v8::Local<v8::Context> context = V8Proxy::context(frame); @@ -173,7 +172,7 @@ void V8DOMWindow::eventAccessorSetter(v8::Local<v8::String> name, v8::Local<v8:: return; Frame* frame = V8DOMWindow::toNative(holder)->frame(); - if (!V8BindingSecurity::canAccessFrame(V8BindingState::Only(), frame, true)) + if (!BindingSecurity::shouldAllowAccessToFrame(BindingState::instance(), frame)) return; v8::Local<v8::Context> context = V8Proxy::context(frame); @@ -187,25 +186,25 @@ void V8DOMWindow::eventAccessorSetter(v8::Local<v8::String> name, v8::Local<v8:: void V8DOMWindow::locationAccessorSetter(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::AccessorInfo& info) { DOMWindow* imp = V8DOMWindow::toNative(info.Holder()); - State<V8Binding>* state = V8BindingState::Only(); + BindingState* state = BindingState::instance(); - DOMWindow* activeWindow = state->activeWindow(); - if (!activeWindow) + DOMWindow* active = activeDOMWindow(state); + if (!active) return; - DOMWindow* firstWindow = state->firstWindow(); - if (!firstWindow) + DOMWindow* first = firstDOMWindow(state); + if (!first) return; if (Location* location = imp->location()) - location->setHref(toWebCoreString(value), activeWindow, firstWindow); + location->setHref(toWebCoreString(value), active, first); } void V8DOMWindow::openerAccessorSetter(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::AccessorInfo& info) { DOMWindow* imp = V8DOMWindow::toNative(info.Holder()); - if (!V8BindingSecurity::canAccessFrame(V8BindingState::Only(), imp->frame(), true)) + if (!BindingSecurity::shouldAllowAccessToFrame(BindingState::instance(), imp->frame())) return; // Opener can be shadowed if it is in the same domain. @@ -234,7 +233,7 @@ v8::Handle<v8::Value> V8DOMWindow::addEventListenerCallback(const v8::Arguments& DOMWindow* imp = V8DOMWindow::toNative(args.Holder()); - if (!V8BindingSecurity::canAccessFrame(V8BindingState::Only(), imp->frame(), true)) + if (!BindingSecurity::shouldAllowAccessToFrame(BindingState::instance(), imp->frame())) return v8::Undefined(); Document* doc = imp->document(); @@ -243,8 +242,7 @@ v8::Handle<v8::Value> V8DOMWindow::addEventListenerCallback(const v8::Arguments& return v8::Undefined(); // FIXME: Check if there is not enough arguments - V8Proxy* proxy = V8Proxy::retrieve(imp->frame()); - if (!proxy) + if (!imp->frame()) return v8::Undefined(); RefPtr<EventListener> listener = V8DOMWrapper::getEventListener(args[1], false, ListenerFindOrCreate); @@ -267,7 +265,7 @@ v8::Handle<v8::Value> V8DOMWindow::removeEventListenerCallback(const v8::Argumen DOMWindow* imp = V8DOMWindow::toNative(args.Holder()); - if (!V8BindingSecurity::canAccessFrame(V8BindingState::Only(), imp->frame(), true)) + if (!BindingSecurity::shouldAllowAccessToFrame(BindingState::instance(), imp->frame())) return v8::Undefined(); Document* doc = imp->document(); @@ -275,8 +273,7 @@ v8::Handle<v8::Value> V8DOMWindow::removeEventListenerCallback(const v8::Argumen if (!doc) return v8::Undefined(); - V8Proxy* proxy = V8Proxy::retrieve(imp->frame()); - if (!proxy) + if (!imp->frame()) return v8::Undefined(); RefPtr<EventListener> listener = V8DOMWrapper::getEventListener(args[1], false, ListenerFindOnly); @@ -302,7 +299,7 @@ static v8::Handle<v8::Value> handlePostMessageCallback(const v8::Arguments& args // None of these need to be RefPtr because args and context are guaranteed // to hold on to them. DOMWindow* window = V8DOMWindow::toNative(args.Holder()); - DOMWindow* source = V8Proxy::retrieveWindowForCallingContext(); + DOMWindow* source = activeDOMWindow(BindingState::instance()); // If called directly by WebCore we don't have a calling context. if (!source) @@ -326,7 +323,7 @@ static v8::Handle<v8::Value> handlePostMessageCallback(const v8::Arguments& args targetOriginArgIndex = 2; transferablesArgIndex = 1; } - if (!extractTransferables(args[transferablesArgIndex], portArray, arrayBufferArray)) + if (!extractTransferables(args[transferablesArgIndex], portArray, arrayBufferArray, args.GetIsolate())) return v8::Undefined(); } targetOrigin = toWebCoreStringWithNullOrUndefinedCheck(args[targetOriginArgIndex]); @@ -348,7 +345,7 @@ static v8::Handle<v8::Value> handlePostMessageCallback(const v8::Arguments& args ExceptionCode ec = 0; window->postMessage(message.release(), &portArray, targetOrigin, source, ec); - return throwError(ec, args.GetIsolate()); + return V8Proxy::setDOMException(ec, args.GetIsolate()); } v8::Handle<v8::Value> V8DOMWindow::postMessageCallback(const v8::Arguments& args) @@ -434,8 +431,8 @@ v8::Handle<v8::Value> V8DOMWindow::showModalDialogCallback(const v8::Arguments& { INC_STATS("DOM.DOMWindow.showModalDialog()"); DOMWindow* impl = V8DOMWindow::toNative(args.Holder()); - V8BindingState* state = V8BindingState::Only(); - if (!V8BindingSecurity::canAccessFrame(state, impl->frame(), true)) + BindingState* state = BindingState::instance(); + if (!BindingSecurity::shouldAllowAccessToFrame(state, impl->frame())) return v8::Undefined(); // FIXME: Handle exceptions properly. @@ -443,9 +440,7 @@ v8::Handle<v8::Value> V8DOMWindow::showModalDialogCallback(const v8::Arguments& DialogHandler handler(args[1]); String dialogFeaturesString = toWebCoreStringWithNullOrUndefinedCheck(args[2]); - DOMWindow* activeWindow = state->activeWindow(); - DOMWindow* firstWindow = state->firstWindow(); - impl->showModalDialog(urlString, dialogFeaturesString, activeWindow, firstWindow, setUpDialog, &handler); + impl->showModalDialog(urlString, dialogFeaturesString, activeDOMWindow(state), firstDOMWindow(state), setUpDialog, &handler); return handler.returnValue(); } @@ -454,8 +449,8 @@ v8::Handle<v8::Value> V8DOMWindow::openCallback(const v8::Arguments& args) { INC_STATS("DOM.DOMWindow.open()"); DOMWindow* impl = V8DOMWindow::toNative(args.Holder()); - V8BindingState* state = V8BindingState::Only(); - if (!V8BindingSecurity::canAccessFrame(state, impl->frame(), true)) + BindingState* state = BindingState::instance(); + if (!BindingSecurity::shouldAllowAccessToFrame(state, impl->frame())) return v8::Undefined(); // FIXME: Handle exceptions properly. @@ -463,9 +458,7 @@ v8::Handle<v8::Value> V8DOMWindow::openCallback(const v8::Arguments& args) AtomicString frameName = (args[1]->IsUndefined() || args[1]->IsNull()) ? "_blank" : AtomicString(toWebCoreString(args[1])); String windowFeaturesString = toWebCoreStringWithNullOrUndefinedCheck(args[2]); - DOMWindow* activeWindow = state->activeWindow(); - DOMWindow* firstWindow = state->firstWindow(); - RefPtr<DOMWindow> openedWindow = impl->open(urlString, frameName, windowFeaturesString, activeWindow, firstWindow); + RefPtr<DOMWindow> openedWindow = impl->open(urlString, frameName, windowFeaturesString, activeDOMWindow(state), firstDOMWindow(state)); if (!openedWindow) return v8::Undefined(); @@ -478,17 +471,17 @@ v8::Handle<v8::Value> V8DOMWindow::indexedPropertyGetter(uint32_t index, const v DOMWindow* window = V8DOMWindow::toNative(info.Holder()); if (!window) - return v8::Handle<v8::Value>(); + return v8Undefined(); Frame* frame = window->frame(); if (!frame) - return v8::Handle<v8::Value>(); + return v8Undefined(); Frame* child = frame->tree()->scopedChild(index); if (child) return toV8(child->domWindow(), info.GetIsolate()); - return v8::Handle<v8::Value>(); + return v8Undefined(); } @@ -498,22 +491,22 @@ v8::Handle<v8::Value> V8DOMWindow::namedPropertyGetter(v8::Local<v8::String> nam DOMWindow* window = V8DOMWindow::toNative(info.Holder()); if (!window) - return v8::Handle<v8::Value>(); + return v8Undefined(); Frame* frame = window->frame(); // window is detached from a frame. if (!frame) - return v8::Handle<v8::Value>(); + return v8Undefined(); // Search sub-frames. - AtomicString propName = v8StringToAtomicWebCoreString(name); + AtomicString propName = v8ValueToAtomicWebCoreString(name); Frame* child = frame->tree()->scopedChild(propName); if (child) return toV8(child->domWindow(), info.GetIsolate()); // Search IDL functions defined in the prototype if (!info.Holder()->GetRealNamedProperty(name).IsEmpty()) - return v8::Handle<v8::Value>(); + return v8Undefined(); // Search named items in the document. Document* doc = frame->document(); @@ -529,7 +522,7 @@ v8::Handle<v8::Value> V8DOMWindow::namedPropertyGetter(v8::Local<v8::String> nam } } - return v8::Handle<v8::Value>(); + return v8Undefined(); } @@ -576,7 +569,7 @@ bool V8DOMWindow::namedSecurityCheck(v8::Local<v8::Object> host, v8::Local<v8::V return true; } - return V8BindingSecurity::canAccessFrame(V8BindingState::Only(), target, false); + return BindingSecurity::shouldAllowAccessToFrame(BindingState::instance(), target, DoNotReportSecurityError); } bool V8DOMWindow::indexedSecurityCheck(v8::Local<v8::Object> host, uint32_t index, v8::AccessType type, v8::Local<v8::Value>) @@ -601,7 +594,7 @@ bool V8DOMWindow::indexedSecurityCheck(v8::Local<v8::Object> host, uint32_t inde if (type == v8::ACCESS_GET && childFrame && !host->HasRealIndexedProperty(index)) return true; - return V8BindingSecurity::canAccessFrame(V8BindingState::Only(), target, false); + return BindingSecurity::shouldAllowAccessToFrame(BindingState::instance(), target, DoNotReportSecurityError); } v8::Handle<v8::Value> toV8(DOMWindow* window, v8::Isolate* isolate) @@ -612,7 +605,7 @@ v8::Handle<v8::Value> toV8(DOMWindow* window, v8::Isolate* isolate) // of the frame. Frame* frame = window->frame(); if (!frame) - return v8::Handle<v8::Object>(); + return v8Undefined(); // Special case: Because of evaluateInIsolatedWorld() one DOMWindow can have // multiple contexts and multiple global objects associated with it. When @@ -630,7 +623,7 @@ v8::Handle<v8::Value> toV8(DOMWindow* window, v8::Isolate* isolate) // Otherwise, return the global object associated with this frame. v8::Handle<v8::Context> context = V8Proxy::context(frame); if (context.IsEmpty()) - return v8::Handle<v8::Object>(); + return v8Undefined(); v8::Handle<v8::Object> global = context->Global(); ASSERT(!global.IsEmpty()); |