JSDOMWindowCustom.cpp revision 37da970a4978c0729b6a37c13d0ebc6a17c6d573
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