Changeset 53119 in webkit
- Timestamp:
- Jan 12, 2010 12:18:48 AM (14 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r53114 r53119 1 2010-01-12 Yury Semikhatsky <yurys@chromium.org> 2 3 Reviewed by Geoffrey Garen. 4 5 Allow creating injected script for the inspected script state. The InjectedScript is 6 cached on the inspected ExecState global object and will be garbage collected when the 7 object is collected. Each InjectedScript object is assigned unique id. 8 9 https://bugs.webkit.org/show_bug.cgi?id=33469 10 11 * bindings/js/JSDOMGlobalObject.cpp: 12 (WebCore::JSDOMGlobalObject::markChildren): 13 (WebCore::JSDOMGlobalObject::setInjectedScript): 14 (WebCore::JSDOMGlobalObject::injectedScript): 15 * bindings/js/JSDOMGlobalObject.h: InjectedScript is cached on the global object as a 16 field that is not visible from the inspected code. This InjectedScript should be alive as long as 17 the global object is alive and should be accessible from Web Inspector's native code. 18 (WebCore::JSDOMGlobalObject::JSDOMGlobalObjectData::JSDOMGlobalObjectData): 19 * bindings/js/JSInjectedScriptHostCustom.cpp: 20 (WebCore::createInjectedScript): Creates injected script using the lexical global object of the 21 inspected ScriptState. Reference to the object is stored on the global DOM object. 22 (WebCore::InjectedScriptHost::injectedScriptFor): 23 * inspector/InjectedScriptHost.cpp: 24 (WebCore::InjectedScriptHost::InjectedScriptHost): 25 (WebCore::InjectedScriptHost::injectedScriptForId): 26 (WebCore::InjectedScriptHost::discardInjectedScripts): This method is expected to be called when the 27 the InjectedScript are no longer needed. In particular, this should be called before frame navigation. 28 * inspector/InjectedScriptHost.h: 29 (WebCore::InjectedScriptHost::setInjectedScriptSource): This allows to provide injected script source. 30 The source may be loaded in a platform specific way. 31 1 32 2010-01-11 Darin Adler <darin@apple.com> 2 33 -
trunk/WebCore/bindings/js/JSDOMGlobalObject.cpp
r49963 r53119 57 57 for (JSDOMConstructorMap::iterator it2 = constructors().begin(); it2 != end2; ++it2) 58 58 markStack.append(it2->second); 59 60 if (d()->m_injectedScript) 61 markStack.append(d()->m_injectedScript); 59 62 } 60 63 … … 75 78 { 76 79 return d()->evt; 80 } 81 82 void JSDOMGlobalObject::setInjectedScript(JSObject* injectedScript) 83 { 84 d()->m_injectedScript = injectedScript; 85 } 86 87 JSObject* JSDOMGlobalObject::injectedScript() const 88 { 89 return d()->m_injectedScript; 77 90 } 78 91 -
trunk/WebCore/bindings/js/JSDOMGlobalObject.h
r51330 r53119 65 65 Event* currentEvent() const; 66 66 67 void setInjectedScript(JSObject*); 68 JSObject* injectedScript() const; 69 67 70 virtual void markChildren(JSC::MarkStack&); 68 71 … … 75 78 , evt(0) 76 79 , m_world(world) 80 , m_injectedScript(0) 77 81 { 78 82 } … … 83 87 Event* evt; 84 88 RefPtr<DOMWrapperWorld> m_world; 89 JSObject* m_injectedScript; 85 90 }; 86 91 -
trunk/WebCore/bindings/js/JSInjectedScriptHostCustom.cpp
r52556 r53119 60 60 #include "TextIterator.h" 61 61 #include "VisiblePosition.h" 62 #include <parser/SourceCode.h> 62 63 #include <runtime/JSArray.h> 63 64 #include <runtime/JSLock.h> … … 74 75 namespace WebCore { 75 76 77 static ScriptObject createInjectedScript(const String& source, InjectedScriptHost* injectedScriptHost, ScriptState* scriptState, long id) 78 { 79 SourceCode sourceCode = makeSource(source); 80 JSLock lock(SilenceAssertionsOnly); 81 JSDOMGlobalObject* globalObject = static_cast<JSDOMGlobalObject*>(scriptState->lexicalGlobalObject()); 82 JSValue globalThisValue = scriptState->globalThisValue(); 83 Completion comp = JSC::evaluate(scriptState, globalObject->globalScopeChain(), sourceCode, globalThisValue); 84 if (comp.complType() != JSC::Normal && comp.complType() != JSC::ReturnValue) 85 return ScriptObject(); 86 JSValue functionValue = comp.value(); 87 CallData callData; 88 CallType callType = functionValue.getCallData(callData); 89 if (callType == CallTypeNone) 90 return ScriptObject(); 91 92 MarkedArgumentBuffer args; 93 args.append(toJS(scriptState, globalObject, injectedScriptHost)); 94 args.append(globalThisValue); 95 args.append(jsNumber(scriptState, id)); 96 JSValue result = JSC::call(scriptState, functionValue, callType, callData, globalThisValue, args); 97 if (result.isObject()) 98 return ScriptObject(scriptState, result.getObject()); 99 return ScriptObject(); 100 } 101 76 102 #if ENABLE(DATABASE) 77 103 JSValue JSInjectedScriptHost::databaseForId(ExecState* exec, const ArgList& args) … … 216 242 #endif 217 243 244 ScriptObject InjectedScriptHost::injectedScriptFor(ScriptState* scriptState) 245 { 246 JSLock lock(SilenceAssertionsOnly); 247 JSDOMGlobalObject* globalObject = static_cast<JSDOMGlobalObject*>(scriptState->lexicalGlobalObject()); 248 JSObject* injectedScript = globalObject->injectedScript(); 249 if (injectedScript) 250 return ScriptObject(scriptState, injectedScript); 251 252 ASSERT(!m_injectedScriptSource.isEmpty()); 253 ScriptObject injectedScriptObject = createInjectedScript(m_injectedScriptSource, this, scriptState, m_nextInjectedScriptId); 254 globalObject->setInjectedScript(injectedScriptObject.jsObject()); 255 m_idToInjectedScript.set(m_nextInjectedScriptId, injectedScriptObject); 256 m_nextInjectedScriptId++; 257 return injectedScriptObject; 258 } 259 218 260 } // namespace WebCore 219 261 -
trunk/WebCore/inspector/InjectedScriptHost.cpp
r52556 r53119 73 73 InjectedScriptHost::InjectedScriptHost(InspectorController* inspectorController) 74 74 : m_inspectorController(inspectorController) 75 , m_nextInjectedScriptId(1) 75 76 { 76 77 } … … 181 182 } 182 183 184 ScriptObject InjectedScriptHost::injectedScriptForId(long id) 185 { 186 return m_idToInjectedScript.get(id); 187 } 188 189 void InjectedScriptHost::discardInjectedScripts() 190 { 191 m_idToInjectedScript.clear(); 192 } 193 183 194 InspectorDOMAgent* InjectedScriptHost::inspectorDOMAgent() 184 195 { -
trunk/WebCore/inspector/InjectedScriptHost.h
r52556 r53119 34 34 #include "InspectorController.h" 35 35 #include "PlatformString.h" 36 #include "ScriptState.h" 36 37 38 #include <wtf/HashMap.h> 37 39 #include <wtf/RefCounted.h> 38 40 … … 55 57 56 58 ~InjectedScriptHost(); 59 60 void setInjectedScriptSource(const String& source) { m_injectedScriptSource = source; } 57 61 58 62 InspectorController* inspectorController() { return m_inspectorController; } … … 82 86 void reportDidDispatchOnInjectedScript(long callId, const String& result, bool isException); 83 87 88 ScriptObject injectedScriptFor(ScriptState*); 89 ScriptObject injectedScriptForId(long); 90 void discardInjectedScripts(); 91 84 92 private: 85 93 InjectedScriptHost(InspectorController* inspectorController); … … 88 96 89 97 InspectorController* m_inspectorController; 98 String m_injectedScriptSource; 99 long m_nextInjectedScriptId; 100 typedef HashMap<long, ScriptObject> IdToInjectedScriptMap; 101 IdToInjectedScriptMap m_idToInjectedScript; 90 102 }; 91 103
Note: See TracChangeset
for help on using the changeset viewer.