1 /* 2 * Copyright (C) 2010 Google Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google Inc. nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 #include "config.h" 32 #include "InjectedScript.h" 33 34 #if ENABLE(INSPECTOR) 35 36 #include "Frame.h" 37 #include "InjectedScriptHost.h" 38 #include "InjectedScriptManager.h" 39 #include "InspectorValues.h" 40 #include "Node.h" 41 #include "PlatformString.h" 42 #include "ScriptFunctionCall.h" 43 44 namespace WebCore { 45 46 InjectedScript::InjectedScript() 47 : m_inspectedStateAccessCheck(0) 48 { 49 } 50 51 InjectedScript::InjectedScript(ScriptObject injectedScriptObject, InspectedStateAccessCheck accessCheck) 52 : m_injectedScriptObject(injectedScriptObject) 53 , m_inspectedStateAccessCheck(accessCheck) 54 { 55 } 56 57 void InjectedScript::evaluate(ErrorString* errorString, const String& expression, const String& objectGroup, bool includeCommandLineAPI, RefPtr<InspectorObject>* result) 58 { 59 ScriptFunctionCall function(m_injectedScriptObject, "evaluate"); 60 function.appendArgument(expression); 61 function.appendArgument(objectGroup); 62 function.appendArgument(includeCommandLineAPI); 63 makeObjectCall(errorString, function, result); 64 } 65 66 void InjectedScript::evaluateOn(ErrorString* errorString, const String& objectId, const String& expression, RefPtr<InspectorObject>* result) 67 { 68 ScriptFunctionCall function(m_injectedScriptObject, "evaluateOn"); 69 function.appendArgument(objectId); 70 function.appendArgument(expression); 71 makeObjectCall(errorString, function, result); 72 } 73 74 void InjectedScript::evaluateOnCallFrame(ErrorString* errorString, const String& callFrameId, const String& expression, const String& objectGroup, bool includeCommandLineAPI, RefPtr<InspectorObject>* result) 75 { 76 ScriptFunctionCall function(m_injectedScriptObject, "evaluateOnCallFrame"); 77 function.appendArgument(callFrameId); 78 function.appendArgument(expression); 79 function.appendArgument(objectGroup); 80 function.appendArgument(includeCommandLineAPI); 81 makeObjectCall(errorString, function, result); 82 } 83 84 void InjectedScript::getProperties(ErrorString* errorString, const String& objectId, bool ignoreHasOwnProperty, RefPtr<InspectorArray>* properties) 85 { 86 ScriptFunctionCall function(m_injectedScriptObject, "getProperties"); 87 function.appendArgument(objectId); 88 function.appendArgument(ignoreHasOwnProperty); 89 90 RefPtr<InspectorValue> result; 91 makeCall(function, &result); 92 if (!result || result->type() != InspectorValue::TypeArray) { 93 *errorString = "Internal error"; 94 return; 95 } 96 *properties = result->asArray(); 97 } 98 99 Node* InjectedScript::nodeForObjectId(const String& objectId) 100 { 101 if (hasNoValue() || !canAccessInspectedWindow()) 102 return 0; 103 104 ScriptFunctionCall function(m_injectedScriptObject, "nodeForObjectId"); 105 function.appendArgument(objectId); 106 107 bool hadException = false; 108 ScriptValue resultValue = function.call(hadException); 109 ASSERT(!hadException); 110 111 return InjectedScriptHost::scriptValueAsNode(resultValue); 112 } 113 114 void InjectedScript::setPropertyValue(ErrorString* errorString, const String& objectId, const String& propertyName, const String& expression) 115 { 116 ScriptFunctionCall function(m_injectedScriptObject, "setPropertyValue"); 117 function.appendArgument(objectId); 118 function.appendArgument(propertyName); 119 function.appendArgument(expression); 120 RefPtr<InspectorValue> result; 121 makeCall(function, &result); 122 result->asString(errorString); 123 } 124 125 void InjectedScript::releaseObject(const String& objectId) 126 { 127 ScriptFunctionCall function(m_injectedScriptObject, "releaseObject"); 128 function.appendArgument(objectId); 129 RefPtr<InspectorValue> result; 130 makeCall(function, &result); 131 } 132 133 #if ENABLE(JAVASCRIPT_DEBUGGER) 134 PassRefPtr<InspectorArray> InjectedScript::callFrames() 135 { 136 ASSERT(!hasNoValue()); 137 ScriptFunctionCall function(m_injectedScriptObject, "callFrames"); 138 ScriptValue callFramesValue = function.call(); 139 RefPtr<InspectorValue> result = callFramesValue.toInspectorValue(m_injectedScriptObject.scriptState()); 140 if (result->type() == InspectorValue::TypeArray) 141 return result->asArray(); 142 return InspectorArray::create(); 143 } 144 #endif 145 146 PassRefPtr<InspectorObject> InjectedScript::wrapObject(ScriptValue value, const String& groupName) 147 { 148 ASSERT(!hasNoValue()); 149 ScriptFunctionCall wrapFunction(m_injectedScriptObject, "wrapObject"); 150 wrapFunction.appendArgument(value); 151 wrapFunction.appendArgument(groupName); 152 wrapFunction.appendArgument(canAccessInspectedWindow()); 153 bool hadException = false; 154 ScriptValue r = wrapFunction.call(hadException); 155 if (hadException) { 156 RefPtr<InspectorObject> result = InspectorObject::create(); 157 result->setString("description", "<exception>"); 158 return result; 159 } 160 return r.toInspectorValue(m_injectedScriptObject.scriptState())->asObject(); 161 } 162 163 PassRefPtr<InspectorObject> InjectedScript::wrapNode(Node* node) 164 { 165 return wrapObject(nodeAsScriptValue(node), ""); 166 } 167 168 void InjectedScript::inspectNode(Node* node) 169 { 170 ASSERT(!hasNoValue()); 171 ScriptFunctionCall function(m_injectedScriptObject, "inspectNode"); 172 function.appendArgument(nodeAsScriptValue(node)); 173 RefPtr<InspectorValue> result; 174 makeCall(function, &result); 175 } 176 177 void InjectedScript::releaseObjectGroup(const String& objectGroup) 178 { 179 ASSERT(!hasNoValue()); 180 ScriptFunctionCall releaseFunction(m_injectedScriptObject, "releaseObjectGroup"); 181 releaseFunction.appendArgument(objectGroup); 182 releaseFunction.call(); 183 } 184 185 bool InjectedScript::canAccessInspectedWindow() 186 { 187 return m_inspectedStateAccessCheck(m_injectedScriptObject.scriptState()); 188 } 189 190 void InjectedScript::makeCall(ScriptFunctionCall& function, RefPtr<InspectorValue>* result) 191 { 192 if (hasNoValue() || !canAccessInspectedWindow()) { 193 *result = InspectorValue::null(); 194 return; 195 } 196 197 bool hadException = false; 198 ScriptValue resultValue = function.call(hadException); 199 200 ASSERT(!hadException); 201 if (!hadException) 202 *result = resultValue.toInspectorValue(m_injectedScriptObject.scriptState()); 203 else 204 *result = InspectorString::create("Exception while making a call."); 205 } 206 207 void InjectedScript::makeObjectCall(ErrorString* errorString, ScriptFunctionCall& function, RefPtr<InspectorObject>* objectResult) 208 { 209 RefPtr<InspectorValue> result; 210 makeCall(function, &result); 211 if (result && result->type() == InspectorValue::TypeString) { 212 result->asString(errorString); 213 return; 214 } 215 216 if (!result || result->type() != InspectorValue::TypeObject) { 217 *errorString = "Internal error"; 218 return; 219 } 220 *objectResult = result->asObject(); 221 } 222 223 ScriptValue InjectedScript::nodeAsScriptValue(Node* node) 224 { 225 return InjectedScriptHost::nodeAsScriptValue(m_injectedScriptObject.scriptState(), node); 226 } 227 228 } // namespace WebCore 229 230 #endif // ENABLE(INSPECTOR) 231