diff options
Diffstat (limited to 'src/3rdparty/webkit/WebCore/bindings/js/JSDOMWindowCustom.cpp')
-rw-r--r-- | src/3rdparty/webkit/WebCore/bindings/js/JSDOMWindowCustom.cpp | 43 |
1 files changed, 27 insertions, 16 deletions
diff --git a/src/3rdparty/webkit/WebCore/bindings/js/JSDOMWindowCustom.cpp b/src/3rdparty/webkit/WebCore/bindings/js/JSDOMWindowCustom.cpp index 7410107560..2804b3ce65 100644 --- a/src/3rdparty/webkit/WebCore/bindings/js/JSDOMWindowCustom.cpp +++ b/src/3rdparty/webkit/WebCore/bindings/js/JSDOMWindowCustom.cpp @@ -79,7 +79,9 @@ #include "RegisteredEventListener.h" #include "ScheduledAction.h" #include "ScriptController.h" +#include "SerializedScriptValue.h" #include "Settings.h" +#include "SharedWorkerRepository.h" #include "WindowFeatures.h" #include <runtime/Error.h> #include <runtime/JSFunction.h> @@ -589,7 +591,7 @@ void JSDOMWindow::setLocation(ExecState* exec, JSValue value) if (!protocolIsJavaScript(url) || allowsAccessFrom(exec)) { // We want a new history item if this JS was called via a user gesture - frame->loader()->scheduleLocationChange(url, lexicalFrame->loader()->outgoingReferrer(), !lexicalFrame->script()->anyPageIsProcessingUserGesture(), false, processingUserGesture(exec)); + frame->redirectScheduler()->scheduleLocationChange(url, lexicalFrame->loader()->outgoingReferrer(), !lexicalFrame->script()->anyPageIsProcessingUserGesture(), false, processingUserGesture(exec)); } } @@ -713,7 +715,9 @@ JSValue JSDOMWindow::worker(ExecState* exec) const #if ENABLE(SHARED_WORKERS) JSValue JSDOMWindow::sharedWorker(ExecState* exec) const { - return getDOMConstructor<JSSharedWorkerConstructor>(exec, this); + if (SharedWorkerRepository::isAvailable()) + return getDOMConstructor<JSSharedWorkerConstructor>(exec, this); + return jsUndefined(); } #endif @@ -726,8 +730,6 @@ JSValue JSDOMWindow::webSocket(ExecState* exec) const Settings* settings = frame->settings(); if (!settings) return jsUndefined(); - if (!settings->experimentalWebSocketsEnabled()) - return jsUndefined(); return getDOMConstructor<JSWebSocketConstructor>(exec, this); } #endif @@ -767,9 +769,10 @@ static Frame* createWindow(ExecState* exec, Frame* lexicalFrame, Frame* dynamicF return 0; newFrame->loader()->setOpener(openerFrame); - newFrame->loader()->setOpenedByDOM(); + newFrame->page()->setOpenedByDOM(); - JSDOMWindow* newWindow = toJSDOMWindow(newFrame); + // FIXME: If a window is created from an isolated world, what are the consequences of this? 'dialogArguments' only appears back in the normal world? + JSDOMWindow* newWindow = toJSDOMWindow(newFrame, normalWorld(exec->globalData())); if (dialogArgs) newWindow->putDirect(Identifier(exec, "dialogArguments"), dialogArgs); @@ -781,7 +784,7 @@ static Frame* createWindow(ExecState* exec, Frame* lexicalFrame, Frame* dynamicF if (created) newFrame->loader()->changeLocation(completedURL, referrer, false, false, userGesture); else if (!url.isEmpty()) - newFrame->loader()->scheduleLocationChange(completedURL.string(), referrer, !lexicalFrame->script()->anyPageIsProcessingUserGesture(), false, userGesture); + newFrame->redirectScheduler()->scheduleLocationChange(completedURL.string(), referrer, !lexicalFrame->script()->anyPageIsProcessingUserGesture(), false, userGesture); } return newFrame; @@ -829,7 +832,7 @@ JSValue JSDOMWindow::open(ExecState* exec, const ArgList& args) if (!shouldAllowNavigation(exec, frame)) return jsUndefined(); - const JSDOMWindow* targetedWindow = toJSDOMWindow(frame); + const JSDOMWindow* targetedWindow = toJSDOMWindow(frame, currentWorld(exec)); if (!completedURL.isEmpty() && (!protocolIsJavaScript(completedURL) || (targetedWindow && targetedWindow->allowsAccessFrom(exec)))) { bool userGesture = processingUserGesture(exec); @@ -838,7 +841,7 @@ JSValue JSDOMWindow::open(ExecState* exec, const ArgList& args) // here. String referrer = dynamicFrame->loader()->outgoingReferrer(); - frame->loader()->scheduleLocationChange(completedURL, referrer, !lexicalFrame->script()->anyPageIsProcessingUserGesture(), false, userGesture); + frame->redirectScheduler()->scheduleLocationChange(completedURL, referrer, !lexicalFrame->script()->anyPageIsProcessingUserGesture(), false, userGesture); } return toJS(exec, frame->domWindow()); } @@ -930,10 +933,18 @@ JSValue JSDOMWindow::showModalDialog(ExecState* exec, const ArgList& args) if (!dialogFrame) return jsUndefined(); - JSDOMWindow* dialogWindow = toJSDOMWindow(dialogFrame); + JSDOMWindow* dialogWindow = toJSDOMWindow(dialogFrame, currentWorld(exec)); dialogFrame->page()->chrome()->runModal(); - return dialogWindow->getDirect(Identifier(exec, "returnValue")); + Identifier returnValue(exec, "returnValue"); + if (dialogWindow->allowsAccessFromNoErrorMessage(exec)) { + PropertySlot slot; + // This is safe, we have already performed the origin security check and we are + // not interested in any of the DOM properties of the window. + if (dialogWindow->JSGlobalObject::getOwnPropertySlot(exec, returnValue, slot)) + return slot.getValue(exec, returnValue); + } + return jsUndefined(); } JSValue JSDOMWindow::postMessage(ExecState* exec, const ArgList& args) @@ -941,7 +952,7 @@ JSValue JSDOMWindow::postMessage(ExecState* exec, const ArgList& args) DOMWindow* window = impl(); DOMWindow* source = asJSDOMWindow(exec->lexicalGlobalObject())->impl(); - String message = args.at(0).toString(exec); + PassRefPtr<SerializedScriptValue> message = SerializedScriptValue::create(exec, args.at(0)); if (exec->hadException()) return jsUndefined(); @@ -965,7 +976,7 @@ JSValue JSDOMWindow::postMessage(ExecState* exec, const ArgList& args) JSValue JSDOMWindow::setTimeout(ExecState* exec, const ArgList& args) { - ScheduledAction* action = ScheduledAction::create(exec, args); + ScheduledAction* action = ScheduledAction::create(exec, args, currentWorld(exec)); if (exec->hadException()) return jsUndefined(); int delay = args.at(1).toInt32(exec); @@ -974,7 +985,7 @@ JSValue JSDOMWindow::setTimeout(ExecState* exec, const ArgList& args) JSValue JSDOMWindow::setInterval(ExecState* exec, const ArgList& args) { - ScheduledAction* action = ScheduledAction::create(exec, args); + ScheduledAction* action = ScheduledAction::create(exec, args, currentWorld(exec)); if (exec->hadException()) return jsUndefined(); int delay = args.at(1).toInt32(exec); @@ -1042,7 +1053,7 @@ JSValue JSDOMWindow::addEventListener(ExecState* exec, const ArgList& args) if (!listener.isObject()) return jsUndefined(); - impl()->addEventListener(args.at(0).toString(exec), JSEventListener::create(asObject(listener), false), args.at(2).toBoolean(exec)); + impl()->addEventListener(args.at(0).toString(exec), JSEventListener::create(asObject(listener), false, currentWorld(exec)), args.at(2).toBoolean(exec)); return jsUndefined(); } @@ -1056,7 +1067,7 @@ JSValue JSDOMWindow::removeEventListener(ExecState* exec, const ArgList& args) if (!listener.isObject()) return jsUndefined(); - impl()->removeEventListener(args.at(0).toString(exec), JSEventListener::create(asObject(listener), false).get(), args.at(2).toBoolean(exec)); + impl()->removeEventListener(args.at(0).toString(exec), JSEventListener::create(asObject(listener), false, currentWorld(exec)).get(), args.at(2).toBoolean(exec)); return jsUndefined(); } |