diff options
Diffstat (limited to 'WebKitTools/Drosera/win/DebuggerDocumentPlatform.cpp')
-rw-r--r-- | WebKitTools/Drosera/win/DebuggerDocumentPlatform.cpp | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/WebKitTools/Drosera/win/DebuggerDocumentPlatform.cpp b/WebKitTools/Drosera/win/DebuggerDocumentPlatform.cpp new file mode 100644 index 0000000..f23daf7 --- /dev/null +++ b/WebKitTools/Drosera/win/DebuggerDocumentPlatform.cpp @@ -0,0 +1,160 @@ +/* + * Copyright (C) 2007 Apple, Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "config.h" +#include "DebuggerDocument.h" + +#include "ServerConnection.h" + +#include <JavaScriptCore/JSRetainPtr.h> +#include <JavaScriptCore/JSStringRef.h> +#include <JavaScriptCore/JSStringRefBSTR.h> +#include <WebKit/WebKit.h> + +JSValueRef JSValueRefCreateWithBSTR(JSContextRef context, BSTR string) +{ + JSRetainPtr<JSStringRef> jsString(Adopt, JSStringCreateWithBSTR(string)); + return JSValueMakeString(context, jsString.get()); +} + +// DebuggerDocument platform specific implementations + +void DebuggerDocument::platformPause() +{ + m_server->pause(); +} + +void DebuggerDocument::platformResume() +{ + m_server->resume(); +} + +void DebuggerDocument::platformStepInto() +{ + m_server->stepInto(); +} + +JSValueRef DebuggerDocument::platformEvaluateScript(JSContextRef context, JSStringRef script, int callFrame) +{ + HRESULT ret = S_OK; + + COMPtr<IWebScriptCallFrame> cframe = m_server->getCallerFrame(callFrame); + if (!cframe) + return JSValueMakeUndefined(context); + + // Convert script to BSTR + BSTR scriptBSTR = JSStringCopyBSTR(script); + BSTR value = 0; + ret = cframe->stringByEvaluatingJavaScriptFromString(scriptBSTR, &value); + SysFreeString(scriptBSTR); + if (FAILED(ret)) { + SysFreeString(value); + return JSValueMakeUndefined(context); + } + + JSValueRef returnValue = JSValueRefCreateWithBSTR(context, value); + SysFreeString(value); + return returnValue; + +} + +void DebuggerDocument::getPlatformCurrentFunctionStack(JSContextRef context, Vector<JSValueRef>& currentStack) +{ + COMPtr<IWebScriptCallFrame> frame = m_server->currentFrame(); + while (frame) { + COMPtr<IWebScriptCallFrame> caller; + BSTR function = 0; + if (FAILED(frame->functionName(&function))) + return; + + if (FAILED(frame->caller(&caller))) + return; + + if (!function) { + if (caller) + function = SysAllocString(L"(anonymous function)"); + else + function = SysAllocString(L"(global scope)"); + } + + currentStack.append(JSValueRefCreateWithBSTR(context, function)); + SysFreeString(function); + + frame = caller; + } +} + +void DebuggerDocument::getPlatformLocalScopeVariableNamesForCallFrame(JSContextRef context, int callFrame, Vector<JSValueRef>& variableNames) +{ + COMPtr<IWebScriptCallFrame> cframe = m_server->getCallerFrame(callFrame); + if (!cframe) + return; + + VARIANT var; + VariantInit(&var); + + COMPtr<IEnumVARIANT> localScopeVariableNames; + if (FAILED(cframe->variableNames(&localScopeVariableNames))) + return; + + while (localScopeVariableNames->Next(1, &var, 0) == S_OK) { + ASSERT(V_VT(&var) == VT_BSTR); + BSTR variableName; + + variableName = V_BSTR(&var); + variableNames.append(JSValueRefCreateWithBSTR(context, variableName)); + + SysFreeString(variableName); + VariantClear(&var); + } +} + +JSValueRef DebuggerDocument::platformValueForScopeVariableNamed(JSContextRef context, JSStringRef key, int callFrame) +{ + COMPtr<IWebScriptCallFrame> cframe = m_server->getCallerFrame(callFrame); + if (!cframe) + return JSValueMakeUndefined(context); + + BSTR bstrKey = JSStringCopyBSTR(key); + + BSTR variableValue; + HRESULT hr = cframe->valueForVariable(bstrKey, &variableValue); + SysFreeString(bstrKey); + if (FAILED(hr)) + return JSValueMakeUndefined(context); + + JSValueRef returnValue = JSValueRefCreateWithBSTR(context, variableValue); + SysFreeString(variableValue); + + return returnValue; +} + + +void DebuggerDocument::platformLog(JSStringRef msg) +{ + printf("%S\n", JSStringGetCharactersPtr(msg)); +} |