18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
2f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * Copyright (C) 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSDOMWindowCustom.h"
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Frame.h"
240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "HTMLCollection.h"
250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "HTMLDocument.h"
265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "History.h"
272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "JSArrayBuffer.h"
285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "JSAudioConstructor.h"
292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "JSDataView.h"
305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "JSEvent.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSEventListener.h"
3206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "JSEventSource.h"
332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "JSFloat32Array.h"
3437da970a4978c0729b6a37c13d0ebc6a17c6d573Ben Murdoch#include "JSFloat64Array.h"
350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "JSHTMLCollection.h"
365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "JSHistory.h"
375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "JSImageConstructor.h"
382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "JSInt16Array.h"
392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "JSInt32Array.h"
402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "JSInt8Array.h"
415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "JSLocation.h"
4206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "JSMessageChannel.h"
43231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "JSMessagePortCustom.h"
445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "JSOptionConstructor.h"
452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "JSUint16Array.h"
462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "JSUint32Array.h"
472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "JSUint8Array.h"
4806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "JSWebKitCSSMatrix.h"
4906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "JSWebKitPoint.h"
5006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "JSWorker.h"
51545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include "JSXMLHttpRequest.h"
5206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "JSXSLTProcessor.h"
535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "Location.h"
545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "MediaPlayer.h"
555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "ScheduledAction.h"
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Settings.h"
57231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "SharedWorkerRepository.h"
58231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <runtime/JSFunction.h>
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
60f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if ENABLE(SHARED_WORKERS)
61f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "JSSharedWorker.h"
62f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif
63f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
64f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if ENABLE(WEB_AUDIO)
65f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "JSAudioContext.h"
66f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif
67f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
68f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if ENABLE(WEB_SOCKETS)
69f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "JSWebSocket.h"
70f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif
71f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace JSC;
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid JSDOMWindow::markChildren(MarkStack& markStack)
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Base::markChildren(markStack);
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
808a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    impl()->markJSEventListeners(markStack);
815f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JSGlobalData& globalData = *Heap::heap(this)->globalData();
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    markDOMObjectWrapper(markStack, globalData, impl()->optionalConsole());
850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    markDOMObjectWrapper(markStack, globalData, impl()->optionalHistory());
860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    markDOMObjectWrapper(markStack, globalData, impl()->optionalLocationbar());
870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    markDOMObjectWrapper(markStack, globalData, impl()->optionalMenubar());
880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    markDOMObjectWrapper(markStack, globalData, impl()->optionalNavigator());
890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    markDOMObjectWrapper(markStack, globalData, impl()->optionalPersonalbar());
900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    markDOMObjectWrapper(markStack, globalData, impl()->optionalScreen());
910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    markDOMObjectWrapper(markStack, globalData, impl()->optionalScrollbars());
920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    markDOMObjectWrapper(markStack, globalData, impl()->optionalSelection());
930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    markDOMObjectWrapper(markStack, globalData, impl()->optionalStatusbar());
940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    markDOMObjectWrapper(markStack, globalData, impl()->optionalToolbar());
950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    markDOMObjectWrapper(markStack, globalData, impl()->optionalLocation());
96d0825bca7fe65beaee391d30da42e937db621564Steve Block    markDOMObjectWrapper(markStack, globalData, impl()->optionalMedia());
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DOM_STORAGE)
980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    markDOMObjectWrapper(markStack, globalData, impl()->optionalSessionStorage());
990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    markDOMObjectWrapper(markStack, globalData, impl()->optionalLocalStorage());
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(OFFLINE_WEB_APPLICATIONS)
1020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    markDOMObjectWrapper(markStack, globalData, impl()->optionalApplicationCache());
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochtemplate<NativeFunction nativeFunction, int length>
107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockJSValue nonCachingStaticFunctionGetter(ExecState* exec, JSValue, const Identifier& propertyName)
1080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
10981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return new (exec) JSFunction(exec, exec->lexicalGlobalObject(), exec->lexicalGlobalObject()->functionStructure(), length, propertyName, nativeFunction);
1100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
112dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic JSValue childFrameGetter(ExecState* exec, JSValue slotBase, const Identifier& propertyName)
1130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
114dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return toJS(exec, static_cast<JSDOMWindow*>(asObject(slotBase))->impl()->frame()->tree()->child(identifierToAtomicString(propertyName))->domWindow());
1150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
117dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic JSValue indexGetter(ExecState* exec, JSValue slotBase, unsigned index)
1180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
119dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return toJS(exec, static_cast<JSDOMWindow*>(asObject(slotBase))->impl()->frame()->tree()->child(index)->domWindow());
1200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
122dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic JSValue namedItemGetter(ExecState* exec, JSValue slotBase, const Identifier& propertyName)
1230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
124dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    JSDOMWindowBase* thisObj = static_cast<JSDOMWindow*>(asObject(slotBase));
1250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Document* document = thisObj->impl()->frame()->document();
1260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(thisObj->allowsAccessFrom(exec));
1280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(document);
1290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(document->isHTMLDocument());
1300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
131dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    RefPtr<HTMLCollection> collection = document->windowNamedItems(identifierToString(propertyName));
1320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (collection->length() == 1)
1330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return toJS(exec, collection->firstItem());
1340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return toJS(exec, collection.get());
1350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool JSDOMWindow::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot)
1380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
1390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // When accessing a Window cross-domain, functions are always the native built-in ones, and they
1400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // are not affected by properties changed on the Window or anything in its prototype chain.
1410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // This is consistent with the behavior of Firefox.
1420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    const HashEntry* entry;
1440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // We don't want any properties other than "close" and "closed" on a closed window.
1460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!impl()->frame()) {
1470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // The following code is safe for cross-domain and same domain use.
1480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // It ignores any custom properties that might be set on the DOMWindow (including a custom prototype).
1490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        entry = s_info.propHashTable(exec)->entry(exec, propertyName);
1500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (entry && !(entry->attributes() & Function) && entry->propertyGetter() == jsDOMWindowClosed) {
1510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            slot.setCustom(this, entry->propertyGetter());
1520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return true;
1530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
1540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        entry = JSDOMWindowPrototype::s_info.propHashTable(exec)->entry(exec, propertyName);
1550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (entry && (entry->attributes() & Function) && entry->function() == jsDOMWindowPrototypeFunctionClose) {
1560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            slot.setCustom(this, nonCachingStaticFunctionGetter<jsDOMWindowPrototypeFunctionClose, 0>);
1570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return true;
1580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
1590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // FIXME: We should have a message here that explains why the property access/function call was
1610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // not allowed.
1620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        slot.setUndefined();
1630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return true;
1640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
1650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // We need to check for cross-domain access here without printing the generic warning message
1670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // because we always allow access to some function, just different ones depending whether access
1680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // is allowed.
1690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    String errorMessage;
1700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    bool allowsAccess = allowsAccessFrom(exec, errorMessage);
1710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Look for overrides before looking at any of our own properties, but ignore overrides completely
1730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // if this is cross-domain access.
1740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (allowsAccess && JSGlobalObject::getOwnPropertySlot(exec, propertyName, slot))
1750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return true;
1760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // We need this code here because otherwise JSDOMWindowBase will stop the search before we even get to the
1780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // prototype due to the blanket same origin (allowsAccessFrom) check at the end of getOwnPropertySlot.
1790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Also, it's important to get the implementation straight out of the DOMWindow prototype regardless of
1800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // what prototype is actually set on this object.
1810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    entry = JSDOMWindowPrototype::s_info.propHashTable(exec)->entry(exec, propertyName);
1820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (entry) {
1830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (entry->attributes() & Function) {
1840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (entry->function() == jsDOMWindowPrototypeFunctionBlur) {
1850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                if (!allowsAccess) {
1860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    slot.setCustom(this, nonCachingStaticFunctionGetter<jsDOMWindowPrototypeFunctionBlur, 0>);
1870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    return true;
1880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                }
1890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            } else if (entry->function() == jsDOMWindowPrototypeFunctionClose) {
1900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                if (!allowsAccess) {
1910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    slot.setCustom(this, nonCachingStaticFunctionGetter<jsDOMWindowPrototypeFunctionClose, 0>);
1920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    return true;
1930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                }
1940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            } else if (entry->function() == jsDOMWindowPrototypeFunctionFocus) {
1950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                if (!allowsAccess) {
1960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    slot.setCustom(this, nonCachingStaticFunctionGetter<jsDOMWindowPrototypeFunctionFocus, 0>);
1970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    return true;
1980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                }
1990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            } else if (entry->function() == jsDOMWindowPrototypeFunctionPostMessage) {
2000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                if (!allowsAccess) {
2010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    slot.setCustom(this, nonCachingStaticFunctionGetter<jsDOMWindowPrototypeFunctionPostMessage, 2>);
2020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    return true;
2030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                }
2040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            } else if (entry->function() == jsDOMWindowPrototypeFunctionShowModalDialog) {
2050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                if (!DOMWindow::canShowModalDialog(impl()->frame())) {
2060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    slot.setUndefined();
2070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    return true;
2080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                }
2090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            }
2100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
2110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    } else {
2120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Allow access to toString() cross-domain, but always Object.prototype.toString.
2130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (propertyName == exec->propertyNames().toString) {
2140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (!allowsAccess) {
2150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                slot.setCustom(this, objectToStringFunctionGetter);
2160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                return true;
2170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            }
2180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
2190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
2200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    entry = JSDOMWindow::s_info.propHashTable(exec)->entry(exec, propertyName);
2220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (entry) {
2230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        slot.setCustom(this, entry->propertyGetter());
2240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return true;
2250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
2260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Check for child frames by name before built-in properties to
2280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // match Mozilla. This does not match IE, but some sites end up
2290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // naming frames things that conflict with window properties that
2300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // are in Moz but not IE. Since we have some of these, we have to do
2310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // it the Moz way.
232dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (impl()->frame()->tree()->child(identifierToAtomicString(propertyName))) {
2330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        slot.setCustom(this, childFrameGetter);
2340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return true;
2350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
2360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Do prototype lookup early so that functions and attributes in the prototype can have
2380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // precedence over the index and name getters.
2390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSValue proto = prototype();
2400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (proto.isObject()) {
2410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (asObject(proto)->getPropertySlot(exec, propertyName, slot)) {
2420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (!allowsAccess) {
2430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                printErrorMessage(errorMessage);
2440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                slot.setUndefined();
2450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            }
2460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return true;
2470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
2480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
2490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
250d0825bca7fe65beaee391d30da42e937db621564Steve Block    // FIXME: Search the whole frame hierarchy somewhere around here.
2510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // We need to test the correct priority order.
2520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // allow window[1] or parent[1] etc. (#56983)
2540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    bool ok;
255f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    unsigned i = propertyName.toArrayIndex(ok);
2560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (ok && i < impl()->frame()->tree()->childCount()) {
2570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        slot.setCustomIndex(this, i, indexGetter);
2580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return true;
2590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
2600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!allowsAccess) {
2620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        printErrorMessage(errorMessage);
2630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        slot.setUndefined();
2640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return true;
2650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
2660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Allow shortcuts like 'Image1' instead of document.images.Image1
2680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Document* document = impl()->frame()->document();
2690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (document->isHTMLDocument()) {
270dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        AtomicStringImpl* atomicPropertyName = findAtomicString(propertyName);
2710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (atomicPropertyName && (static_cast<HTMLDocument*>(document)->hasNamedItem(atomicPropertyName) || document->hasElementWithId(atomicPropertyName))) {
2720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            slot.setCustom(this, namedItemGetter);
2730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return true;
2740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
2750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
2760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return Base::getOwnPropertySlot(exec, propertyName, slot);
2780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
2790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
280231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool JSDOMWindow::getOwnPropertyDescriptor(ExecState* exec, const Identifier& propertyName, PropertyDescriptor& descriptor)
281231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
282643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Never allow cross-domain getOwnPropertyDescriptor
283643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!allowsAccessFrom(exec))
284643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return false;
285643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
286231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    const HashEntry* entry;
287231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
288231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // We don't want any properties other than "close" and "closed" on a closed window.
289231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!impl()->frame()) {
290231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // The following code is safe for cross-domain and same domain use.
291231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // It ignores any custom properties that might be set on the DOMWindow (including a custom prototype).
292231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        entry = s_info.propHashTable(exec)->entry(exec, propertyName);
293231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (entry && !(entry->attributes() & Function) && entry->propertyGetter() == jsDOMWindowClosed) {
294231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            descriptor.setDescriptor(jsBoolean(true), ReadOnly | DontDelete | DontEnum);
295231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            return true;
296231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
297231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        entry = JSDOMWindowPrototype::s_info.propHashTable(exec)->entry(exec, propertyName);
298231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (entry && (entry->attributes() & Function) && entry->function() == jsDOMWindowPrototypeFunctionClose) {
299231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            PropertySlot slot;
300231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            slot.setCustom(this, nonCachingStaticFunctionGetter<jsDOMWindowPrototypeFunctionClose, 0>);
301231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            descriptor.setDescriptor(slot.getValue(exec, propertyName), ReadOnly | DontDelete | DontEnum);
302231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            return true;
303231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
304231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        descriptor.setUndefined();
305231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return true;
306231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
307231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
308231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    entry = JSDOMWindow::s_info.propHashTable(exec)->entry(exec, propertyName);
309231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (entry) {
310231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        PropertySlot slot;
311231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        slot.setCustom(this, entry->propertyGetter());
312231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        descriptor.setDescriptor(slot.getValue(exec, propertyName), entry->attributes());
313231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return true;
314231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
315231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
316231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // Check for child frames by name before built-in properties to
317231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // match Mozilla. This does not match IE, but some sites end up
318231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // naming frames things that conflict with window properties that
319231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // are in Moz but not IE. Since we have some of these, we have to do
320231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // it the Moz way.
321dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (impl()->frame()->tree()->child(identifierToAtomicString(propertyName))) {
322231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        PropertySlot slot;
323231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        slot.setCustom(this, childFrameGetter);
324231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        descriptor.setDescriptor(slot.getValue(exec, propertyName), ReadOnly | DontDelete | DontEnum);
325231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return true;
326231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
327231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
328231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    bool ok;
329f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    unsigned i = propertyName.toArrayIndex(ok);
330231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (ok && i < impl()->frame()->tree()->childCount()) {
331231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        PropertySlot slot;
332231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        slot.setCustomIndex(this, i, indexGetter);
333231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        descriptor.setDescriptor(slot.getValue(exec, propertyName), ReadOnly | DontDelete | DontEnum);
334231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return true;
335231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
336231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
337231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // Allow shortcuts like 'Image1' instead of document.images.Image1
338231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Document* document = impl()->frame()->document();
339231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (document->isHTMLDocument()) {
340dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        AtomicStringImpl* atomicPropertyName = findAtomicString(propertyName);
341231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (atomicPropertyName && (static_cast<HTMLDocument*>(document)->hasNamedItem(atomicPropertyName) || document->hasElementWithId(atomicPropertyName))) {
342231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            PropertySlot slot;
343231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            slot.setCustom(this, namedItemGetter);
344231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            descriptor.setDescriptor(slot.getValue(exec, propertyName), ReadOnly | DontDelete | DontEnum);
345231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            return true;
346231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
347231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
348231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
349231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return Base::getOwnPropertyDescriptor(exec, propertyName, descriptor);
350231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
351231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
3520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid JSDOMWindow::put(ExecState* exec, const Identifier& propertyName, JSValue value, PutPropertySlot& slot)
3530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
3540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!impl()->frame())
3550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
3560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Optimization: access JavaScript global variables directly before involving the DOM.
3580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (JSGlobalObject::hasOwnPropertyForWrite(exec, propertyName)) {
3590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (allowsAccessFrom(exec))
3600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            JSGlobalObject::put(exec, propertyName, value, slot);
3610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
3620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
3630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (lookupPut<JSDOMWindow>(exec, propertyName, value, s_info.propHashTable(exec), this))
3650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
3660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (allowsAccessFrom(exec))
3680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        Base::put(exec, propertyName, value, slot);
3690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
3700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool JSDOMWindow::deleteProperty(ExecState* exec, const Identifier& propertyName)
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Only allow deleting properties by frames in the same origin.
3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!allowsAccessFrom(exec))
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return Base::deleteProperty(exec, propertyName);
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
379d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid JSDOMWindow::getPropertyNames(ExecState* exec, PropertyNameArray& propertyNames, EnumerationMode mode)
3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Only allow the window to enumerated by frames in the same origin.
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!allowsAccessFrom(exec))
3830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
384d0825bca7fe65beaee391d30da42e937db621564Steve Block    Base::getPropertyNames(exec, propertyNames, mode);
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
387d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid JSDOMWindow::getOwnPropertyNames(ExecState* exec, PropertyNameArray& propertyNames, EnumerationMode mode)
388231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
389231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // Only allow the window to enumerated by frames in the same origin.
390231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!allowsAccessFrom(exec))
391231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
392d0825bca7fe65beaee391d30da42e937db621564Steve Block    Base::getOwnPropertyNames(exec, propertyNames, mode);
393231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
394231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
395231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid JSDOMWindow::defineGetter(ExecState* exec, const Identifier& propertyName, JSObject* getterFunction, unsigned attributes)
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Only allow defining getters by frames in the same origin.
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!allowsAccessFrom(exec))
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
4005f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
4015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // Don't allow shadowing location using defineGetter.
4025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (propertyName == "location")
4035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return;
4045f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
405231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Base::defineGetter(exec, propertyName, getterFunction, attributes);
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
408231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid JSDOMWindow::defineSetter(ExecState* exec, const Identifier& propertyName, JSObject* setterFunction, unsigned attributes)
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Only allow defining setters by frames in the same origin.
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!allowsAccessFrom(exec))
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
413231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Base::defineSetter(exec, propertyName, setterFunction, attributes);
414231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
415231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
416231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool JSDOMWindow::defineOwnProperty(JSC::ExecState* exec, const JSC::Identifier& propertyName, JSC::PropertyDescriptor& descriptor, bool shouldThrow)
417231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
418231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // Only allow defining properties in this way by frames in the same origin, as it allows setters to be introduced.
419231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!allowsAccessFrom(exec))
420231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return false;
421231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return Base::defineOwnProperty(exec, propertyName, descriptor, shouldThrow);
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4245f1ab04193ad0130ca8204aadaceae083aca9881Feng QianJSValue JSDOMWindow::lookupGetter(ExecState* exec, const Identifier& propertyName)
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Only allow looking-up getters by frames in the same origin.
4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!allowsAccessFrom(exec))
4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return jsUndefined();
4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return Base::lookupGetter(exec, propertyName);
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4325f1ab04193ad0130ca8204aadaceae083aca9881Feng QianJSValue JSDOMWindow::lookupSetter(ExecState* exec, const Identifier& propertyName)
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Only allow looking-up setters by frames in the same origin.
4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!allowsAccessFrom(exec))
4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return jsUndefined();
4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return Base::lookupSetter(exec, propertyName);
4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// Custom Attributes
4415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
4425f1ab04193ad0130ca8204aadaceae083aca9881Feng QianJSValue JSDOMWindow::history(ExecState* exec) const
4435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
4445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    History* history = impl()->history();
4452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (JSDOMWrapper* wrapper = getCachedWrapper(currentWorld(exec), history))
4465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return wrapper;
4475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
4480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSDOMWindow* window = const_cast<JSDOMWindow*>(this);
4490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSHistory* jsHistory = new (exec) JSHistory(getDOMStructure<JSHistory>(exec, window), window, history);
4502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    cacheWrapper(currentWorld(exec), history, jsHistory);
4515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return jsHistory;
4525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
4535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
4545f1ab04193ad0130ca8204aadaceae083aca9881Feng QianJSValue JSDOMWindow::location(ExecState* exec) const
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    Location* location = impl()->location();
4572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (JSDOMWrapper* wrapper = getCachedWrapper(currentWorld(exec), location))
4585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return wrapper;
4595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
4600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSDOMWindow* window = const_cast<JSDOMWindow*>(this);
4610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSLocation* jsLocation = new (exec) JSLocation(getDOMStructure<JSLocation>(exec, window), window, location);
4622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    cacheWrapper(currentWorld(exec), location, jsLocation);
4635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return jsLocation;
4645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
4655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
4665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid JSDOMWindow::setLocation(ExecState* exec, JSValue value)
4675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(DASHBOARD_SUPPORT)
4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // To avoid breaking old widgets, make "var location =" in a top-level frame create
4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // a property named "location" instead of performing a navigation (<rdar://problem/5688039>).
471cad810f21b803229eb11403f9209855525a25d57Steve Block    if (Frame* activeFrame = activeDOMWindow(exec)->frame()) {
472f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (Settings* settings = activeFrame->settings()) {
473f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            if (settings->usesDashboardBackwardCompatibilityMode() && !activeFrame->tree()->parent()) {
474f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                if (allowsAccessFrom(exec))
4752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    putDirect(exec->globalData(), Identifier(exec, "location"), value);
476f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                return;
477f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            }
4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
482f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    UString locationString = value.toString(exec);
483f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (exec->hadException())
484231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
485231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
486cad810f21b803229eb11403f9209855525a25d57Steve Block    impl()->setLocation(ustringToString(locationString), activeDOMWindow(exec), firstDOMWindow(exec));
4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4895f1ab04193ad0130ca8204aadaceae083aca9881Feng QianJSValue JSDOMWindow::event(ExecState* exec) const
4905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
4915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    Event* event = currentEvent();
4925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (!event)
4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return jsUndefined();
4945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return toJS(exec, event);
4955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
4965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
497231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(EVENTSOURCE)
498231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockJSValue JSDOMWindow::eventSource(ExecState* exec) const
499231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
500231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return getDOMConstructor<JSEventSourceConstructor>(exec, this);
501231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
502231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
503231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
5045f1ab04193ad0130ca8204aadaceae083aca9881Feng QianJSValue JSDOMWindow::image(ExecState* exec) const
5055f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
5065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return getDOMConstructor<JSImageConstructor>(exec, this);
5075f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5095f1ab04193ad0130ca8204aadaceae083aca9881Feng QianJSValue JSDOMWindow::option(ExecState* exec) const
5105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
5115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return getDOMConstructor<JSOptionConstructor>(exec, this);
5125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if ENABLE(VIDEO)
5155f1ab04193ad0130ca8204aadaceae083aca9881Feng QianJSValue JSDOMWindow::audio(ExecState* exec) const
5165f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
5175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (!MediaPlayer::isAvailable())
5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return jsUndefined();
5195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return getDOMConstructor<JSAudioConstructor>(exec, this);
5205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
5215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif
5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5235f1ab04193ad0130ca8204aadaceae083aca9881Feng QianJSValue JSDOMWindow::webKitPoint(ExecState* exec) const
5245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
5250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return getDOMConstructor<JSWebKitPointConstructor>(exec, this);
5265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5285f1ab04193ad0130ca8204aadaceae083aca9881Feng QianJSValue JSDOMWindow::webKitCSSMatrix(ExecState* exec) const
5295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
5300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return getDOMConstructor<JSWebKitCSSMatrixConstructor>(exec, this);
5315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
5325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
5336c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenJSValue JSDOMWindow::arrayBuffer(ExecState* exec) const
534231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
5356c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    return getDOMConstructor<JSArrayBufferConstructor>(exec, this);
536231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
537231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
5386c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenJSValue JSDOMWindow::int8Array(ExecState* exec) const
539231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
5406c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    return getDOMConstructor<JSInt8ArrayConstructor>(exec, this);
541231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
542231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
5436c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenJSValue JSDOMWindow::uint8Array(ExecState* exec) const
544231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
5456c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    return getDOMConstructor<JSUint8ArrayConstructor>(exec, this);
546231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
547231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
5486c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenJSValue JSDOMWindow::int32Array(ExecState* exec) const
549231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
5506c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    return getDOMConstructor<JSInt32ArrayConstructor>(exec, this);
551231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
552231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
5536c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenJSValue JSDOMWindow::uint32Array(ExecState* exec) const
554231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
5556c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    return getDOMConstructor<JSUint32ArrayConstructor>(exec, this);
556231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
557231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
5586c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenJSValue JSDOMWindow::int16Array(ExecState* exec) const
559231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
5606c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    return getDOMConstructor<JSInt16ArrayConstructor>(exec, this);
561231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
562231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
5636c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenJSValue JSDOMWindow::uint16Array(ExecState* exec) const
564231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
5656c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    return getDOMConstructor<JSUint16ArrayConstructor>(exec, this);
566231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
567231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
568545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochJSValue JSDOMWindow::float32Array(ExecState* exec) const
5696c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
570545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return getDOMConstructor<JSFloat32ArrayConstructor>(exec, this);
5716c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen}
5726c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
57337da970a4978c0729b6a37c13d0ebc6a17c6d573Ben MurdochJSValue JSDOMWindow::float64Array(ExecState* exec) const
57437da970a4978c0729b6a37c13d0ebc6a17c6d573Ben Murdoch{
57537da970a4978c0729b6a37c13d0ebc6a17c6d573Ben Murdoch    return getDOMConstructor<JSFloat64ArrayConstructor>(exec, this);
57637da970a4978c0729b6a37c13d0ebc6a17c6d573Ben Murdoch}
57737da970a4978c0729b6a37c13d0ebc6a17c6d573Ben Murdoch
5784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangJSValue JSDOMWindow::dataView(ExecState* exec) const
5794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{
5804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    return getDOMConstructor<JSDataViewConstructor>(exec, this);
5814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
5822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5835f1ab04193ad0130ca8204aadaceae083aca9881Feng QianJSValue JSDOMWindow::xmlHttpRequest(ExecState* exec) const
5845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
5855f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return getDOMConstructor<JSXMLHttpRequestConstructor>(exec, this);
5865f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
5875f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
5885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if ENABLE(XSLT)
5895f1ab04193ad0130ca8204aadaceae083aca9881Feng QianJSValue JSDOMWindow::xsltProcessor(ExecState* exec) const
5905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
5910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return getDOMConstructor<JSXSLTProcessorConstructor>(exec, this);
5925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
5935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif
5945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
5955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if ENABLE(CHANNEL_MESSAGING)
5965f1ab04193ad0130ca8204aadaceae083aca9881Feng QianJSValue JSDOMWindow::messageChannel(ExecState* exec) const
5975f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
5985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return getDOMConstructor<JSMessageChannelConstructor>(exec, this);
5995f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
6005f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif
6015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
6025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if ENABLE(WORKERS)
6035f1ab04193ad0130ca8204aadaceae083aca9881Feng QianJSValue JSDOMWindow::worker(ExecState* exec) const
6045f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
6050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return getDOMConstructor<JSWorkerConstructor>(exec, this);
6060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
6070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
6080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
6090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if ENABLE(SHARED_WORKERS)
6100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochJSValue JSDOMWindow::sharedWorker(ExecState* exec) const
6110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
612231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (SharedWorkerRepository::isAvailable())
613231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return getDOMConstructor<JSSharedWorkerConstructor>(exec, this);
614231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return jsUndefined();
615231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
616231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
617231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
618f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if ENABLE(WEB_AUDIO)
619f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochJSValue JSDOMWindow::webkitAudioContext(ExecState* exec) const
620f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
621f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return getDOMConstructor<JSAudioContextConstructor>(exec, this);
622f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
623f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif
624f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
625231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(WEB_SOCKETS)
626231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockJSValue JSDOMWindow::webSocket(ExecState* exec) const
627231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
628231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Frame* frame = impl()->frame();
629231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!frame)
630231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return jsUndefined();
631231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Settings* settings = frame->settings();
632231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!settings)
633231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return jsUndefined();
634231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return getDOMConstructor<JSWebSocketConstructor>(exec, this);
6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif
6375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
6385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// Custom functions
6395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
6405af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkeJSValue JSDOMWindow::open(ExecState* exec)
6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
642f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    String urlString = valueToStringWithUndefinedOrNullCheck(exec, exec->argument(0));
643f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (exec->hadException())
6445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return jsUndefined();
645f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    AtomicString frameName = exec->argument(1).isUndefinedOrNull() ? "_blank" : ustringToAtomicString(exec->argument(1).toString(exec));
646f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (exec->hadException())
6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return jsUndefined();
648f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    String windowFeaturesString = valueToStringWithUndefinedOrNullCheck(exec, exec->argument(2));
649f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (exec->hadException())
6505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return jsUndefined();
6515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
652cad810f21b803229eb11403f9209855525a25d57Steve Block    RefPtr<DOMWindow> openedWindow = impl()->open(urlString, frameName, windowFeaturesString, activeDOMWindow(exec), firstDOMWindow(exec));
653f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!openedWindow)
6545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return jsUndefined();
655f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return toJS(exec, openedWindow.get());
656f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
6575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
658f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochclass DialogHandler {
659f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochpublic:
660f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    explicit DialogHandler(ExecState* exec)
661f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        : m_exec(exec)
662f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        , m_globalObject(0)
663f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    {
6645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
6655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
666f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    void dialogCreated(DOMWindow*);
667f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    JSValue returnValue() const;
6685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
669f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochprivate:
670f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    ExecState* m_exec;
671f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    JSDOMWindow* m_globalObject;
672f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch};
6735f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
674f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochinline void DialogHandler::dialogCreated(DOMWindow* dialog)
675f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
676cad810f21b803229eb11403f9209855525a25d57Steve Block    // FIXME: This looks like a leak between the normal world and an isolated
677cad810f21b803229eb11403f9209855525a25d57Steve Block    //        world if dialogArguments comes from an isolated world.
678f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    m_globalObject = toJSDOMWindow(dialog->frame(), normalWorld(m_exec->globalData()));
679f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (JSValue dialogArguments = m_exec->argument(1))
6802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_globalObject->putDirect(m_exec->globalData(), Identifier(m_exec, "dialogArguments"), dialogArguments);
681f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
6825f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
683f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochinline JSValue DialogHandler::returnValue() const
684f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
685f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!m_globalObject)
6865f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return jsUndefined();
687f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    Identifier identifier(m_exec, "returnValue");
688f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    PropertySlot slot;
689f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!m_globalObject->JSGlobalObject::getOwnPropertySlot(m_exec, identifier, slot))
690f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return jsUndefined();
691f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return slot.getValue(m_exec, identifier);
692f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
6935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
694cad810f21b803229eb11403f9209855525a25d57Steve Blockstatic void setUpDialog(DOMWindow* dialog, void* handler)
695f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
696cad810f21b803229eb11403f9209855525a25d57Steve Block    static_cast<DialogHandler*>(handler)->dialogCreated(dialog);
6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6995af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkeJSValue JSDOMWindow::showModalDialog(ExecState* exec)
7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
701f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    String urlString = valueToStringWithUndefinedOrNullCheck(exec, exec->argument(0));
702f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (exec->hadException())
7035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return jsUndefined();
704f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    String dialogFeaturesString = valueToStringWithUndefinedOrNullCheck(exec, exec->argument(2));
705f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (exec->hadException())
7065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return jsUndefined();
7075f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
708f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    DialogHandler handler(exec);
7095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
710cad810f21b803229eb11403f9209855525a25d57Steve Block    impl()->showModalDialog(urlString, dialogFeaturesString, activeDOMWindow(exec), firstDOMWindow(exec), setUpDialog, &handler);
7115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
712f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return handler.returnValue();
7138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7155af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkeJSValue JSDOMWindow::postMessage(ExecState* exec)
7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7175af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    PassRefPtr<SerializedScriptValue> message = SerializedScriptValue::create(exec, exec->argument(0));
7185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
7195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (exec->hadException())
7205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return jsUndefined();
7215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
722231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    MessagePortArray messagePorts;
7235af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    if (exec->argumentCount() > 2)
7245af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        fillMessagePortArray(exec, exec->argument(1), messagePorts);
725231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (exec->hadException())
726231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return jsUndefined();
7275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
7285af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    String targetOrigin = valueToStringWithUndefinedOrNullCheck(exec, exec->argument((exec->argumentCount() == 2) ? 1 : 2));
7295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (exec->hadException())
7305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return jsUndefined();
7315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
7325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    ExceptionCode ec = 0;
733cad810f21b803229eb11403f9209855525a25d57Steve Block    impl()->postMessage(message, &messagePorts, targetOrigin, activeDOMWindow(exec), ec);
7345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    setDOMException(exec, ec);
7355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return jsUndefined();
7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7395af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkeJSValue JSDOMWindow::setTimeout(ExecState* exec)
7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ContentSecurityPolicy* contentSecurityPolicy = impl()->document() ? impl()->document()->contentSecurityPolicy() : 0;
7422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    OwnPtr<ScheduledAction> action = ScheduledAction::create(exec, currentWorld(exec), contentSecurityPolicy);
7435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (exec->hadException())
7445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return jsUndefined();
7452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!action)
7472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return jsNumber(0);
7482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7495af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    int delay = exec->argument(1).toInt32(exec);
750d0825bca7fe65beaee391d30da42e937db621564Steve Block
751d0825bca7fe65beaee391d30da42e937db621564Steve Block    ExceptionCode ec = 0;
752692e5dbf12901edacf14812a6fae25462920af42Steve Block    int result = impl()->setTimeout(action.release(), delay, ec);
753d0825bca7fe65beaee391d30da42e937db621564Steve Block    setDOMException(exec, ec);
754d0825bca7fe65beaee391d30da42e937db621564Steve Block
755e14391e94c850b8bd03680c23b38978db68687a8John Reck    return jsNumber(result);
7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7585af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkeJSValue JSDOMWindow::setInterval(ExecState* exec)
7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ContentSecurityPolicy* contentSecurityPolicy = impl()->document() ? impl()->document()->contentSecurityPolicy() : 0;
7612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    OwnPtr<ScheduledAction> action = ScheduledAction::create(exec, currentWorld(exec), contentSecurityPolicy);
7625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (exec->hadException())
7635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return jsUndefined();
7645af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    int delay = exec->argument(1).toInt32(exec);
765d0825bca7fe65beaee391d30da42e937db621564Steve Block
7662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!action)
7672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return jsNumber(0);
7682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
769d0825bca7fe65beaee391d30da42e937db621564Steve Block    ExceptionCode ec = 0;
770692e5dbf12901edacf14812a6fae25462920af42Steve Block    int result = impl()->setInterval(action.release(), delay, ec);
771d0825bca7fe65beaee391d30da42e937db621564Steve Block    setDOMException(exec, ec);
772d0825bca7fe65beaee391d30da42e937db621564Steve Block
773e14391e94c850b8bd03680c23b38978db68687a8John Reck    return jsNumber(result);
7748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7765af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkeJSValue JSDOMWindow::addEventListener(ExecState* exec)
7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* frame = impl()->frame();
7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!frame)
7808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return jsUndefined();
7818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7825af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    JSValue listener = exec->argument(1);
783231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!listener.isObject())
784231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return jsUndefined();
7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7865af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    impl()->addEventListener(ustringToAtomicString(exec->argument(0).toString(exec)), JSEventListener::create(asObject(listener), this, false, currentWorld(exec)), exec->argument(2).toBoolean(exec));
7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return jsUndefined();
7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7905af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkeJSValue JSDOMWindow::removeEventListener(ExecState* exec)
7918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* frame = impl()->frame();
7938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!frame)
7948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return jsUndefined();
7958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7965af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    JSValue listener = exec->argument(1);
797231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!listener.isObject())
798231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return jsUndefined();
7998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8005af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    impl()->removeEventListener(ustringToAtomicString(exec->argument(0).toString(exec)), JSEventListener::create(asObject(listener), this, false, currentWorld(exec)).get(), exec->argument(2).toBoolean(exec));
8018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return jsUndefined();
8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8045f1ab04193ad0130ca8204aadaceae083aca9881Feng QianDOMWindow* toDOMWindow(JSValue value)
8058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
806635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!value.isObject())
8078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JSObject* object = asObject(value);
8098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (object->inherits(&JSDOMWindow::s_info))
8108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return static_cast<JSDOMWindow*>(object)->impl();
8118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (object->inherits(&JSDOMWindowShell::s_info))
8128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return static_cast<JSDOMWindowShell*>(object)->impl();
8138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
8148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
817