diff options
Diffstat (limited to 'WebCore/bindings/js/JSDOMWindowCustom.cpp')
-rw-r--r-- | WebCore/bindings/js/JSDOMWindowCustom.cpp | 843 |
1 files changed, 0 insertions, 843 deletions
diff --git a/WebCore/bindings/js/JSDOMWindowCustom.cpp b/WebCore/bindings/js/JSDOMWindowCustom.cpp deleted file mode 100644 index 5b16ff5..0000000 --- a/WebCore/bindings/js/JSDOMWindowCustom.cpp +++ /dev/null @@ -1,843 +0,0 @@ -/* - * Copyright (C) 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public License - * along with this library; see the file COPYING.LIB. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "config.h" -#include "JSDOMWindowCustom.h" - -#include "Chrome.h" -#include "DOMWindow.h" -#include "Document.h" -#include "ExceptionCode.h" -#include "FloatRect.h" -#include "Frame.h" -#include "FrameLoadRequest.h" -#include "FrameLoader.h" -#include "FrameTree.h" -#include "FrameView.h" -#include "HTMLCollection.h" -#include "HTMLDocument.h" -#include "History.h" -#include "JSAudioConstructor.h" -#include "JSDOMWindowShell.h" -#include "JSEvent.h" -#include "JSEventListener.h" -#include "JSEventSource.h" -#include "JSHTMLCollection.h" -#include "JSHistory.h" -#include "JSImageConstructor.h" -#include "JSLocation.h" -#include "JSMessageChannel.h" -#include "JSMessagePort.h" -#include "JSMessagePortCustom.h" -#include "JSOptionConstructor.h" -#include "JSWebKitCSSMatrix.h" -#include "JSWebKitPoint.h" -#include "JSWorker.h" -#include "JSXMLHttpRequest.h" -#include "JSXSLTProcessor.h" -#include "Location.h" -#include "MediaPlayer.h" -#include "MessagePort.h" -#include "NotificationCenter.h" -#include "Page.h" -#include "PlatformScreen.h" -#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> -#include <runtime/JSObject.h> -#include <runtime/PrototypeFunction.h> -#include <wtf/text/AtomicString.h> - -#if ENABLE(3D_CANVAS) || ENABLE(BLOB) -#include "JSArrayBuffer.h" -#include "JSDataView.h" -#include "JSFloat32Array.h" -#include "JSInt16Array.h" -#include "JSInt32Array.h" -#include "JSInt8Array.h" -#include "JSUint16Array.h" -#include "JSUint32Array.h" -#include "JSUint8Array.h" -#endif - -#if ENABLE(SHARED_WORKERS) -#include "JSSharedWorker.h" -#endif - -#if ENABLE(WEB_AUDIO) -#include "JSAudioContext.h" -#endif - -#if ENABLE(WEB_SOCKETS) -#include "JSWebSocket.h" -#endif - -using namespace JSC; - -namespace WebCore { - -void JSDOMWindow::markChildren(MarkStack& markStack) -{ - Base::markChildren(markStack); - - impl()->markJSEventListeners(markStack); - - JSGlobalData& globalData = *Heap::heap(this)->globalData(); - - markDOMObjectWrapper(markStack, globalData, impl()->optionalConsole()); - markDOMObjectWrapper(markStack, globalData, impl()->optionalHistory()); - markDOMObjectWrapper(markStack, globalData, impl()->optionalLocationbar()); - markDOMObjectWrapper(markStack, globalData, impl()->optionalMenubar()); - markDOMObjectWrapper(markStack, globalData, impl()->optionalNavigator()); - markDOMObjectWrapper(markStack, globalData, impl()->optionalPersonalbar()); - markDOMObjectWrapper(markStack, globalData, impl()->optionalScreen()); - markDOMObjectWrapper(markStack, globalData, impl()->optionalScrollbars()); - markDOMObjectWrapper(markStack, globalData, impl()->optionalSelection()); - markDOMObjectWrapper(markStack, globalData, impl()->optionalStatusbar()); - markDOMObjectWrapper(markStack, globalData, impl()->optionalToolbar()); - markDOMObjectWrapper(markStack, globalData, impl()->optionalLocation()); - markDOMObjectWrapper(markStack, globalData, impl()->optionalMedia()); -#if ENABLE(DOM_STORAGE) - markDOMObjectWrapper(markStack, globalData, impl()->optionalSessionStorage()); - markDOMObjectWrapper(markStack, globalData, impl()->optionalLocalStorage()); -#endif -#if ENABLE(OFFLINE_WEB_APPLICATIONS) - markDOMObjectWrapper(markStack, globalData, impl()->optionalApplicationCache()); -#endif -} - -template<NativeFunction nativeFunction, int length> -JSValue nonCachingStaticFunctionGetter(ExecState* exec, JSValue, const Identifier& propertyName) -{ - return new (exec) NativeFunctionWrapper(exec, exec->lexicalGlobalObject(), exec->lexicalGlobalObject()->prototypeFunctionStructure(), length, propertyName, nativeFunction); -} - -static JSValue childFrameGetter(ExecState* exec, JSValue slotBase, const Identifier& propertyName) -{ - return toJS(exec, static_cast<JSDOMWindow*>(asObject(slotBase))->impl()->frame()->tree()->child(identifierToAtomicString(propertyName))->domWindow()); -} - -static JSValue indexGetter(ExecState* exec, JSValue slotBase, unsigned index) -{ - return toJS(exec, static_cast<JSDOMWindow*>(asObject(slotBase))->impl()->frame()->tree()->child(index)->domWindow()); -} - -static JSValue namedItemGetter(ExecState* exec, JSValue slotBase, const Identifier& propertyName) -{ - JSDOMWindowBase* thisObj = static_cast<JSDOMWindow*>(asObject(slotBase)); - Document* document = thisObj->impl()->frame()->document(); - - ASSERT(thisObj->allowsAccessFrom(exec)); - ASSERT(document); - ASSERT(document->isHTMLDocument()); - - RefPtr<HTMLCollection> collection = document->windowNamedItems(identifierToString(propertyName)); - if (collection->length() == 1) - return toJS(exec, collection->firstItem()); - return toJS(exec, collection.get()); -} - -bool JSDOMWindow::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot) -{ - // When accessing a Window cross-domain, functions are always the native built-in ones, and they - // are not affected by properties changed on the Window or anything in its prototype chain. - // This is consistent with the behavior of Firefox. - - const HashEntry* entry; - - // We don't want any properties other than "close" and "closed" on a closed window. - if (!impl()->frame()) { - // The following code is safe for cross-domain and same domain use. - // It ignores any custom properties that might be set on the DOMWindow (including a custom prototype). - entry = s_info.propHashTable(exec)->entry(exec, propertyName); - if (entry && !(entry->attributes() & Function) && entry->propertyGetter() == jsDOMWindowClosed) { - slot.setCustom(this, entry->propertyGetter()); - return true; - } - entry = JSDOMWindowPrototype::s_info.propHashTable(exec)->entry(exec, propertyName); - if (entry && (entry->attributes() & Function) && entry->function() == jsDOMWindowPrototypeFunctionClose) { - slot.setCustom(this, nonCachingStaticFunctionGetter<jsDOMWindowPrototypeFunctionClose, 0>); - return true; - } - - // FIXME: We should have a message here that explains why the property access/function call was - // not allowed. - slot.setUndefined(); - return true; - } - - // We need to check for cross-domain access here without printing the generic warning message - // because we always allow access to some function, just different ones depending whether access - // is allowed. - String errorMessage; - bool allowsAccess = allowsAccessFrom(exec, errorMessage); - - // Look for overrides before looking at any of our own properties, but ignore overrides completely - // if this is cross-domain access. - if (allowsAccess && JSGlobalObject::getOwnPropertySlot(exec, propertyName, slot)) - return true; - - // We need this code here because otherwise JSDOMWindowBase will stop the search before we even get to the - // prototype due to the blanket same origin (allowsAccessFrom) check at the end of getOwnPropertySlot. - // Also, it's important to get the implementation straight out of the DOMWindow prototype regardless of - // what prototype is actually set on this object. - entry = JSDOMWindowPrototype::s_info.propHashTable(exec)->entry(exec, propertyName); - if (entry) { - if (entry->attributes() & Function) { - if (entry->function() == jsDOMWindowPrototypeFunctionBlur) { - if (!allowsAccess) { - slot.setCustom(this, nonCachingStaticFunctionGetter<jsDOMWindowPrototypeFunctionBlur, 0>); - return true; - } - } else if (entry->function() == jsDOMWindowPrototypeFunctionClose) { - if (!allowsAccess) { - slot.setCustom(this, nonCachingStaticFunctionGetter<jsDOMWindowPrototypeFunctionClose, 0>); - return true; - } - } else if (entry->function() == jsDOMWindowPrototypeFunctionFocus) { - if (!allowsAccess) { - slot.setCustom(this, nonCachingStaticFunctionGetter<jsDOMWindowPrototypeFunctionFocus, 0>); - return true; - } - } else if (entry->function() == jsDOMWindowPrototypeFunctionPostMessage) { - if (!allowsAccess) { - slot.setCustom(this, nonCachingStaticFunctionGetter<jsDOMWindowPrototypeFunctionPostMessage, 2>); - return true; - } - } else if (entry->function() == jsDOMWindowPrototypeFunctionShowModalDialog) { - if (!DOMWindow::canShowModalDialog(impl()->frame())) { - slot.setUndefined(); - return true; - } - } - } - } else { - // Allow access to toString() cross-domain, but always Object.prototype.toString. - if (propertyName == exec->propertyNames().toString) { - if (!allowsAccess) { - slot.setCustom(this, objectToStringFunctionGetter); - return true; - } - } - } - - entry = JSDOMWindow::s_info.propHashTable(exec)->entry(exec, propertyName); - if (entry) { - slot.setCustom(this, entry->propertyGetter()); - return true; - } - - // Check for child frames by name before built-in properties to - // match Mozilla. This does not match IE, but some sites end up - // naming frames things that conflict with window properties that - // are in Moz but not IE. Since we have some of these, we have to do - // it the Moz way. - if (impl()->frame()->tree()->child(identifierToAtomicString(propertyName))) { - slot.setCustom(this, childFrameGetter); - return true; - } - - // Do prototype lookup early so that functions and attributes in the prototype can have - // precedence over the index and name getters. - JSValue proto = prototype(); - if (proto.isObject()) { - if (asObject(proto)->getPropertySlot(exec, propertyName, slot)) { - if (!allowsAccess) { - printErrorMessage(errorMessage); - slot.setUndefined(); - } - return true; - } - } - - // FIXME: Search the whole frame hierarchy somewhere around here. - // We need to test the correct priority order. - - // allow window[1] or parent[1] etc. (#56983) - bool ok; - unsigned i = propertyName.toArrayIndex(ok); - if (ok && i < impl()->frame()->tree()->childCount()) { - slot.setCustomIndex(this, i, indexGetter); - return true; - } - - if (!allowsAccess) { - printErrorMessage(errorMessage); - slot.setUndefined(); - return true; - } - - // Allow shortcuts like 'Image1' instead of document.images.Image1 - Document* document = impl()->frame()->document(); - if (document->isHTMLDocument()) { - AtomicStringImpl* atomicPropertyName = findAtomicString(propertyName); - if (atomicPropertyName && (static_cast<HTMLDocument*>(document)->hasNamedItem(atomicPropertyName) || document->hasElementWithId(atomicPropertyName))) { - slot.setCustom(this, namedItemGetter); - return true; - } - } - - return Base::getOwnPropertySlot(exec, propertyName, slot); -} - -bool JSDOMWindow::getOwnPropertyDescriptor(ExecState* exec, const Identifier& propertyName, PropertyDescriptor& descriptor) -{ - // Never allow cross-domain getOwnPropertyDescriptor - if (!allowsAccessFrom(exec)) - return false; - - const HashEntry* entry; - - // We don't want any properties other than "close" and "closed" on a closed window. - if (!impl()->frame()) { - // The following code is safe for cross-domain and same domain use. - // It ignores any custom properties that might be set on the DOMWindow (including a custom prototype). - entry = s_info.propHashTable(exec)->entry(exec, propertyName); - if (entry && !(entry->attributes() & Function) && entry->propertyGetter() == jsDOMWindowClosed) { - descriptor.setDescriptor(jsBoolean(true), ReadOnly | DontDelete | DontEnum); - return true; - } - entry = JSDOMWindowPrototype::s_info.propHashTable(exec)->entry(exec, propertyName); - if (entry && (entry->attributes() & Function) && entry->function() == jsDOMWindowPrototypeFunctionClose) { - PropertySlot slot; - slot.setCustom(this, nonCachingStaticFunctionGetter<jsDOMWindowPrototypeFunctionClose, 0>); - descriptor.setDescriptor(slot.getValue(exec, propertyName), ReadOnly | DontDelete | DontEnum); - return true; - } - descriptor.setUndefined(); - return true; - } - - entry = JSDOMWindow::s_info.propHashTable(exec)->entry(exec, propertyName); - if (entry) { - PropertySlot slot; - slot.setCustom(this, entry->propertyGetter()); - descriptor.setDescriptor(slot.getValue(exec, propertyName), entry->attributes()); - return true; - } - - // Check for child frames by name before built-in properties to - // match Mozilla. This does not match IE, but some sites end up - // naming frames things that conflict with window properties that - // are in Moz but not IE. Since we have some of these, we have to do - // it the Moz way. - if (impl()->frame()->tree()->child(identifierToAtomicString(propertyName))) { - PropertySlot slot; - slot.setCustom(this, childFrameGetter); - descriptor.setDescriptor(slot.getValue(exec, propertyName), ReadOnly | DontDelete | DontEnum); - return true; - } - - bool ok; - unsigned i = propertyName.toArrayIndex(ok); - if (ok && i < impl()->frame()->tree()->childCount()) { - PropertySlot slot; - slot.setCustomIndex(this, i, indexGetter); - descriptor.setDescriptor(slot.getValue(exec, propertyName), ReadOnly | DontDelete | DontEnum); - return true; - } - - // Allow shortcuts like 'Image1' instead of document.images.Image1 - Document* document = impl()->frame()->document(); - if (document->isHTMLDocument()) { - AtomicStringImpl* atomicPropertyName = findAtomicString(propertyName); - if (atomicPropertyName && (static_cast<HTMLDocument*>(document)->hasNamedItem(atomicPropertyName) || document->hasElementWithId(atomicPropertyName))) { - PropertySlot slot; - slot.setCustom(this, namedItemGetter); - descriptor.setDescriptor(slot.getValue(exec, propertyName), ReadOnly | DontDelete | DontEnum); - return true; - } - } - - return Base::getOwnPropertyDescriptor(exec, propertyName, descriptor); -} - -void JSDOMWindow::put(ExecState* exec, const Identifier& propertyName, JSValue value, PutPropertySlot& slot) -{ - if (!impl()->frame()) - return; - - // Optimization: access JavaScript global variables directly before involving the DOM. - if (JSGlobalObject::hasOwnPropertyForWrite(exec, propertyName)) { - if (allowsAccessFrom(exec)) - JSGlobalObject::put(exec, propertyName, value, slot); - return; - } - - if (lookupPut<JSDOMWindow>(exec, propertyName, value, s_info.propHashTable(exec), this)) - return; - - if (allowsAccessFrom(exec)) - Base::put(exec, propertyName, value, slot); -} - -bool JSDOMWindow::deleteProperty(ExecState* exec, const Identifier& propertyName) -{ - // Only allow deleting properties by frames in the same origin. - if (!allowsAccessFrom(exec)) - return false; - return Base::deleteProperty(exec, propertyName); -} - -void JSDOMWindow::getPropertyNames(ExecState* exec, PropertyNameArray& propertyNames, EnumerationMode mode) -{ - // Only allow the window to enumerated by frames in the same origin. - if (!allowsAccessFrom(exec)) - return; - Base::getPropertyNames(exec, propertyNames, mode); -} - -void JSDOMWindow::getOwnPropertyNames(ExecState* exec, PropertyNameArray& propertyNames, EnumerationMode mode) -{ - // Only allow the window to enumerated by frames in the same origin. - if (!allowsAccessFrom(exec)) - return; - Base::getOwnPropertyNames(exec, propertyNames, mode); -} - -void JSDOMWindow::defineGetter(ExecState* exec, const Identifier& propertyName, JSObject* getterFunction, unsigned attributes) -{ - // Only allow defining getters by frames in the same origin. - if (!allowsAccessFrom(exec)) - return; - - // Don't allow shadowing location using defineGetter. - if (propertyName == "location") - return; - - Base::defineGetter(exec, propertyName, getterFunction, attributes); -} - -void JSDOMWindow::defineSetter(ExecState* exec, const Identifier& propertyName, JSObject* setterFunction, unsigned attributes) -{ - // Only allow defining setters by frames in the same origin. - if (!allowsAccessFrom(exec)) - return; - Base::defineSetter(exec, propertyName, setterFunction, attributes); -} - -bool JSDOMWindow::defineOwnProperty(JSC::ExecState* exec, const JSC::Identifier& propertyName, JSC::PropertyDescriptor& descriptor, bool shouldThrow) -{ - // Only allow defining properties in this way by frames in the same origin, as it allows setters to be introduced. - if (!allowsAccessFrom(exec)) - return false; - return Base::defineOwnProperty(exec, propertyName, descriptor, shouldThrow); -} - -JSValue JSDOMWindow::lookupGetter(ExecState* exec, const Identifier& propertyName) -{ - // Only allow looking-up getters by frames in the same origin. - if (!allowsAccessFrom(exec)) - return jsUndefined(); - return Base::lookupGetter(exec, propertyName); -} - -JSValue JSDOMWindow::lookupSetter(ExecState* exec, const Identifier& propertyName) -{ - // Only allow looking-up setters by frames in the same origin. - if (!allowsAccessFrom(exec)) - return jsUndefined(); - return Base::lookupSetter(exec, propertyName); -} - -// Custom Attributes - -JSValue JSDOMWindow::history(ExecState* exec) const -{ - History* history = impl()->history(); - if (DOMObject* wrapper = getCachedDOMObjectWrapper(exec, history)) - return wrapper; - - JSDOMWindow* window = const_cast<JSDOMWindow*>(this); - JSHistory* jsHistory = new (exec) JSHistory(getDOMStructure<JSHistory>(exec, window), window, history); - cacheDOMObjectWrapper(exec, history, jsHistory); - return jsHistory; -} - -JSValue JSDOMWindow::location(ExecState* exec) const -{ - Location* location = impl()->location(); - if (DOMObject* wrapper = getCachedDOMObjectWrapper(exec, location)) - return wrapper; - - JSDOMWindow* window = const_cast<JSDOMWindow*>(this); - JSLocation* jsLocation = new (exec) JSLocation(getDOMStructure<JSLocation>(exec, window), window, location); - cacheDOMObjectWrapper(exec, location, jsLocation); - return jsLocation; -} - -void JSDOMWindow::setLocation(ExecState* exec, JSValue value) -{ - DOMWindow* activeWindow = asJSDOMWindow(exec->lexicalGlobalObject())->impl(); - DOMWindow* firstWindow = asJSDOMWindow(exec->dynamicGlobalObject())->impl(); - -#if ENABLE(DASHBOARD_SUPPORT) - // To avoid breaking old widgets, make "var location =" in a top-level frame create - // a property named "location" instead of performing a navigation (<rdar://problem/5688039>). - if (Frame* activeFrame = activeWindow->frame()) { - if (Settings* settings = activeFrame->settings()) { - if (settings->usesDashboardBackwardCompatibilityMode() && !activeFrame->tree()->parent()) { - if (allowsAccessFrom(exec)) - putDirect(Identifier(exec, "location"), value); - return; - } - } - } -#endif - - UString locationString = value.toString(exec); - if (exec->hadException()) - return; - - impl()->setLocation(ustringToString(locationString), activeWindow, firstWindow); -} - -JSValue JSDOMWindow::crypto(ExecState*) const -{ - return jsUndefined(); -} - -JSValue JSDOMWindow::event(ExecState* exec) const -{ - Event* event = currentEvent(); - if (!event) - return jsUndefined(); - return toJS(exec, event); -} - -#if ENABLE(EVENTSOURCE) -JSValue JSDOMWindow::eventSource(ExecState* exec) const -{ - return getDOMConstructor<JSEventSourceConstructor>(exec, this); -} -#endif - -JSValue JSDOMWindow::image(ExecState* exec) const -{ - return getDOMConstructor<JSImageConstructor>(exec, this); -} - -JSValue JSDOMWindow::option(ExecState* exec) const -{ - return getDOMConstructor<JSOptionConstructor>(exec, this); -} - -#if ENABLE(VIDEO) -JSValue JSDOMWindow::audio(ExecState* exec) const -{ - if (!MediaPlayer::isAvailable()) - return jsUndefined(); - return getDOMConstructor<JSAudioConstructor>(exec, this); -} -#endif - -JSValue JSDOMWindow::webKitPoint(ExecState* exec) const -{ - return getDOMConstructor<JSWebKitPointConstructor>(exec, this); -} - -JSValue JSDOMWindow::webKitCSSMatrix(ExecState* exec) const -{ - return getDOMConstructor<JSWebKitCSSMatrixConstructor>(exec, this); -} - -#if ENABLE(3D_CANVAS) || ENABLE(BLOB) -JSValue JSDOMWindow::arrayBuffer(ExecState* exec) const -{ - return getDOMConstructor<JSArrayBufferConstructor>(exec, this); -} - -JSValue JSDOMWindow::int8Array(ExecState* exec) const -{ - return getDOMConstructor<JSInt8ArrayConstructor>(exec, this); -} - -JSValue JSDOMWindow::uint8Array(ExecState* exec) const -{ - return getDOMConstructor<JSUint8ArrayConstructor>(exec, this); -} - -JSValue JSDOMWindow::int32Array(ExecState* exec) const -{ - return getDOMConstructor<JSInt32ArrayConstructor>(exec, this); -} - -JSValue JSDOMWindow::uint32Array(ExecState* exec) const -{ - return getDOMConstructor<JSUint32ArrayConstructor>(exec, this); -} - -JSValue JSDOMWindow::int16Array(ExecState* exec) const -{ - return getDOMConstructor<JSInt16ArrayConstructor>(exec, this); -} - -JSValue JSDOMWindow::uint16Array(ExecState* exec) const -{ - return getDOMConstructor<JSUint16ArrayConstructor>(exec, this); -} - -JSValue JSDOMWindow::float32Array(ExecState* exec) const -{ - return getDOMConstructor<JSFloat32ArrayConstructor>(exec, this); -} - -JSValue JSDOMWindow::dataView(ExecState* exec) const -{ - return getDOMConstructor<JSDataViewConstructor>(exec, this); -} -#endif - -JSValue JSDOMWindow::xmlHttpRequest(ExecState* exec) const -{ - return getDOMConstructor<JSXMLHttpRequestConstructor>(exec, this); -} - -#if ENABLE(XSLT) -JSValue JSDOMWindow::xsltProcessor(ExecState* exec) const -{ - return getDOMConstructor<JSXSLTProcessorConstructor>(exec, this); -} -#endif - -#if ENABLE(CHANNEL_MESSAGING) -JSValue JSDOMWindow::messageChannel(ExecState* exec) const -{ - return getDOMConstructor<JSMessageChannelConstructor>(exec, this); -} -#endif - -#if ENABLE(WORKERS) -JSValue JSDOMWindow::worker(ExecState* exec) const -{ - return getDOMConstructor<JSWorkerConstructor>(exec, this); -} -#endif - -#if ENABLE(SHARED_WORKERS) -JSValue JSDOMWindow::sharedWorker(ExecState* exec) const -{ - if (SharedWorkerRepository::isAvailable()) - return getDOMConstructor<JSSharedWorkerConstructor>(exec, this); - return jsUndefined(); -} -#endif - -#if ENABLE(WEB_AUDIO) -JSValue JSDOMWindow::webkitAudioContext(ExecState* exec) const -{ - return getDOMConstructor<JSAudioContextConstructor>(exec, this); -} -#endif - -#if ENABLE(WEB_SOCKETS) -JSValue JSDOMWindow::webSocket(ExecState* exec) const -{ - Frame* frame = impl()->frame(); - if (!frame) - return jsUndefined(); - Settings* settings = frame->settings(); - if (!settings) - return jsUndefined(); - return getDOMConstructor<JSWebSocketConstructor>(exec, this); -} -#endif - -// Custom functions - -JSValue JSDOMWindow::open(ExecState* exec) -{ - DOMWindow* activeWindow = asJSDOMWindow(exec->lexicalGlobalObject())->impl(); - DOMWindow* firstWindow = asJSDOMWindow(exec->dynamicGlobalObject())->impl(); - - String urlString = valueToStringWithUndefinedOrNullCheck(exec, exec->argument(0)); - if (exec->hadException()) - return jsUndefined(); - AtomicString frameName = exec->argument(1).isUndefinedOrNull() ? "_blank" : ustringToAtomicString(exec->argument(1).toString(exec)); - if (exec->hadException()) - return jsUndefined(); - String windowFeaturesString = valueToStringWithUndefinedOrNullCheck(exec, exec->argument(2)); - if (exec->hadException()) - return jsUndefined(); - - RefPtr<DOMWindow> openedWindow = impl()->open(urlString, frameName, windowFeaturesString, activeWindow, firstWindow); - if (!openedWindow) - return jsUndefined(); - return toJS(exec, openedWindow.get()); -} - -class DialogHandler { -public: - explicit DialogHandler(ExecState* exec) - : m_exec(exec) - , m_globalObject(0) - { - } - - void dialogCreated(DOMWindow*); - JSValue returnValue() const; - -private: - ExecState* m_exec; - JSDOMWindow* m_globalObject; -}; - -inline void DialogHandler::dialogCreated(DOMWindow* dialog) -{ - m_globalObject = toJSDOMWindow(dialog->frame(), normalWorld(m_exec->globalData())); - if (JSValue dialogArguments = m_exec->argument(1)) - m_globalObject->putDirect(Identifier(m_exec, "dialogArguments"), dialogArguments); -} - -inline JSValue DialogHandler::returnValue() const -{ - if (!m_globalObject) - return jsUndefined(); - Identifier identifier(m_exec, "returnValue"); - PropertySlot slot; - if (!m_globalObject->JSGlobalObject::getOwnPropertySlot(m_exec, identifier, slot)) - return jsUndefined(); - return slot.getValue(m_exec, identifier); -} - -static void setUpDialog(DOMWindow* dialog, void* context) -{ - static_cast<DialogHandler*>(context)->dialogCreated(dialog); -} - -JSValue JSDOMWindow::showModalDialog(ExecState* exec) -{ - DOMWindow* activeWindow = asJSDOMWindow(exec->lexicalGlobalObject())->impl(); - DOMWindow* firstWindow = asJSDOMWindow(exec->dynamicGlobalObject())->impl(); - - String urlString = valueToStringWithUndefinedOrNullCheck(exec, exec->argument(0)); - if (exec->hadException()) - return jsUndefined(); - String dialogFeaturesString = valueToStringWithUndefinedOrNullCheck(exec, exec->argument(2)); - if (exec->hadException()) - return jsUndefined(); - - DialogHandler handler(exec); - - impl()->showModalDialog(urlString, dialogFeaturesString, activeWindow, firstWindow, setUpDialog, &handler); - - return handler.returnValue(); -} - -JSValue JSDOMWindow::postMessage(ExecState* exec) -{ - DOMWindow* activeWindow = asJSDOMWindow(exec->lexicalGlobalObject())->impl(); - - PassRefPtr<SerializedScriptValue> message = SerializedScriptValue::create(exec, exec->argument(0)); - - if (exec->hadException()) - return jsUndefined(); - - MessagePortArray messagePorts; - if (exec->argumentCount() > 2) - fillMessagePortArray(exec, exec->argument(1), messagePorts); - if (exec->hadException()) - return jsUndefined(); - - String targetOrigin = valueToStringWithUndefinedOrNullCheck(exec, exec->argument((exec->argumentCount() == 2) ? 1 : 2)); - if (exec->hadException()) - return jsUndefined(); - - ExceptionCode ec = 0; - impl()->postMessage(message, &messagePorts, targetOrigin, activeWindow, ec); - setDOMException(exec, ec); - - return jsUndefined(); -} - -JSValue JSDOMWindow::setTimeout(ExecState* exec) -{ - OwnPtr<ScheduledAction> action = ScheduledAction::create(exec, currentWorld(exec)); - if (exec->hadException()) - return jsUndefined(); - int delay = exec->argument(1).toInt32(exec); - - ExceptionCode ec = 0; - int result = impl()->setTimeout(action.release(), delay, ec); - setDOMException(exec, ec); - - return jsNumber(result); -} - -JSValue JSDOMWindow::setInterval(ExecState* exec) -{ - OwnPtr<ScheduledAction> action = ScheduledAction::create(exec, currentWorld(exec)); - if (exec->hadException()) - return jsUndefined(); - int delay = exec->argument(1).toInt32(exec); - - ExceptionCode ec = 0; - int result = impl()->setInterval(action.release(), delay, ec); - setDOMException(exec, ec); - - return jsNumber(result); -} - -JSValue JSDOMWindow::addEventListener(ExecState* exec) -{ - Frame* frame = impl()->frame(); - if (!frame) - return jsUndefined(); - - JSValue listener = exec->argument(1); - if (!listener.isObject()) - return jsUndefined(); - - impl()->addEventListener(ustringToAtomicString(exec->argument(0).toString(exec)), JSEventListener::create(asObject(listener), this, false, currentWorld(exec)), exec->argument(2).toBoolean(exec)); - return jsUndefined(); -} - -JSValue JSDOMWindow::removeEventListener(ExecState* exec) -{ - Frame* frame = impl()->frame(); - if (!frame) - return jsUndefined(); - - JSValue listener = exec->argument(1); - if (!listener.isObject()) - return jsUndefined(); - - impl()->removeEventListener(ustringToAtomicString(exec->argument(0).toString(exec)), JSEventListener::create(asObject(listener), this, false, currentWorld(exec)).get(), exec->argument(2).toBoolean(exec)); - return jsUndefined(); -} - -DOMWindow* toDOMWindow(JSValue value) -{ - if (!value.isObject()) - return 0; - JSObject* object = asObject(value); - if (object->inherits(&JSDOMWindow::s_info)) - return static_cast<JSDOMWindow*>(object)->impl(); - if (object->inherits(&JSDOMWindowShell::s_info)) - return static_cast<JSDOMWindowShell*>(object)->impl(); - return 0; -} - -} // namespace WebCore |