webengine/osswebengine/WebKitTools/Drosera/mac/DebuggerDocumentPlatform.mm
changeset 0 dd21522fd290
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webengine/osswebengine/WebKitTools/Drosera/mac/DebuggerDocumentPlatform.mm	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2006, 2007 Apple Inc.  All rights reserved.
+ * Copyright (C) 2006, 2007 Vladimir Olexa (vladimir.olexa@gmail.com)
+ *
+ * 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.
+ */
+
+#import "DebuggerDocument.h"
+
+#import "DebuggerClient.h"
+
+#import <JavaScriptCore/JSRetainPtr.h>
+#import <JavaScriptCore/JSStringRefCF.h>
+#import <JavaScriptCore/RetainPtr.h>
+
+NSString* NSStringCreateWithJSStringRef(JSStringRef jsString)
+{
+    CFStringRef cfString = JSStringCopyCFString(kCFAllocatorDefault, jsString);
+    return (NSString *)cfString;
+}
+
+JSValueRef JSValueRefCreateWithNSString(JSContextRef context, NSString* nsString)
+{
+    JSRetainPtr<JSStringRef> jsString(Adopt, JSStringCreateWithCFString((CFStringRef)nsString));
+    return JSValueMakeString(context, jsString.get());
+}
+
+@interface NSString (WebScriptStringExtras)
++ (NSString *)stringOrNilFromWebScriptResult:(id)scriptResult;
+@end
+
+@implementation NSString (WebScriptStringExtras)
++ (NSString *)stringOrNilFromWebScriptResult:(id)scriptResult
+{
+    NSString *ret = nil;
+
+   if ([scriptResult isKindOfClass:NSClassFromString(@"WebScriptObject")])
+       ret = [scriptResult callWebScriptMethod:@"toString" withArguments:nil];
+   else if (scriptResult && ![scriptResult isKindOfClass:[NSString class]])
+       ret = [scriptResult description];
+   else if (scriptResult)
+       ret = scriptResult;
+
+    return ret;
+}
+@end
+
+@interface DebuggerClient (DebuggerExtras)
+- (void)pause;
+- (void)resume;
+- (void)stepInto;
+- (WebScriptCallFrame *)currentFrame;
+- (NSArray *)webScriptAttributeKeysForScriptObject:(WebScriptObject *)object;
++ (void)log:(NSString *)msg;
+@end
+
+// DebuggerDocument platform specific implementations
+
+void DebuggerDocument::platformPause()
+{
+    [m_debuggerClient pause];
+}
+
+void DebuggerDocument::platformResume()
+{
+    [m_debuggerClient resume];
+}
+
+void DebuggerDocument::platformStepInto()
+{
+    [m_debuggerClient stepInto];
+}
+
+JSValueRef DebuggerDocument::platformEvaluateScript(JSContextRef context, JSStringRef script, int callFrame)
+{
+    WebScriptCallFrame *cframe = [m_debuggerClient currentFrame];
+    for (unsigned count = 0; count < callFrame; count++)
+        cframe = [cframe caller];
+
+    if (!cframe)
+        return JSValueMakeUndefined(context);
+    
+    RetainPtr<NSString *> scriptNS(AdoptNS, NSStringCreateWithJSStringRef(script));
+    id value = [cframe evaluateWebScript:scriptNS.get()];
+
+    return JSValueRefCreateWithNSString(context, [NSString stringOrNilFromWebScriptResult:value]);
+}
+
+void DebuggerDocument::getPlatformCurrentFunctionStack(JSContextRef context, Vector<JSValueRef>& currentStack)
+{
+    for (WebScriptCallFrame *frame = [m_debuggerClient currentFrame]; frame;) {
+        CFStringRef function;
+        if ([frame functionName])
+            function = (CFStringRef)[frame functionName];
+        else if ([frame caller])
+            function = CFSTR("(anonymous function)");
+        else
+            function = CFSTR("(global scope)");
+        frame = [frame caller];
+
+        currentStack.append(JSValueRefCreateWithNSString(context, (NSString *)function));
+    }
+}
+
+void DebuggerDocument::getPlatformLocalScopeVariableNamesForCallFrame(JSContextRef context, int callFrame, Vector<JSValueRef>& variableNames)
+{
+    WebScriptCallFrame *cframe = [m_debuggerClient currentFrame];
+    for (unsigned count = 0; count < callFrame; count++)
+        cframe = [cframe caller];
+
+    if (!cframe)
+        return;
+    if (![[cframe scopeChain] count])
+        return;
+
+    WebScriptObject *scope = [[cframe scopeChain] objectAtIndex:0]; // local is always first
+    NSArray *localScopeVariableNames = [m_debuggerClient webScriptAttributeKeysForScriptObject:scope];
+
+    for (int i = 0; i < [localScopeVariableNames count]; ++i) {
+        variableNames.append(JSValueRefCreateWithNSString(context, [localScopeVariableNames objectAtIndex:i]));
+    }
+}
+
+JSValueRef DebuggerDocument::platformValueForScopeVariableNamed(JSContextRef context, JSStringRef key, int callFrame)
+{
+    WebScriptCallFrame *cframe = [m_debuggerClient currentFrame];
+    for (unsigned count = 0; count < callFrame; count++)
+        cframe = [cframe caller];
+
+    if (!cframe)
+        return JSValueMakeUndefined(context);
+
+    unsigned scopeCount = [[cframe scopeChain] count];
+    
+    if (!scopeCount)
+        return JSValueMakeUndefined(context);
+
+    NSString *resultString = nil;
+    
+    for (unsigned i = 0; i < scopeCount && resultString == nil; i++) {
+        WebScriptObject *scope = [[cframe scopeChain] objectAtIndex:i];
+        
+        id value = nil;
+        @try {
+            RetainPtr<NSString *> keyNS(AdoptNS, NSStringCreateWithJSStringRef(key));
+            value = [scope valueForKey:keyNS.get()];
+        } @catch(NSException* localException) { // The value wasn't found.
+        }
+
+        resultString = [NSString stringOrNilFromWebScriptResult:value];
+    }
+
+    if (!resultString)
+        return JSValueMakeUndefined(context);
+
+    return JSValueRefCreateWithNSString(context, resultString);
+}
+
+void DebuggerDocument::platformLog(JSStringRef msg)
+{
+    RetainPtr<NSString *> msgNS(AdoptNS, NSStringCreateWithJSStringRef(msg));
+    [DebuggerClient log:msgNS.get()];
+}
+