15f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian/* 25f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * Copyright (C) 2008, 2009 Google Inc. All rights reserved. 35f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * Copyright (C) 2009 Apple Inc. All rights reserved. 45f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * 55f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * Redistribution and use in source and binary forms, with or without 65f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * modification, are permitted provided that the following conditions are 75f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * met: 85f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * 95f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * * Redistributions of source code must retain the above copyright 105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * notice, this list of conditions and the following disclaimer. 115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * * Redistributions in binary form must reproduce the above 125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * copyright notice, this list of conditions and the following disclaimer 135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * in the documentation and/or other materials provided with the 145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * distribution. 155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * * Neither the name of Google Inc. nor the names of its 165f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * contributors may be used to endorse or promote products derived from 175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * this software without specific prior written permission. 185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * 195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian */ 315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "config.h" 335f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "ScriptController.h" 345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 35b9ca2665dcffd57d63df89bca0444f1cee8d0feeAndrei Popescu#include "PlatformBridge.h" 365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "Document.h" 37967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#include "ScriptCallStack.h" 3828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "ScriptCallStackFactory.h" 39ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#include "ScriptableDocumentParser.h" 405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "DOMWindow.h" 415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "Event.h" 425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "EventListener.h" 435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "EventNames.h" 445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "Frame.h" 45643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "FrameLoaderClient.h" 465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "Node.h" 475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "NotImplemented.h" 480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "npruntime_impl.h" 495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "npruntime_priv.h" 505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "NPV8Object.h" 515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "ScriptSourceCode.h" 52643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "Settings.h" 53dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "UserGestureIndicator.h" 545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "V8Binding.h" 55d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "V8BindingState.h" 565e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include "V8DOMWindow.h" 57d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "V8Event.h" 58ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#include "V8HiddenPropertyName.h" 595e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include "V8HTMLEmbedElement.h" 60d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "V8IsolatedContext.h" 615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "V8NPObject.h" 625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "V8Proxy.h" 63643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "Widget.h" 64643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <wtf/StdLibExtras.h> 65dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <wtf/text/CString.h> 665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 6768513a70bcd92384395513322f1b801e7bf9c729Steve Block#if PLATFORM(QT) 6868513a70bcd92384395513322f1b801e7bf9c729Steve Block#include <QScriptEngine> 6968513a70bcd92384395513322f1b801e7bf9c729Steve Block#endif 7068513a70bcd92384395513322f1b801e7bf9c729Steve Block 715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qiannamespace WebCore { 725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 733a209a6ece975c026508762103516b7d0e55c18aSteve Blockvoid ScriptController::initializeThreading() 743a209a6ece975c026508762103516b7d0e55c18aSteve Block{ 753a209a6ece975c026508762103516b7d0e55c18aSteve Block static bool initializedThreading = false; 763a209a6ece975c026508762103516b7d0e55c18aSteve Block if (!initializedThreading) { 773a209a6ece975c026508762103516b7d0e55c18aSteve Block WTF::initializeThreading(); 7821939df44de1705786c545cd1bf519d47250322dBen Murdoch WTF::initializeMainThread(); 793a209a6ece975c026508762103516b7d0e55c18aSteve Block initializedThreading = true; 803a209a6ece975c026508762103516b7d0e55c18aSteve Block } 813a209a6ece975c026508762103516b7d0e55c18aSteve Block} 823a209a6ece975c026508762103516b7d0e55c18aSteve Block 835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid ScriptController::setFlags(const char* string, int length) 845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 855f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian v8::V8::SetFlagsFromString(string, length); 865f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 875f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 885f1ab04193ad0130ca8204aadaceae083aca9881Feng QianFrame* ScriptController::retrieveFrameForEnteredContext() 895f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return V8Proxy::retrieveFrameForEnteredContext(); 915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 935f1ab04193ad0130ca8204aadaceae083aca9881Feng QianFrame* ScriptController::retrieveFrameForCurrentContext() 945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return V8Proxy::retrieveFrameForCurrentContext(); 965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 975f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 98e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockbool ScriptController::canAccessFromCurrentOrigin(Frame *frame) 99e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block{ 100e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block return !v8::Context::InContext() || V8BindingSecurity::canAccessFrame(V8BindingState::Only(), frame, true); 101e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block} 102e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block 1035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianbool ScriptController::isSafeScript(Frame* target) 1045f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 105d0825bca7fe65beaee391d30da42e937db621564Steve Block return V8BindingSecurity::canAccessFrame(V8BindingState::Only(), target, true); 1065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 1075f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 1085f1ab04193ad0130ca8204aadaceae083aca9881Feng QianScriptController::ScriptController(Frame* frame) 1095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian : m_frame(frame) 1105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian , m_sourceURL(0) 111cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block , m_inExecuteScript(false) 1125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian , m_processingTimerCallback(false) 1135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian , m_paused(false) 114bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen , m_allowPopupsFromPlugin(false) 1155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian , m_proxy(new V8Proxy(frame)) 1165f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if ENABLE(NETSCAPE_PLUGIN_API) 1175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian , m_windowScriptNPObject(0) 1185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif 1195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 1205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 1215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 1225f1ab04193ad0130ca8204aadaceae083aca9881Feng QianScriptController::~ScriptController() 1235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 1245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_proxy->disconnectFrame(); 1255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 1265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 1275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid ScriptController::clearScriptObjects() 1285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 1295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian PluginObjectMap::iterator it = m_pluginObjects.begin(); 1305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian for (; it != m_pluginObjects.end(); ++it) { 1315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian _NPN_UnregisterObject(it->second); 1320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch _NPN_ReleaseObject(it->second); 1335f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 1345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_pluginObjects.clear(); 1355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 1365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if ENABLE(NETSCAPE_PLUGIN_API) 1375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (m_windowScriptNPObject) { 1385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // Call _NPN_DeallocateObject() instead of _NPN_ReleaseObject() so that we don't leak if a plugin fails to release the window 1395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // script object properly. 1405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // This shouldn't cause any problems for plugins since they should have already been stopped and destroyed at this point. 1415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian _NPN_DeallocateObject(m_windowScriptNPObject); 1425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_windowScriptNPObject = 0; 1435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 1445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif 1455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 1465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 1475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid ScriptController::updateSecurityOrigin() 1485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 149d0825bca7fe65beaee391d30da42e937db621564Steve Block m_proxy->windowShell()->updateSecurityOrigin(); 1505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 1515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 1525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid ScriptController::updatePlatformScriptObjects() 1535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 1545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian notImplemented(); 1555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 1565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 157f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickbool ScriptController::processingUserGesture() 1585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 159f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick Frame* activeFrame = V8Proxy::retrieveFrameForEnteredContext(); 160dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // No script is running, so it is user-initiated unless the gesture stack 161dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // explicitly says it is not. 162f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (!activeFrame) 1636c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return UserGestureIndicator::getUserGestureState() != DefinitelyNotProcessingUserGesture; 1645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 165f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick V8Proxy* activeProxy = activeFrame->script()->proxy(); 166f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 1675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian v8::HandleScope handleScope; 168f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick v8::Handle<v8::Context> v8Context = V8Proxy::mainWorldContext(activeFrame); 1695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // FIXME: find all cases context can be empty: 1705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // 1) JS is disabled; 1715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // 2) page is NULL; 1720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (v8Context.IsEmpty()) 1735f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return true; 1745f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 1750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch v8::Context::Scope scope(v8Context); 1765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 1770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch v8::Handle<v8::Object> global = v8Context->Global(); 178ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block v8::Handle<v8::String> eventSymbol = V8HiddenPropertyName::event(); 179ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block v8::Handle<v8::Value> jsEvent = global->GetHiddenValue(eventSymbol); 180692e5dbf12901edacf14812a6fae25462920af42Steve Block Event* event = V8DOMWrapper::isValidDOMObject(jsEvent) ? V8Event::toNative(v8::Handle<v8::Object>::Cast(jsEvent)) : 0; 1815f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 182ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // Based on code from JSC's ScriptController::processingUserGesture. 1835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // Note: This is more liberal than Firefox's implementation. 1845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (event) { 185ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // Event::fromUserGesture will return false when UserGestureIndicator::processingUserGesture() returns false. 186ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block return event->fromUserGesture(); 187ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block } 188f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick // FIXME: We check the javascript anchor navigation from the last entered 189f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick // frame becuase it should only be initiated on the last entered frame in 190f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick // which execution began if it does happen. 191f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick const String* sourceURL = activeFrame->script()->sourceURL(); 192f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (sourceURL && sourceURL->isNull() && !activeProxy->timerCallback()) { 1935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // This is the <a href="javascript:window.open('...')> case -> we let it through. 1945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return true; 1955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 196bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (activeFrame->script()->allowPopupsFromPlugin()) 197bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return true; 1985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // This is the <script>window.open(...)</script> case or a timer callback -> block it. 199ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // Based on JSC version, use returned value of UserGestureIndicator::processingUserGesture for all other situations. 200ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block return UserGestureIndicator::processingUserGesture(); 2015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 2025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 203d0825bca7fe65beaee391d30da42e937db621564Steve Blockbool ScriptController::anyPageIsProcessingUserGesture() const 204d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 205d0825bca7fe65beaee391d30da42e937db621564Steve Block // FIXME: is this right? 206f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick return ScriptController::processingUserGesture(); 207d0825bca7fe65beaee391d30da42e937db621564Steve Block} 208d0825bca7fe65beaee391d30da42e937db621564Steve Block 209231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid ScriptController::evaluateInIsolatedWorld(unsigned worldID, const Vector<ScriptSourceCode>& sources) 2105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 211231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_proxy->evaluateInIsolatedWorld(worldID, sources, 0); 212231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} 213231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 214231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid ScriptController::evaluateInIsolatedWorld(unsigned worldID, const Vector<ScriptSourceCode>& sources, int extensionGroup) 215231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{ 216231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_proxy->evaluateInIsolatedWorld(worldID, sources, extensionGroup); 2170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 2180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// Evaluate a script file in the environment of this proxy. 2202fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockScriptValue ScriptController::evaluate(const ScriptSourceCode& sourceCode) 2215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 2220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch String sourceURL = sourceCode.url(); 223dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block const String* savedSourceURL = m_sourceURL; 224dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_sourceURL = &sourceURL; 225dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 2265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian v8::HandleScope handleScope; 2270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch v8::Handle<v8::Context> v8Context = V8Proxy::mainWorldContext(m_proxy->frame()); 2280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (v8Context.IsEmpty()) 2295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return ScriptValue(); 2305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 2310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch v8::Context::Scope scope(v8Context); 2325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 2335f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian RefPtr<Frame> protect(m_frame); 2345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 2355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian v8::Local<v8::Value> object = m_proxy->evaluate(sourceCode, 0); 2365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 2375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // Evaluating the JavaScript could cause the frame to be deallocated 238dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // so we start the keep alive timer here. 2395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_frame->keepAlive(); 2405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 241dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_sourceURL = savedSourceURL; 242dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 24381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (object.IsEmpty()) 2445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return ScriptValue(); 2455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 2465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return ScriptValue(object); 2475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 2485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 2496b70adc33054f8aee8c54d0f460458a9df11b8a5Russell BrennerTextPosition0 ScriptController::eventHandlerPosition() const 2505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 251ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block ScriptableDocumentParser* parser = m_frame->document()->scriptableDocumentParser(); 252ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block if (parser) 2536b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return parser->textPosition(); 2546b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return TextPosition0::minimumPosition(); 2555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 2565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 2575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid ScriptController::finishedWithEvent(Event* event) 2585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 2595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_proxy->finishedWithEvent(event); 2605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 2615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 2625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// Create a V8 object with an interceptor of NPObjectPropertyGetter. 2635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid ScriptController::bindToWindowObject(Frame* frame, const String& key, NPObject* object) 2645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 2655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian v8::HandleScope handleScope; 2665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 2670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch v8::Handle<v8::Context> v8Context = V8Proxy::mainWorldContext(frame); 2680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (v8Context.IsEmpty()) 2695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return; 2705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 2710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch v8::Context::Scope scope(v8Context); 2725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 2730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch v8::Handle<v8::Object> value = createV8ObjectForNPObject(object, 0); 2745f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 2755f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // Attach to the global object. 2760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch v8::Handle<v8::Object> global = v8Context->Global(); 2775f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian global->Set(v8String(key), value); 2785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 2795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 2805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid ScriptController::collectGarbage() 2815f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 2825f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian v8::HandleScope handleScope; 283e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke 284e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke v8::Persistent<v8::Context> v8Context = v8::Context::New(); 2850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (v8Context.IsEmpty()) 2865f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return; 287e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke { 288e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke v8::Context::Scope scope(v8Context); 289e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke v8::Local<v8::String> source = v8::String::New("if (gc) gc();"); 290e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke v8::Local<v8::String> name = v8::String::New("gc"); 291e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke v8::Handle<v8::Script> script = v8::Script::Compile(source, name); 292e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke if (!script.IsEmpty()) 293e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke script->Run(); 294e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke } 295e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke v8Context.Dispose(); 29652559759e1a4787355bb696c2087b66106a743aaAndrei Popescu} 29752559759e1a4787355bb696c2087b66106a743aaAndrei Popescu 29852559759e1a4787355bb696c2087b66106a743aaAndrei Popescuvoid ScriptController::lowMemoryNotification() 29952559759e1a4787355bb696c2087b66106a743aaAndrei Popescu{ 30052559759e1a4787355bb696c2087b66106a743aaAndrei Popescu v8::V8::LowMemoryNotification(); 3015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 3025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 3035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianbool ScriptController::haveInterpreter() const 3045f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 305d0825bca7fe65beaee391d30da42e937db621564Steve Block return m_proxy->windowShell()->isContextInitialized(); 3065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 3075f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 3085f1ab04193ad0130ca8204aadaceae083aca9881Feng QianPassScriptInstance ScriptController::createScriptInstanceForWidget(Widget* widget) 3095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 3105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian ASSERT(widget); 3115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 3125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (widget->isFrameView()) 3135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return 0; 3145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 315b9ca2665dcffd57d63df89bca0444f1cee8d0feeAndrei Popescu NPObject* npObject = PlatformBridge::pluginScriptableObject(widget); 316616ad0c2b4a8561fcf943605dd2b64725bc41145Feng Qian 317616ad0c2b4a8561fcf943605dd2b64725bc41145Feng Qian if (!npObject) 318616ad0c2b4a8561fcf943605dd2b64725bc41145Feng Qian return 0; 319616ad0c2b4a8561fcf943605dd2b64725bc41145Feng Qian 3205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // Frame Memory Management for NPObjects 3215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // ------------------------------------- 3225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // NPObjects are treated differently than other objects wrapped by JS. 3235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // NPObjects can be created either by the browser (e.g. the main 3245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // window object) or by the plugin (the main plugin object 3255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // for a HTMLEmbedElement). Further, unlike most DOM Objects, the frame 3265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // is especially careful to ensure NPObjects terminate at frame teardown because 3275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // if a plugin leaks a reference, it could leak its objects (or the browser's objects). 3285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // 3295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // The Frame maintains a list of plugin objects (m_pluginObjects) 3305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // which it can use to quickly find the wrapped embed object. 3315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // 3325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // Inside the NPRuntime, we've added a few methods for registering 3335f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // wrapped NPObjects. The purpose of the registration is because 3345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // javascript garbage collection is non-deterministic, yet we need to 3355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // be able to tear down the plugin objects immediately. When an object 3365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // is registered, javascript can use it. When the object is destroyed, 3375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // or when the object's "owning" object is destroyed, the object will 3385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // be un-registered, and the javascript engine must not use it. 3395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // 3405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // Inside the javascript engine, the engine can keep a reference to the 3415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // NPObject as part of its wrapper. However, before accessing the object 3420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // it must consult the _NPN_Registry. 3435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 3440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch v8::Local<v8::Object> wrapper = createV8ObjectForNPObject(npObject, 0); 3455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 34672dc094b5140ab6a3cd9e4984d566b8c788f5e1fGrace Kloba#ifdef ANDROID_FIX 34772dc094b5140ab6a3cd9e4984d566b8c788f5e1fGrace Kloba // TODO: this should be up streamed. 34872dc094b5140ab6a3cd9e4984d566b8c788f5e1fGrace Kloba // HTMLEmbedElement::getInstance() will call this function with its closest 34972dc094b5140ab6a3cd9e4984d566b8c788f5e1fGrace Kloba // ancestor who has the objectTag. So this "widget" may be already in the 35072dc094b5140ab6a3cd9e4984d566b8c788f5e1fGrace Kloba // HashMap. If it does, even m_pluginObjects.set() is a no-op, we do need to 35172dc094b5140ab6a3cd9e4984d566b8c788f5e1fGrace Kloba // call _NPN_ReleaseObject on the npObject to balance the reference count. 35272dc094b5140ab6a3cd9e4984d566b8c788f5e1fGrace Kloba PluginObjectMap::iterator it = m_pluginObjects.find(widget); 35372dc094b5140ab6a3cd9e4984d566b8c788f5e1fGrace Kloba if (it != m_pluginObjects.end()) { 35472dc094b5140ab6a3cd9e4984d566b8c788f5e1fGrace Kloba ASSERT(it->second == npObject); 35572dc094b5140ab6a3cd9e4984d566b8c788f5e1fGrace Kloba _NPN_ReleaseObject(it->second); 35672dc094b5140ab6a3cd9e4984d566b8c788f5e1fGrace Kloba } 35772dc094b5140ab6a3cd9e4984d566b8c788f5e1fGrace Kloba#endif 35872dc094b5140ab6a3cd9e4984d566b8c788f5e1fGrace Kloba 3595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // Track the plugin object. We've been given a reference to the object. 3605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_pluginObjects.set(widget, npObject); 3615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 3625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return V8ScriptInstance::create(wrapper); 3635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 3645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 365231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid ScriptController::cleanupScriptObjectsForPlugin(Widget* nativeHandle) 3665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 3675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian PluginObjectMap::iterator it = m_pluginObjects.find(nativeHandle); 3685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (it == m_pluginObjects.end()) 3695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return; 3705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian _NPN_UnregisterObject(it->second); 3710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch _NPN_ReleaseObject(it->second); 3725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_pluginObjects.remove(it); 3735f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 3745f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 375643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid ScriptController::getAllWorlds(Vector<DOMWrapperWorld*>& worlds) 376643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 377643ca7872b450ea4efacab6188849e5aac2ba161Steve Block worlds.append(mainThreadNormalWorld()); 378643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 379643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 3805e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockvoid ScriptController::evaluateInWorld(const ScriptSourceCode& source, 3815e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block DOMWrapperWorld* world) 3825e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{ 3835e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block Vector<ScriptSourceCode> sources; 3845e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block sources.append(source); 3855e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block // FIXME: Get an ID from the world param. 3865e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block evaluateInIsolatedWorld(0, sources); 3875e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block} 3885e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 3895f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianstatic NPObject* createNoScriptObject() 3905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 3915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian notImplemented(); 3925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return 0; 3935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 3945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 3955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianstatic NPObject* createScriptObject(Frame* frame) 3965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 3975f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian v8::HandleScope handleScope; 3980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch v8::Handle<v8::Context> v8Context = V8Proxy::mainWorldContext(frame); 3990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (v8Context.IsEmpty()) 4005f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return createNoScriptObject(); 4015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 4020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch v8::Context::Scope scope(v8Context); 4035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian DOMWindow* window = frame->domWindow(); 4045e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block v8::Handle<v8::Value> global = toV8(window); 4055f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian ASSERT(global->IsObject()); 4065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return npCreateV8ScriptObject(0, v8::Handle<v8::Object>::Cast(global), window); 4075f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 4085f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 4095f1ab04193ad0130ca8204aadaceae083aca9881Feng QianNPObject* ScriptController::windowScriptNPObject() 4105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 4115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (m_windowScriptNPObject) 4125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return m_windowScriptNPObject; 4135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 414dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (canExecuteScripts(NotAboutToExecuteScript)) { 4155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // JavaScript is enabled, so there is a JavaScript window object. 4165f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // Return an NPObject bound to the window object. 4175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_windowScriptNPObject = createScriptObject(m_frame); 4185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian _NPN_RegisterObject(m_windowScriptNPObject, 0); 4195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } else { 4205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // JavaScript is not enabled, so we cannot bind the NPObject to the 4215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // JavaScript window object. Instead, we create an NPObject of a 4225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // different class, one which is not bound to a JavaScript object. 4235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_windowScriptNPObject = createNoScriptObject(); 4245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 4255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return m_windowScriptNPObject; 4265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 4275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 4285f1ab04193ad0130ca8204aadaceae083aca9881Feng QianNPObject* ScriptController::createScriptObjectForPluginElement(HTMLPlugInElement* plugin) 4295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 4305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // Can't create NPObjects when JavaScript is disabled. 431dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!canExecuteScripts(NotAboutToExecuteScript)) 4325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return createNoScriptObject(); 4335f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 4345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian v8::HandleScope handleScope; 4350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch v8::Handle<v8::Context> v8Context = V8Proxy::mainWorldContext(m_frame); 4360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (v8Context.IsEmpty()) 4375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return createNoScriptObject(); 4380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch v8::Context::Scope scope(v8Context); 4395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 4405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian DOMWindow* window = m_frame->domWindow(); 4415e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block v8::Handle<v8::Value> v8plugin = toV8(static_cast<HTMLEmbedElement*>(plugin)); 4425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (!v8plugin->IsObject()) 4435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return createNoScriptObject(); 4445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 4455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return npCreateV8ScriptObject(0, v8::Handle<v8::Object>::Cast(v8plugin), window); 4465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 4475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 4485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 449e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockvoid ScriptController::clearWindowShell(bool) 4505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 4515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // V8 binding expects ScriptController::clearWindowShell only be called 4525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // when a frame is loading a new page. V8Proxy::clearForNavigation 4535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // creates a new context for the new page. 4545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_proxy->clearForNavigation(); 4555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 4565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 457967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#if ENABLE(INSPECTOR) 458a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid ScriptController::setCaptureCallStackForUncaughtExceptions(bool value) 459967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{ 46028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu v8::V8::SetCaptureStackTraceForUncaughtExceptions(value, ScriptCallStack::maxCallStackSizeToCapture, stackTraceOptions); 461967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch} 462967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#endif 463967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch 4645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid ScriptController::attachDebugger(void*) 4655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 4665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian notImplemented(); 4675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 4685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 4695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid ScriptController::updateDocument() 4705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 471d0825bca7fe65beaee391d30da42e937db621564Steve Block m_proxy->windowShell()->updateDocument(); 4725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 4735f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 4745af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkevoid ScriptController::namedItemAdded(HTMLDocument* doc, const AtomicString& name) 4755af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{ 476f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick m_proxy->windowShell()->namedItemAdded(doc, name); 4775af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke} 4785af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 4795af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkevoid ScriptController::namedItemRemoved(HTMLDocument* doc, const AtomicString& name) 4805af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{ 481f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick m_proxy->windowShell()->namedItemRemoved(doc, name); 4825af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke} 4835af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 4845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} // namespace WebCore 485