1d0825bca7fe65beaee391d30da42e937db621564Steve Block/* 2d0825bca7fe65beaee391d30da42e937db621564Steve Block * Copyright (C) 2009 Google Inc. All rights reserved. 3d0825bca7fe65beaee391d30da42e937db621564Steve Block * 4d0825bca7fe65beaee391d30da42e937db621564Steve Block * Redistribution and use in source and binary forms, with or without 5d0825bca7fe65beaee391d30da42e937db621564Steve Block * modification, are permitted provided that the following conditions are 6d0825bca7fe65beaee391d30da42e937db621564Steve Block * met: 7d0825bca7fe65beaee391d30da42e937db621564Steve Block * 8d0825bca7fe65beaee391d30da42e937db621564Steve Block * * Redistributions of source code must retain the above copyright 9d0825bca7fe65beaee391d30da42e937db621564Steve Block * notice, this list of conditions and the following disclaimer. 10d0825bca7fe65beaee391d30da42e937db621564Steve Block * * Redistributions in binary form must reproduce the above 11d0825bca7fe65beaee391d30da42e937db621564Steve Block * copyright notice, this list of conditions and the following disclaimer 12d0825bca7fe65beaee391d30da42e937db621564Steve Block * in the documentation and/or other materials provided with the 13d0825bca7fe65beaee391d30da42e937db621564Steve Block * distribution. 14d0825bca7fe65beaee391d30da42e937db621564Steve Block * * Neither the name of Google Inc. nor the names of its 15d0825bca7fe65beaee391d30da42e937db621564Steve Block * contributors may be used to endorse or promote products derived from 16d0825bca7fe65beaee391d30da42e937db621564Steve Block * this software without specific prior written permission. 17d0825bca7fe65beaee391d30da42e937db621564Steve Block * 18d0825bca7fe65beaee391d30da42e937db621564Steve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19d0825bca7fe65beaee391d30da42e937db621564Steve Block * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20d0825bca7fe65beaee391d30da42e937db621564Steve Block * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21d0825bca7fe65beaee391d30da42e937db621564Steve Block * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22d0825bca7fe65beaee391d30da42e937db621564Steve Block * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23d0825bca7fe65beaee391d30da42e937db621564Steve Block * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24d0825bca7fe65beaee391d30da42e937db621564Steve Block * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25d0825bca7fe65beaee391d30da42e937db621564Steve Block * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26d0825bca7fe65beaee391d30da42e937db621564Steve Block * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27d0825bca7fe65beaee391d30da42e937db621564Steve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28d0825bca7fe65beaee391d30da42e937db621564Steve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29d0825bca7fe65beaee391d30da42e937db621564Steve Block */ 30d0825bca7fe65beaee391d30da42e937db621564Steve Block 31d0825bca7fe65beaee391d30da42e937db621564Steve Block#ifndef V8IsolatedContext_h 32d0825bca7fe65beaee391d30da42e937db621564Steve Block#define V8IsolatedContext_h 33d0825bca7fe65beaee391d30da42e937db621564Steve Block 34d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "IsolatedWorld.h" 35d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "ScriptSourceCode.h" // for WebCore::ScriptSourceCode 36d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "V8DOMWindow.h" 37d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "V8Proxy.h" 38d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "V8Utilities.h" 39d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <v8.h> 40d0825bca7fe65beaee391d30da42e937db621564Steve Block 41d0825bca7fe65beaee391d30da42e937db621564Steve Blocknamespace WebCore { 42d0825bca7fe65beaee391d30da42e937db621564Steve Block 43d0825bca7fe65beaee391d30da42e937db621564Steve Blockclass V8Proxy; 44d0825bca7fe65beaee391d30da42e937db621564Steve Block 45d0825bca7fe65beaee391d30da42e937db621564Steve Block// V8IsolatedContext 46d0825bca7fe65beaee391d30da42e937db621564Steve Block// 47d0825bca7fe65beaee391d30da42e937db621564Steve Block// V8IsolatedContext represents a isolated execution environment for 48d0825bca7fe65beaee391d30da42e937db621564Steve Block// JavaScript. Each isolated world executes in parallel with the main 49d0825bca7fe65beaee391d30da42e937db621564Steve Block// JavaScript world. An isolated world has access to the same DOM data 50d0825bca7fe65beaee391d30da42e937db621564Steve Block// structures as the main world but none of the JavaScript pointers. 51d0825bca7fe65beaee391d30da42e937db621564Steve Block// 52d0825bca7fe65beaee391d30da42e937db621564Steve Block// It is an error to ever share a JavaScript pointer between two isolated 53d0825bca7fe65beaee391d30da42e937db621564Steve Block// worlds or between an isolated world and the main world. Because 54d0825bca7fe65beaee391d30da42e937db621564Steve Block// isolated worlds have access to the DOM, they need their own DOM wrappers 55d0825bca7fe65beaee391d30da42e937db621564Steve Block// to avoid having pointers to the main world's DOM wrappers (which are 56d0825bca7fe65beaee391d30da42e937db621564Steve Block// JavaScript objects). 57d0825bca7fe65beaee391d30da42e937db621564Steve Blockclass V8IsolatedContext { 58d0825bca7fe65beaee391d30da42e937db621564Steve Blockpublic: 59d0825bca7fe65beaee391d30da42e937db621564Steve Block // Creates an isolated world. To destroy it, call destroy(). 60d0825bca7fe65beaee391d30da42e937db621564Steve Block // This will delete the isolated world when the context it owns is GC'd. 61d0825bca7fe65beaee391d30da42e937db621564Steve Block V8IsolatedContext(V8Proxy* proxy, int extensionGroup); 62d0825bca7fe65beaee391d30da42e937db621564Steve Block ~V8IsolatedContext(); 63d0825bca7fe65beaee391d30da42e937db621564Steve Block 64d0825bca7fe65beaee391d30da42e937db621564Steve Block // Call this to destroy the isolated world. It will be deleted sometime 65d0825bca7fe65beaee391d30da42e937db621564Steve Block // after this call, once all script references to the world's context 66d0825bca7fe65beaee391d30da42e937db621564Steve Block // have been dropped. 67d0825bca7fe65beaee391d30da42e937db621564Steve Block void destroy(); 68d0825bca7fe65beaee391d30da42e937db621564Steve Block 69d0825bca7fe65beaee391d30da42e937db621564Steve Block // Returns the isolated world associated with 70d0825bca7fe65beaee391d30da42e937db621564Steve Block // v8::Context::GetEntered(). Because worlds are isolated, the entire 71d0825bca7fe65beaee391d30da42e937db621564Steve Block // JavaScript call stack should be from the same isolated world. 72d0825bca7fe65beaee391d30da42e937db621564Steve Block // Returns 0 if the entered context is from the main world. 73d0825bca7fe65beaee391d30da42e937db621564Steve Block // 74d0825bca7fe65beaee391d30da42e937db621564Steve Block // FIXME: Consider edge cases with DOM mutation events that might 75d0825bca7fe65beaee391d30da42e937db621564Steve Block // violate this invariant. 76d0825bca7fe65beaee391d30da42e937db621564Steve Block // 77d0825bca7fe65beaee391d30da42e937db621564Steve Block static V8IsolatedContext* getEntered() 78d0825bca7fe65beaee391d30da42e937db621564Steve Block { 79d0825bca7fe65beaee391d30da42e937db621564Steve Block // This is a temporary performance optimization. Essentially, 80d0825bca7fe65beaee391d30da42e937db621564Steve Block // GetHiddenValue is too slow for this code path. We need to get the 81d0825bca7fe65beaee391d30da42e937db621564Steve Block // V8 team to add a real property to v8::Context for isolated worlds. 82d0825bca7fe65beaee391d30da42e937db621564Steve Block // Until then, we optimize the common case of not having any isolated 83d0825bca7fe65beaee391d30da42e937db621564Steve Block // worlds at all. 84d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!IsolatedWorld::count()) 85d0825bca7fe65beaee391d30da42e937db621564Steve Block return 0; 86d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!v8::Context::InContext()) 87d0825bca7fe65beaee391d30da42e937db621564Steve Block return 0; 88d0825bca7fe65beaee391d30da42e937db621564Steve Block return reinterpret_cast<V8IsolatedContext*>(getGlobalObject(v8::Context::GetEntered())->GetPointerFromInternalField(V8DOMWindow::enteredIsolatedWorldIndex)); 89d0825bca7fe65beaee391d30da42e937db621564Steve Block } 90d0825bca7fe65beaee391d30da42e937db621564Steve Block 91d0825bca7fe65beaee391d30da42e937db621564Steve Block v8::Handle<v8::Context> context() { return m_context->get(); } 92d0825bca7fe65beaee391d30da42e937db621564Steve Block PassRefPtr<SharedPersistent<v8::Context> > sharedContext() { return m_context; } 93d0825bca7fe65beaee391d30da42e937db621564Steve Block 94d0825bca7fe65beaee391d30da42e937db621564Steve Block IsolatedWorld* world() const { return m_world.get(); } 95d0825bca7fe65beaee391d30da42e937db621564Steve Block 96d0825bca7fe65beaee391d30da42e937db621564Steve Blockprivate: 97d0825bca7fe65beaee391d30da42e937db621564Steve Block static v8::Handle<v8::Object> getGlobalObject(v8::Handle<v8::Context> context) 98d0825bca7fe65beaee391d30da42e937db621564Steve Block { 99d0825bca7fe65beaee391d30da42e937db621564Steve Block return v8::Handle<v8::Object>::Cast(context->Global()->GetPrototype()); 100d0825bca7fe65beaee391d30da42e937db621564Steve Block } 101d0825bca7fe65beaee391d30da42e937db621564Steve Block 102d0825bca7fe65beaee391d30da42e937db621564Steve Block // Called by the garbage collector when our JavaScript context is about 103d0825bca7fe65beaee391d30da42e937db621564Steve Block // to be destroyed. 104d0825bca7fe65beaee391d30da42e937db621564Steve Block static void contextWeakReferenceCallback(v8::Persistent<v8::Value> object, void* isolatedContext); 105d0825bca7fe65beaee391d30da42e937db621564Steve Block 106d0825bca7fe65beaee391d30da42e937db621564Steve Block // The underlying v8::Context. This object is keep on the heap as 107d0825bca7fe65beaee391d30da42e937db621564Steve Block // long as |m_context| has not been garbage collected. 108d0825bca7fe65beaee391d30da42e937db621564Steve Block RefPtr<SharedPersistent<v8::Context> > m_context; 109d0825bca7fe65beaee391d30da42e937db621564Steve Block 110d0825bca7fe65beaee391d30da42e937db621564Steve Block RefPtr<IsolatedWorld> m_world; 111d0825bca7fe65beaee391d30da42e937db621564Steve Block}; 112d0825bca7fe65beaee391d30da42e937db621564Steve Block 113d0825bca7fe65beaee391d30da42e937db621564Steve Block} // namespace WebCore 114d0825bca7fe65beaee391d30da42e937db621564Steve Block 115d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif // V8IsolatedContext_h 116