1635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project/* 2635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (C) 2009 Google Inc. All rights reserved. 3635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 4635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Redistribution and use in source and binary forms, with or without 5635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * modification, are permitted provided that the following conditions are 6635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * met: 7635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 8635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * * Redistributions of source code must retain the above copyright 9635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * notice, this list of conditions and the following disclaimer. 10635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * * Redistributions in binary form must reproduce the above 11635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * copyright notice, this list of conditions and the following disclaimer 12635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * in the documentation and/or other materials provided with the 13635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * distribution. 14635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * * Neither the name of Google Inc. nor the names of its 15635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * contributors may be used to endorse or promote products derived from 16635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * this software without specific prior written permission. 17635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 18635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project */ 30635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#ifndef V8Proxy_h 328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#define V8Proxy_h 33635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3428d479b346abf9bc37692d5542fdfaef7b8b0532Steve Block#include "PlatformBridge.h" 350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "ScriptSourceCode.h" // for WebCore::ScriptSourceCode 360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "SecurityOrigin.h" // for WebCore::SecurityOrigin 37231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "SharedPersistent.h" 38231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "V8AbstractEventListener.h" 39d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "V8DOMWindowShell.h" 400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "V8DOMWrapper.h" 410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "V8GCController.h" 4221939df44de1705786c545cd1bf519d47250322dBen Murdoch#include "V8Utilities.h" 43dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "WrapperTypeInfo.h" 440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <v8.h> 45dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include <wtf/Forward.h> 460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <wtf/PassRefPtr.h> // so generated bindings don't have to 470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <wtf/Vector.h> 480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 49c0db6fc8961d84b887cafea4ea2fd3b63fbea8a9Ben Murdoch#if defined(ENABLE_DOM_STATS_COUNTERS) && PLATFORM(CHROMIUM) 503eb2fab210a9ae636c55b30b23bb53b130d1efb6Steve Block#define INC_STATS(name) PlatformBridge::incrementStatsCounter(name) 510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else 520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#define INC_STATS(name) 530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 54635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 55635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectnamespace WebCore { 56635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 5706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen class CachedScript; 580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch class DOMWindow; 590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch class Frame; 600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch class Node; 610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch class ScriptExecutionContext; 620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch class V8EventListener; 63d0825bca7fe65beaee391d30da42e937db621564Steve Block class V8IsolatedContext; 64643ca7872b450ea4efacab6188849e5aac2ba161Steve Block class WorldContextHandle; 650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // FIXME: use standard logging facilities in WebCore. 670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void logInfo(Frame*, const String& message, const String& url); 680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // The following Batch structs and methods are used for setting multiple 700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // properties on an ObjectTemplate, used from the generated bindings 710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // initialization (ConfigureXXXTemplate). This greatly reduces the binary 720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // size by moving from code driven setup to data table driven setup. 730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // BatchedAttribute translates into calls to SetAccessor() on either the 750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // instance or the prototype ObjectTemplate, based on |onProto|. 760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch struct BatchedAttribute { 770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch const char* const name; 780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch v8::AccessorGetter getter; 790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch v8::AccessorSetter setter; 80dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WrapperTypeInfo* data; 810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch v8::AccessControl settings; 820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch v8::PropertyAttribute attribute; 830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch bool onProto; 840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch }; 850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void batchConfigureAttributes(v8::Handle<v8::ObjectTemplate>, v8::Handle<v8::ObjectTemplate>, const BatchedAttribute*, size_t attributeCount); 870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 88cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block inline void configureAttribute(v8::Handle<v8::ObjectTemplate> instance, v8::Handle<v8::ObjectTemplate> proto, const BatchedAttribute& attribute) 89cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block { 90cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block (attribute.onProto ? proto : instance)->SetAccessor(v8::String::New(attribute.name), 91cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block attribute.getter, 92cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block attribute.setter, 93dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block v8::External::Wrap(attribute.data), 94cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block attribute.settings, 95cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block attribute.attribute); 96cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } 97cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // BatchedConstant translates into calls to Set() for setting up an object's 990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // constants. It sets the constant on both the FunctionTemplate and the 1000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // ObjectTemplate. PropertyAttributes is always ReadOnly. 1010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch struct BatchedConstant { 1020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch const char* const name; 1030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch int value; 1040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch }; 1050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void batchConfigureConstants(v8::Handle<v8::FunctionTemplate>, v8::Handle<v8::ObjectTemplate>, const BatchedConstant*, size_t constantCount); 1070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 108643ca7872b450ea4efacab6188849e5aac2ba161Steve Block struct BatchedCallback { 109643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const char* const name; 110643ca7872b450ea4efacab6188849e5aac2ba161Steve Block v8::InvocationCallback callback; 111643ca7872b450ea4efacab6188849e5aac2ba161Steve Block }; 112643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 113643ca7872b450ea4efacab6188849e5aac2ba161Steve Block void batchConfigureCallbacks(v8::Handle<v8::ObjectTemplate>, 114643ca7872b450ea4efacab6188849e5aac2ba161Steve Block v8::Handle<v8::Signature>, 115643ca7872b450ea4efacab6188849e5aac2ba161Steve Block v8::PropertyAttribute, 116643ca7872b450ea4efacab6188849e5aac2ba161Steve Block const BatchedCallback*, 117643ca7872b450ea4efacab6188849e5aac2ba161Steve Block size_t callbackCount); 118643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block const int kMaxRecursionDepth = 22; 1200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 121a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // The list of extensions that are registered for use with V8. 122a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch typedef WTF::Vector<v8::Extension*> V8Extensions; 1230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch class V8Proxy { 1250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch public: 1260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // The types of javascript errors that can be thrown. 1270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch enum ErrorType { 1280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch RangeError, 1290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ReferenceError, 1300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch SyntaxError, 1310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch TypeError, 1320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch GeneralError 1330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch }; 1340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 135231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block explicit V8Proxy(Frame*); 1360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ~V8Proxy(); 1380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch Frame* frame() { return m_frame; } 1400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void clearForNavigation(); 1420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void clearForClose(); 1430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // FIXME: Need comment. User Gesture related. 1450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch bool inlineCode() const { return m_inlineCode; } 1460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void setInlineCode(bool value) { m_inlineCode = value; } 1470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch bool timerCallback() const { return m_timerCallback; } 1490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void setTimerCallback(bool value) { m_timerCallback = value; } 1500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Disconnects the proxy from its owner frame, 1520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // and clears all timeouts on the DOM window. 1530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void disconnectFrame(); 1540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void finishedWithEvent(Event*) { } 1560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Evaluate JavaScript in a new isolated world. The script gets its own 1580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // global scope, its own prototypes for intrinsic JavaScript objects (String, 1590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Array, and so-on), and its own wrappers for all DOM nodes and DOM 1600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // constructors. 161231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block void evaluateInIsolatedWorld(int worldId, const Vector<ScriptSourceCode>& sources, int extensionGroup); 1620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 163ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // Returns true if the proxy is currently executing a script in V8. 164ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block bool executingScript() const; 165ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 1660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Evaluate a script file in the current execution environment. 1670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // The caller must hold an execution context. 1680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // If cannot evalute the script, it returns an error. 1690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch v8::Local<v8::Value> evaluate(const ScriptSourceCode&, Node*); 1700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Run an already compiled script. 1720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch v8::Local<v8::Value> runScript(v8::Handle<v8::Script>, bool isInlineCode); 1730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Call the function with the given receiver and arguments. 1750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch v8::Local<v8::Value> callFunction(v8::Handle<v8::Function>, v8::Handle<v8::Object>, int argc, v8::Handle<v8::Value> argv[]); 1760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 177dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Call the function with the given receiver and arguments. 178dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block static v8::Local<v8::Value> callFunctionWithoutFrame(v8::Handle<v8::Function>, v8::Handle<v8::Object>, int argc, v8::Handle<v8::Value> argv[]); 179dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Call the function as constructor with the given arguments. 1810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch v8::Local<v8::Value> newInstance(v8::Handle<v8::Function>, int argc, v8::Handle<v8::Value> argv[]); 1820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Returns the window object associated with a context. 1840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static DOMWindow* retrieveWindow(v8::Handle<v8::Context>); 1850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Returns V8Proxy object of the currently executing context. 1860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static V8Proxy* retrieve(); 1870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Returns V8Proxy object associated with a frame. 1880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static V8Proxy* retrieve(Frame*); 1890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Returns V8Proxy object associated with a script execution context. 1900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static V8Proxy* retrieve(ScriptExecutionContext*); 1910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Returns the frame object of the window object associated with 1930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // a context. 1940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static Frame* retrieveFrame(v8::Handle<v8::Context>); 1950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // The three functions below retrieve WebFrame instances relating the 1980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // currently executing JavaScript. Since JavaScript can make function calls 1990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // across frames, though, we need to be more precise. 2000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // 2010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // For example, imagine that a JS function in frame A calls a function in 2020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // frame B, which calls native code, which wants to know what the 'active' 2030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // frame is. 2040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // 2050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // The 'entered context' is the context where execution first entered the 2060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // script engine; the context that is at the bottom of the JS function stack. 2070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // RetrieveFrameForEnteredContext() would return Frame A in our example. 2080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // This frame is often referred to as the "dynamic global object." 2090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // 2100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // The 'current context' is the context the JS engine is currently inside of; 2110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // the context that is at the top of the JS function stack. 2120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // RetrieveFrameForCurrentContext() would return Frame B in our example. 2130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // This frame is often referred to as the "lexical global object." 2140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // 2150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Finally, the 'calling context' is the context one below the current 2160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // context on the JS function stack. For example, if function f calls 2170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // function g, then the calling context will be the context associated with 2180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // f. This context is commonly used by DOM security checks because they want 2190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // to know who called them. 2200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // 2210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // If you are unsure which of these functions to use, ask abarth. 2220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // 2230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // NOTE: These cannot be declared as inline function, because VS complains at 2240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // linking time. 2250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static Frame* retrieveFrameForEnteredContext(); 2260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static Frame* retrieveFrameForCurrentContext(); 2270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static Frame* retrieveFrameForCallingContext(); 2280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Returns V8 Context of a frame. If none exists, creates 2300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // a new context. It is potentially slow and consumes memory. 2310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static v8::Local<v8::Context> context(Frame*); 2320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static v8::Local<v8::Context> mainWorldContext(Frame*); 2330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static v8::Local<v8::Context> currentContext(); 2340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // If the current context causes out of memory, JavaScript setting 2360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // is disabled and it returns true. 2370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static bool handleOutOfMemory(); 2380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static v8::Handle<v8::Value> checkNewLegal(const v8::Arguments&); 2400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2416b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner static v8::Handle<v8::Script> compileScript(v8::Handle<v8::String> code, const String& fileName, const TextPosition0& scriptStartPosition, v8::ScriptData* = 0); 2420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // If the exception code is different from zero, a DOM exception is 2440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // schedule to be thrown. 2450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static void setDOMException(int exceptionCode); 2460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Schedule an error object to be thrown. 2480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static v8::Handle<v8::Value> throwError(ErrorType, const char* message); 2490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 25006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen // Helpers for throwing syntax and type errors with predefined messages. 25106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen static v8::Handle<v8::Value> throwTypeError(); 25206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen static v8::Handle<v8::Value> throwSyntaxError(); 25306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 254dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block template <typename T> 255dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block static v8::Handle<v8::Value> constructDOMObject(const v8::Arguments&, WrapperTypeInfo*); 2560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 25721939df44de1705786c545cd1bf519d47250322dBen Murdoch template <typename T> 25821939df44de1705786c545cd1bf519d47250322dBen Murdoch static v8::Handle<v8::Value> constructDOMObjectWithScriptExecutionContext(const v8::Arguments&, WrapperTypeInfo*); 25921939df44de1705786c545cd1bf519d47250322dBen Murdoch 260cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block v8::Local<v8::Context> context(); 261643ca7872b450ea4efacab6188849e5aac2ba161Steve Block v8::Local<v8::Context> mainWorldContext(); 2620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 263d0825bca7fe65beaee391d30da42e937db621564Steve Block // FIXME: This should eventually take DOMWrapperWorld argument! 264d0825bca7fe65beaee391d30da42e937db621564Steve Block V8DOMWindowShell* windowShell() const { return m_windowShell.get(); } 265d0825bca7fe65beaee391d30da42e937db621564Steve Block 2660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch bool setContextDebugId(int id); 2670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static int contextDebugId(v8::Handle<v8::Context>); 2680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 269a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // Registers a v8 extension to be available on webpages. Will only 270a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // affect v8 contexts initialized after this call. Takes ownership of 271a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch // the v8::Extension object passed. 272bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen static void registerExtension(v8::Extension*); 273bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 274d0825bca7fe65beaee391d30da42e937db621564Steve Block static void registerExtensionWithV8(v8::Extension*); 275d0825bca7fe65beaee391d30da42e937db621564Steve Block static bool registeredExtensionWithV8(v8::Extension*); 2760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 277d0825bca7fe65beaee391d30da42e937db621564Steve Block static const V8Extensions& extensions() { return m_extensions; } 2780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 279d0825bca7fe65beaee391d30da42e937db621564Steve Block // Report an unsafe attempt to access the given frame on the console. 280ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch static void reportUnsafeAccessTo(Frame* target); 2810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 282d0825bca7fe65beaee391d30da42e937db621564Steve Block private: 283e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block void didLeaveScriptContext(); 284231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 285231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block void resetIsolatedWorlds(); 286231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 28706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen PassOwnPtr<v8::ScriptData> precompileScript(v8::Handle<v8::String>, CachedScript*); 28806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 289643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Returns false when we're out of memory in V8. 290643ca7872b450ea4efacab6188849e5aac2ba161Steve Block bool setInjectedScriptContextDebugId(v8::Handle<v8::Context> targetContext); 291cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 2920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const char* rangeExceptionName(int exceptionCode); 2930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const char* eventExceptionName(int exceptionCode); 2940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const char* xmlHttpRequestExceptionName(int exceptionCode); 2950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const char* domExceptionName(int exceptionCode); 2960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if ENABLE(XPATH) 2980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const char* xpathExceptionName(int exceptionCode); 2990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 3000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 3010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if ENABLE(SVG) 3020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const char* svgExceptionName(int exceptionCode); 3030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 3040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 30506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#if ENABLE(DATABASE) 30606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen static const char* sqlExceptionName(int exceptionCode); 30706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif 30806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 3090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch Frame* m_frame; 3100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 311d0825bca7fe65beaee391d30da42e937db621564Steve Block // For the moment, we have one of these. Soon we will have one per DOMWrapperWorld. 312d0825bca7fe65beaee391d30da42e937db621564Steve Block RefPtr<V8DOMWindowShell> m_windowShell; 3130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 3140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // True for <a href="javascript:foo()"> and false for <script>foo()</script>. 3150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Only valid during execution. 3160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch bool m_inlineCode; 3170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 3180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // True when executing from within a timer callback. Only valid during 3190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // execution. 3200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch bool m_timerCallback; 3210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 3220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Track the recursion depth to be able to avoid too deep recursion. The V8 3230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // engine allows much more recursion than KJS does so we need to guard against 3240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // excessive recursion in the binding layer. 3250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch int m_recursion; 3260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 327231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // All of the extensions registered with the context. 328231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static V8Extensions m_extensions; 329231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 330231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // The isolated worlds we are tracking for this frame. We hold them alive 331231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // here so that they can be used again by future calls to 332231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // evaluateInIsolatedWorld(). 333231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // 334231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // Note: although the pointer is raw, the instance is kept alive by a strong 335231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // reference to the v8 context it contains, which is not made weak until we 336231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // call world->destroy(). 337d0825bca7fe65beaee391d30da42e937db621564Steve Block // 338d0825bca7fe65beaee391d30da42e937db621564Steve Block // FIXME: We want to eventually be holding window shells instead of the 339d0825bca7fe65beaee391d30da42e937db621564Steve Block // IsolatedContext directly. 340d0825bca7fe65beaee391d30da42e937db621564Steve Block typedef HashMap<int, V8IsolatedContext*> IsolatedWorldMap; 341231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block IsolatedWorldMap m_isolatedWorlds; 3420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch }; 3430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 344dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block template <typename T> 345dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block v8::Handle<v8::Value> V8Proxy::constructDOMObject(const v8::Arguments& args, WrapperTypeInfo* type) 3460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch { 3470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!args.IsConstructCall()) 3480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return throwError(V8Proxy::TypeError, "DOM object constructor cannot be called as a function."); 3490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 3500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Note: it's OK to let this RefPtr go out of scope because we also call 3510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // SetDOMWrapper(), which effectively holds a reference to obj. 3520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch RefPtr<T> obj = T::create(); 353dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block V8DOMWrapper::setDOMWrapper(args.Holder(), type, obj.get()); 3540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch obj->ref(); 3550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch V8DOMWrapper::setJSWrapperForDOMObject(obj.get(), v8::Persistent<v8::Object>::New(args.Holder())); 3560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return args.Holder(); 3570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 3580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 35921939df44de1705786c545cd1bf519d47250322dBen Murdoch template <typename T> 36021939df44de1705786c545cd1bf519d47250322dBen Murdoch v8::Handle<v8::Value> V8Proxy::constructDOMObjectWithScriptExecutionContext(const v8::Arguments& args, WrapperTypeInfo* type) 36121939df44de1705786c545cd1bf519d47250322dBen Murdoch { 36221939df44de1705786c545cd1bf519d47250322dBen Murdoch if (!args.IsConstructCall()) 36321939df44de1705786c545cd1bf519d47250322dBen Murdoch return throwError(V8Proxy::TypeError, ""); 36421939df44de1705786c545cd1bf519d47250322dBen Murdoch 36521939df44de1705786c545cd1bf519d47250322dBen Murdoch ScriptExecutionContext* context = getScriptExecutionContext(); 36621939df44de1705786c545cd1bf519d47250322dBen Murdoch if (!context) 36721939df44de1705786c545cd1bf519d47250322dBen Murdoch return throwError(V8Proxy::ReferenceError, ""); 36821939df44de1705786c545cd1bf519d47250322dBen Murdoch 36921939df44de1705786c545cd1bf519d47250322dBen Murdoch // Note: it's OK to let this RefPtr go out of scope because we also call 37021939df44de1705786c545cd1bf519d47250322dBen Murdoch // SetDOMWrapper(), which effectively holds a reference to obj. 37121939df44de1705786c545cd1bf519d47250322dBen Murdoch RefPtr<T> obj = T::create(context); 37221939df44de1705786c545cd1bf519d47250322dBen Murdoch V8DOMWrapper::setDOMWrapper(args.Holder(), type, obj.get()); 37321939df44de1705786c545cd1bf519d47250322dBen Murdoch obj->ref(); 37421939df44de1705786c545cd1bf519d47250322dBen Murdoch V8DOMWrapper::setJSWrapperForDOMObject(obj.get(), v8::Persistent<v8::Object>::New(args.Holder())); 37521939df44de1705786c545cd1bf519d47250322dBen Murdoch return args.Holder(); 37621939df44de1705786c545cd1bf519d47250322dBen Murdoch } 37721939df44de1705786c545cd1bf519d47250322dBen Murdoch 3780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 379643ca7872b450ea4efacab6188849e5aac2ba161Steve Block v8::Local<v8::Context> toV8Context(ScriptExecutionContext*, const WorldContextHandle& worldContext); 380cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 3818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Used by an interceptor callback that it hasn't found anything to 3828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // intercept. 3838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian inline static v8::Local<v8::Object> notHandledByInterceptor() 3848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 3858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return v8::Local<v8::Object>(); 3868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 387635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian inline static v8::Local<v8::Boolean> deletionNotHandledByInterceptor() 3898f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 3908f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return v8::Local<v8::Boolean>(); 391635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 3920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch inline v8::Handle<v8::Primitive> throwError(const char* message, V8Proxy::ErrorType type = V8Proxy::TypeError) 3938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 394dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!v8::V8::IsExecutionTerminating()) 395dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block V8Proxy::throwError(type, message); 3968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return v8::Undefined(); 3978f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 398635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian inline v8::Handle<v8::Primitive> throwError(ExceptionCode ec) 4008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 401dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!v8::V8::IsExecutionTerminating()) 402dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block V8Proxy::setDOMException(ec); 4038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return v8::Undefined(); 4048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 4058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 4068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian inline v8::Handle<v8::Primitive> throwError(v8::Local<v8::Value> exception) 4078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 408dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!v8::V8::IsExecutionTerminating()) 409dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block v8::ThrowException(exception); 4108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return v8::Undefined(); 4118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 4128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 4138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian template <class T> inline v8::Handle<v8::Object> toV8(PassRefPtr<T> object, v8::Local<v8::Object> holder) 4148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian { 4158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian object->ref(); 4160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch V8DOMWrapper::setJSWrapperForDOMObject(object.get(), v8::Persistent<v8::Object>::New(holder)); 4178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return holder; 4188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 4198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 4208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 421635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 4228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif // V8Proxy_h 423