diff options
Diffstat (limited to 'Source/WebCore/bindings/v8/custom/V8InjectedScriptHostCustom.cpp')
-rw-r--r-- | Source/WebCore/bindings/v8/custom/V8InjectedScriptHostCustom.cpp | 139 |
1 files changed, 6 insertions, 133 deletions
diff --git a/Source/WebCore/bindings/v8/custom/V8InjectedScriptHostCustom.cpp b/Source/WebCore/bindings/v8/custom/V8InjectedScriptHostCustom.cpp index 7a33ed0..3dbacb2 100644 --- a/Source/WebCore/bindings/v8/custom/V8InjectedScriptHostCustom.cpp +++ b/Source/WebCore/bindings/v8/custom/V8InjectedScriptHostCustom.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2009 Google Inc. All rights reserved. + * Copyright (C) 2007-2011 Google Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -31,27 +31,21 @@ #include "config.h" #include "V8InjectedScriptHost.h" -#include "DOMWindow.h" #include "Database.h" -#include "Frame.h" #include "InjectedScript.h" #include "InjectedScriptHost.h" +#include "InspectorDebuggerAgent.h" #include "InspectorValues.h" -#include "Node.h" -#include "Page.h" #include "ScriptDebugServer.h" #include "ScriptValue.h" - #include "V8Binding.h" #include "V8BindingState.h" -#include "V8DOMWindow.h" #include "V8Database.h" #include "V8HiddenPropertyName.h" #include "V8JavaScriptCallFrame.h" #include "V8Node.h" #include "V8Proxy.h" #include "V8Storage.h" -#include <wtf/RefPtr.h> namespace WebCore { @@ -71,86 +65,6 @@ ScriptValue InjectedScriptHost::nodeAsScriptValue(ScriptState* state, Node* node return ScriptValue(toV8(node)); } -static void WeakReferenceCallback(v8::Persistent<v8::Value> object, void* parameter) -{ - InjectedScriptHost* nativeObject = static_cast<InjectedScriptHost*>(parameter); - nativeObject->deref(); - object.Dispose(); -} - -static v8::Local<v8::Object> createInjectedScriptHostV8Wrapper(InjectedScriptHost* host) -{ - v8::Local<v8::Function> function = V8InjectedScriptHost::GetTemplate()->GetFunction(); - if (function.IsEmpty()) { - // Return if allocation failed. - return v8::Local<v8::Object>(); - } - v8::Local<v8::Object> instance = SafeAllocation::newInstance(function); - if (instance.IsEmpty()) { - // Avoid setting the wrapper if allocation failed. - return v8::Local<v8::Object>(); - } - V8DOMWrapper::setDOMWrapper(instance, &V8InjectedScriptHost::info, host); - // Create a weak reference to the v8 wrapper of InspectorBackend to deref - // InspectorBackend when the wrapper is garbage collected. - host->ref(); - v8::Persistent<v8::Object> weakHandle = v8::Persistent<v8::Object>::New(instance); - weakHandle.MakeWeak(host, &WeakReferenceCallback); - return instance; -} - -ScriptObject InjectedScriptHost::createInjectedScript(const String& scriptSource, ScriptState* inspectedScriptState, long id) -{ - v8::HandleScope scope; - - v8::Local<v8::Context> inspectedContext = inspectedScriptState->context(); - v8::Context::Scope contextScope(inspectedContext); - - // Call custom code to create InjectedScripHost wrapper specific for the context - // instead of calling toV8() that would create the - // wrapper in the current context. - // FIXME: make it possible to use generic bindings factory for InjectedScriptHost. - v8::Local<v8::Object> scriptHostWrapper = createInjectedScriptHostV8Wrapper(this); - if (scriptHostWrapper.IsEmpty()) - return ScriptObject(); - - v8::Local<v8::Object> windowGlobal = inspectedContext->Global(); - - // Inject javascript into the context. The compiled script is supposed to evaluate into - // a single anonymous function(it's anonymous to avoid cluttering the global object with - // inspector's stuff) the function is called a few lines below with InjectedScriptHost wrapper, - // injected script id and explicit reference to the inspected global object. The function is expected - // to create and configure InjectedScript instance that is going to be used by the inspector. - v8::Local<v8::Script> script = v8::Script::Compile(v8String(scriptSource)); - v8::Local<v8::Value> v = script->Run(); - ASSERT(!v.IsEmpty()); - ASSERT(v->IsFunction()); - - v8::Handle<v8::Value> args[] = { - scriptHostWrapper, - windowGlobal, - v8::Number::New(id), - }; - v8::Local<v8::Value> injectedScriptValue = v8::Function::Cast(*v)->Call(windowGlobal, 3, args); - v8::Local<v8::Object> injectedScript(v8::Object::Cast(*injectedScriptValue)); - return ScriptObject(inspectedScriptState, injectedScript); -} - -void InjectedScriptHost::discardInjectedScript(ScriptState* inspectedScriptState) -{ - v8::HandleScope handleScope; - v8::Local<v8::Context> context = inspectedScriptState->context(); - v8::Context::Scope contextScope(context); - - v8::Local<v8::Object> global = context->Global(); - // Skip proxy object. The proxy object will survive page navigation while we need - // an object whose lifetime consides with that of the inspected context. - global = v8::Local<v8::Object>::Cast(global->GetPrototype()); - - v8::Handle<v8::String> key = V8HiddenPropertyName::devtoolsInjectedScript(); - global->DeleteHiddenValue(key); -} - v8::Handle<v8::Value> V8InjectedScriptHost::inspectedNodeCallback(const v8::Arguments& args) { INC_STATS("InjectedScriptHost.inspectedNode()"); @@ -185,9 +99,9 @@ v8::Handle<v8::Value> V8InjectedScriptHost::inspectCallback(const v8::Arguments& return v8::Undefined(); InjectedScriptHost* host = V8InjectedScriptHost::toNative(args.Holder()); - ScriptValue objectId(args[0]); + ScriptValue object(args[0]); ScriptValue hints(args[1]); - host->inspectImpl(objectId.toInspectorValue(ScriptState::current()), hints.toInspectorValue(ScriptState::current())); + host->inspectImpl(object.toInspectorValue(ScriptState::current()), hints.toInspectorValue(ScriptState::current())); return v8::Undefined(); } @@ -196,7 +110,8 @@ v8::Handle<v8::Value> V8InjectedScriptHost::currentCallFrameCallback(const v8::A { #if ENABLE(JAVASCRIPT_DEBUGGER) INC_STATS("InjectedScriptHost.currentCallFrame()"); - return toV8(ScriptDebugServer::shared().currentCallFrame()); + InjectedScriptHost* host = V8InjectedScriptHost::toNative(args.Holder()); + return toV8(host->debuggerAgent()->scriptDebugServer().currentCallFrame()); #else UNUSED_PARAM(args); return v8::Undefined(); @@ -231,46 +146,4 @@ v8::Handle<v8::Value> V8InjectedScriptHost::storageIdCallback(const v8::Argument return v8::Undefined(); } -InjectedScript InjectedScriptHost::injectedScriptFor(ScriptState* inspectedScriptState) -{ - v8::HandleScope handleScope; - v8::Local<v8::Context> context = inspectedScriptState->context(); - v8::Context::Scope contextScope(context); - - v8::Local<v8::Object> global = context->Global(); - // Skip proxy object. The proxy object will survive page navigation while we need - // an object whose lifetime consides with that of the inspected context. - global = v8::Local<v8::Object>::Cast(global->GetPrototype()); - - v8::Handle<v8::String> key = V8HiddenPropertyName::devtoolsInjectedScript(); - v8::Local<v8::Value> val = global->GetHiddenValue(key); - if (!val.IsEmpty() && val->IsObject()) - return InjectedScript(ScriptObject(inspectedScriptState, v8::Local<v8::Object>::Cast(val))); - - if (!canAccessInspectedWindow(inspectedScriptState)) - return InjectedScript(); - - pair<long, ScriptObject> injectedScript = injectScript(injectedScriptSource(), inspectedScriptState); - InjectedScript result(injectedScript.second); - m_idToInjectedScript.set(injectedScript.first, result); - global->SetHiddenValue(key, injectedScript.second.v8Object()); - return result; -} - -bool InjectedScriptHost::canAccessInspectedWindow(ScriptState* scriptState) -{ - v8::HandleScope handleScope; - v8::Local<v8::Context> context = scriptState->context(); - v8::Local<v8::Object> global = context->Global(); - if (global.IsEmpty()) - return false; - v8::Handle<v8::Object> holder = V8DOMWrapper::lookupDOMWrapper(V8DOMWindow::GetTemplate(), global); - if (holder.IsEmpty()) - return false; - Frame* frame = V8DOMWindow::toNative(holder)->frame(); - - v8::Context::Scope contextScope(context); - return V8BindingSecurity::canAccessFrame(V8BindingState::Only(), frame, false); -} - } // namespace WebCore |