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