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