10bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/* 20bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Copyright (C) 2009 Google Inc. All rights reserved. 30bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 40bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Redistribution and use in source and binary forms, with or without 50bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * modification, are permitted provided that the following conditions are 60bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * met: 70bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 80bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * * Redistributions of source code must retain the above copyright 90bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * notice, this list of conditions and the following disclaimer. 100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * * Redistributions in binary form must reproduce the above 110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * copyright notice, this list of conditions and the following disclaimer 120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * in the documentation and/or other materials provided with the 130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * distribution. 140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * * Neither the name of Google Inc. nor the names of its 150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * contributors may be used to endorse or promote products derived from 160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * this software without specific prior written permission. 170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch */ 300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "config.h" 320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 33d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "V8IsolatedContext.h" 340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "Frame.h" 360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "FrameLoaderClient.h" 370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "HashMap.h" 380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "ScriptController.h" 390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "V8DOMWindow.h" 400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "V8HiddenPropertyName.h" 410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochnamespace WebCore { 430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 45d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid V8IsolatedContext::contextWeakReferenceCallback(v8::Persistent<v8::Value> object, void* isolatedContext) 460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Our context is going away. Time to clean up the world. 48d0825bca7fe65beaee391d30da42e937db621564Steve Block V8IsolatedContext* context = static_cast<V8IsolatedContext*>(isolatedContext); 49d0825bca7fe65beaee391d30da42e937db621564Steve Block delete context; 500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 52d0825bca7fe65beaee391d30da42e937db621564Steve BlockV8IsolatedContext::V8IsolatedContext(V8Proxy* proxy, int extensionGroup) 53d0825bca7fe65beaee391d30da42e937db621564Steve Block : m_world(IsolatedWorld::create()) 540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch v8::HandleScope scope; 56d0825bca7fe65beaee391d30da42e937db621564Steve Block // FIXME: We should be creating a new V8DOMWindowShell here instead of riping out the context. 57d0825bca7fe65beaee391d30da42e937db621564Steve Block m_context = SharedPersistent<v8::Context>::create(proxy->windowShell()->createNewContext(v8::Handle<v8::Object>(), extensionGroup)); 58643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_context->get().IsEmpty()) 59643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return; 600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Run code in the new context. 62d0825bca7fe65beaee391d30da42e937db621564Steve Block v8::Context::Scope contextScope(m_context->get()); 630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 64d0825bca7fe65beaee391d30da42e937db621564Steve Block getGlobalObject(m_context->get())->SetPointerInInternalField(V8DOMWindow::enteredIsolatedWorldIndex, this); 650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 66d0825bca7fe65beaee391d30da42e937db621564Steve Block V8DOMWindowShell::installHiddenObjectPrototype(m_context->get()); 67d0825bca7fe65beaee391d30da42e937db621564Steve Block // FIXME: This will go away once we have a windowShell for the isolated world. 68d0825bca7fe65beaee391d30da42e937db621564Steve Block proxy->windowShell()->installDOMWindow(m_context->get(), proxy->frame()->domWindow()); 690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Using the default security token means that the canAccess is always 710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // called, which is slow. 720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // FIXME: Use tokens where possible. This will mean keeping track of all 730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // created contexts so that they can all be updated when the 740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // document domain 750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // changes. 76231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_context->get()->UseDefaultSecurityToken(); 770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 78231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block proxy->frame()->loader()->client()->didCreateIsolatedScriptContext(); 790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 81d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid V8IsolatedContext::destroy() 820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 83231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_context->get().MakeWeak(this, &contextWeakReferenceCallback); 840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 86d0825bca7fe65beaee391d30da42e937db621564Steve BlockV8IsolatedContext::~V8IsolatedContext() 870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 88231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_context->disposeHandle(); 890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} // namespace WebCore 92