diff options
Diffstat (limited to 'WebKitTools/Drosera/mac')
-rw-r--r-- | WebKitTools/Drosera/mac/DebuggerApplication.h | 39 | ||||
-rw-r--r-- | WebKitTools/Drosera/mac/DebuggerApplication.mm | 154 | ||||
-rw-r--r-- | WebKitTools/Drosera/mac/DebuggerClient.h | 52 | ||||
-rw-r--r-- | WebKitTools/Drosera/mac/DebuggerClient.mm | 387 | ||||
-rw-r--r-- | WebKitTools/Drosera/mac/DebuggerDocumentPlatform.mm | 205 | ||||
-rw-r--r-- | WebKitTools/Drosera/mac/Drosera.xcodeproj/project.pbxproj | 659 | ||||
-rw-r--r-- | WebKitTools/Drosera/mac/Info.plist | 30 | ||||
-rw-r--r-- | WebKitTools/Drosera/mac/LauncherInfo.plist | 26 | ||||
-rw-r--r-- | WebKitTools/Drosera/mac/Makefile | 2 | ||||
-rw-r--r-- | WebKitTools/Drosera/mac/ServerConnection.h | 53 | ||||
-rw-r--r-- | WebKitTools/Drosera/mac/ServerConnection.mm | 265 | ||||
-rw-r--r-- | WebKitTools/Drosera/mac/launcher.m | 108 | ||||
-rw-r--r-- | WebKitTools/Drosera/mac/main.m | 34 |
13 files changed, 2014 insertions, 0 deletions
diff --git a/WebKitTools/Drosera/mac/DebuggerApplication.h b/WebKitTools/Drosera/mac/DebuggerApplication.h new file mode 100644 index 0000000..4722437 --- /dev/null +++ b/WebKitTools/Drosera/mac/DebuggerApplication.h @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2006, 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. + */ + +@interface DebuggerApplication : NSObject { + NSMutableDictionary *knownServerNames; + IBOutlet NSPanel *attachWindow; + IBOutlet NSTableView *attachTable; + IBOutlet NSButton *attachButton; +} +- (IBAction)showAttachPanel:(id)sender; +- (IBAction)attach:(id)sender; + +- (NSDictionary *)knownServers; +@end diff --git a/WebKitTools/Drosera/mac/DebuggerApplication.mm b/WebKitTools/Drosera/mac/DebuggerApplication.mm new file mode 100644 index 0000000..35cfa24 --- /dev/null +++ b/WebKitTools/Drosera/mac/DebuggerApplication.mm @@ -0,0 +1,154 @@ +/* + * Copyright (C) 2006, 2007 Apple Computer, 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. + */ + +#import "config.h" +#import "DebuggerApplication.h" + +#import "DebuggerClient.h" +#import "ServerConnection.h" + +#import <WebKit/WebCoreStatistics.h> + +@implementation DebuggerApplication +- (void)awakeFromNib +{ + NSTableColumn *column = [attachTable tableColumnWithIdentifier:@"name"]; + NSBrowserCell *cell = [[NSBrowserCell alloc] init]; + [cell setLeaf:YES]; + [column setDataCell:cell]; + [cell release]; +} + +- (void)applicationDidFinishLaunching:(NSNotification *)notification +{ + [WebCoreStatistics setShouldPrintExceptions:YES]; + + knownServerNames = [[NSMutableDictionary alloc] init]; + + [[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(serverLoaded:) name:WebScriptDebugServerDidLoadNotification object:nil]; + [[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(serverLoaded:) name:WebScriptDebugServerQueryReplyNotification object:nil]; + [[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(serverUnloaded:) name:WebScriptDebugServerWillUnloadNotification object:nil]; + [[NSDistributedNotificationCenter defaultCenter] postNotificationName:WebScriptDebugServerQueryNotification object:nil]; + + [self showAttachPanel:nil]; +} + +#pragma mark - +#pragma mark Server Detection Callbacks + +- (void)serverLoaded:(NSNotification *)notification +{ + int processId = [[[notification userInfo] objectForKey:WebScriptDebugServerProcessIdentifierKey] intValue]; + if (processId == [[NSProcessInfo processInfo] processIdentifier]) + return; + + NSMutableDictionary *info = [[notification userInfo] mutableCopy]; + if (!info) + return; + [knownServerNames setObject:info forKey:[notification object]]; + [info release]; + + [attachTable reloadData]; +} + +- (void)serverUnloaded:(NSNotification *)notification +{ + [knownServerNames removeObjectForKey:[notification object]]; + [attachTable reloadData]; +} + +- (NSDictionary *)knownServers +{ + return knownServerNames; +} + +#pragma mark - +#pragma mark Attach Panel Actions + +- (IBAction)showAttachPanel:(id)sender +{ + if (![attachWindow isVisible]) + [attachWindow center]; + [attachTable reloadData]; + [attachTable setTarget:self]; + [attachTable setDoubleAction:@selector(attach:)]; + [attachWindow makeKeyAndOrderFront:sender]; +} + +- (IBAction)attach:(id)sender +{ + if ([[attachTable selectedRowIndexes] count] != 1) + return; + + [attachWindow orderOut:sender]; + + unsigned int row = [[attachTable selectedRowIndexes] firstIndex]; + NSString *key = [[knownServerNames allKeys] objectAtIndex:row]; + + DebuggerClient *document = [[DebuggerClient alloc] initWithServerName:key]; + [document showWindow:sender]; +} + +#pragma mark - +#pragma mark Table View Delegate + +- (int)numberOfRowsInTableView:(NSTableView *)tableView +{ + return [knownServerNames count]; +} + +- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row +{ + return @""; +} + +- (void)tableView:(NSTableView *)tableView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn row:(int)row +{ + NSString *key = [[knownServerNames allKeys] objectAtIndex:row]; + NSMutableDictionary *info = [knownServerNames objectForKey:key]; + NSString *processName = [info objectForKey:WebScriptDebugServerProcessNameKey]; + NSImage *icon = [info objectForKey:@"icon"]; + + if (!icon) { + NSString *path = [[NSWorkspace sharedWorkspace] fullPathForApplication:processName]; + if (path) icon = [[NSWorkspace sharedWorkspace] iconForFile:path]; + if (!icon) icon = [[NSWorkspace sharedWorkspace] iconForFileType:@"app"]; + if (icon) [info setObject:icon forKey:@"icon"]; + [icon setScalesWhenResized:YES]; + [icon setSize:NSMakeSize(32, 32)]; + } + + [cell setImage:icon]; + [cell setTitle:processName]; +} + +- (void)tableViewSelectionDidChange:(NSNotification *)notification +{ + [attachButton setEnabled:([[attachTable selectedRowIndexes] count])]; +} +@end diff --git a/WebKitTools/Drosera/mac/DebuggerClient.h b/WebKitTools/Drosera/mac/DebuggerClient.h new file mode 100644 index 0000000..808d331 --- /dev/null +++ b/WebKitTools/Drosera/mac/DebuggerClient.h @@ -0,0 +1,52 @@ +/* + * 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. + */ + +class DebuggerDocument; + +@class ServerConnection; +@class WebView; + +@interface DebuggerClient : NSWindowController +{ + IBOutlet WebView *webView; + BOOL webViewLoaded; + DebuggerDocument* debuggerDocument; + ServerConnection *server; +} + +- (id)initWithServerName:(NSString *)serverConn; +- (IBAction)pause:(id)sender; +- (IBAction)resume:(id)sender; +- (IBAction)stepInto:(id)sender; +- (IBAction)stepOver:(id)sender; +- (IBAction)stepOut:(id)sender; +- (IBAction)showConsole:(id)sender; +- (IBAction)closeCurrentFile:(id)sender; + +@end diff --git a/WebKitTools/Drosera/mac/DebuggerClient.mm b/WebKitTools/Drosera/mac/DebuggerClient.mm new file mode 100644 index 0000000..71cfa8b --- /dev/null +++ b/WebKitTools/Drosera/mac/DebuggerClient.mm @@ -0,0 +1,387 @@ +/* + * 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 "config.h" +#import "DebuggerClient.h" + +#import "DebuggerApplication.h" +#import "DebuggerDocument.h" +#import "ServerConnection.h" + +#import <JavaScriptCore/JSContextRef.h> + +static NSString *DebuggerConsoleToolbarItem = @"DebuggerConsoleToolbarItem"; +static NSString *DebuggerContinueToolbarItem = @"DebuggerContinueToolbarItem"; +static NSString *DebuggerPauseToolbarItem = @"DebuggerPauseToolbarItem"; +static NSString *DebuggerStepIntoToolbarItem = @"DebuggerStepIntoToolbarItem"; +static NSString *DebuggerStepOverToolbarItem = @"DebuggerStepOverToolbarItem"; +static NSString *DebuggerStepOutToolbarItem = @"DebuggerStepOutToolbarItem"; + +@implementation DebuggerClient ++ (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector +{ + return NO; +} + ++ (BOOL)isKeyExcludedFromWebScript:(const char *)name +{ + return NO; +} + +#pragma mark - + +- (id)initWithServerName:(NSString *)serverName; +{ + if ((self = [super init])) { + server = [[ServerConnection alloc] initWithServerName:serverName]; + debuggerDocument = new DebuggerDocument(server); + } + + return self; +} + +- (void)dealloc +{ + delete debuggerDocument; + [server release]; + [super dealloc]; +} + +#pragma mark - +#pragma mark Interface Actions + +- (IBAction)pause:(id)sender +{ + DebuggerDocument::callGlobalFunction([[webView mainFrame] globalContext], "pause", 0, 0); +} + +- (IBAction)resume:(id)sender +{ + DebuggerDocument::callGlobalFunction([[webView mainFrame] globalContext], "resume", 0, 0); +} + +- (IBAction)stepInto:(id)sender +{ + DebuggerDocument::callGlobalFunction([[webView mainFrame] globalContext], "stepInto", 0, 0); +} + +- (IBAction)stepOver:(id)sender +{ + DebuggerDocument::callGlobalFunction([[webView mainFrame] globalContext], "stepOver", 0, 0); +} + +- (IBAction)stepOut:(id)sender +{ + DebuggerDocument::callGlobalFunction([[webView mainFrame] globalContext], "stepOut", 0, 0); +} + +- (IBAction)showConsole:(id)sender +{ + DebuggerDocument::callGlobalFunction([[webView mainFrame] globalContext], "showConsoleWindow", 0, 0); +} + +- (IBAction)closeCurrentFile:(id)sender +{ + DebuggerDocument::callGlobalFunction([[webView mainFrame] globalContext], "closeCurrentFile", 0, 0); +} + +#pragma mark - +#pragma mark Window Controller Overrides + +- (NSString *)windowNibName +{ + return @"Debugger"; +} + +- (void)windowDidLoad +{ + [super windowDidLoad]; + + NSString *path = [[NSBundle mainBundle] pathForResource:@"debugger" ofType:@"html" inDirectory:nil]; + [[webView mainFrame] loadRequest:[[[NSURLRequest alloc] initWithURL:[NSURL fileURLWithPath:path]] autorelease]]; + + NSToolbar *toolbar = [[NSToolbar alloc] initWithIdentifier:@"debugger"]; + [toolbar setDelegate:self]; + [toolbar setAllowsUserCustomization:YES]; + [toolbar setAutosavesConfiguration:YES]; + [[self window] setToolbar:toolbar]; + [toolbar release]; +} + +- (void)windowWillClose:(NSNotification *)notification +{ + [[webView windowScriptObject] removeWebScriptKey:@"DebuggerDocument"]; + + [server switchToServerNamed:nil]; + + [self autorelease]; // DebuggerApplication expects us to release on close +} + +#pragma mark - +#pragma mark Toolbar Delegate + +- (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag +{ + if ([itemIdentifier isEqualToString:DebuggerContinueToolbarItem]) { + NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:itemIdentifier]; + + [item setLabel:@"Continue"]; + [item setPaletteLabel:@"Continue"]; + + [item setToolTip:@"Continue script execution"]; + [item setImage:[NSImage imageNamed:@"continue"]]; + + [item setTarget:self]; + [item setAction:@selector(resume:)]; + + return [item autorelease]; + } else if ([itemIdentifier isEqualToString:DebuggerConsoleToolbarItem]) { + NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:itemIdentifier]; + + [item setLabel:@"Console"]; + [item setPaletteLabel:@"Console"]; + + [item setToolTip:@"Console"]; + [item setImage:[NSImage imageNamed:@"console"]]; + + [item setTarget:self]; + [item setAction:@selector(showConsole:)]; + + return [item autorelease]; + } else if ([itemIdentifier isEqualToString:DebuggerPauseToolbarItem]) { + NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:itemIdentifier]; + + [item setLabel:@"Pause"]; + [item setPaletteLabel:@"Pause"]; + + [item setToolTip:@"Pause script execution"]; + [item setImage:[NSImage imageNamed:@"pause"]]; + + [item setTarget:self]; + [item setAction:@selector(pause:)]; + + return [item autorelease]; + } else if ([itemIdentifier isEqualToString:DebuggerStepIntoToolbarItem]) { + NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:itemIdentifier]; + + [item setLabel:@"Step Into"]; + [item setPaletteLabel:@"Step Into"]; + + [item setToolTip:@"Step into function call"]; + [item setImage:[NSImage imageNamed:@"step"]]; + + [item setTarget:self]; + [item setAction:@selector(stepInto:)]; + + return [item autorelease]; + } else if ([itemIdentifier isEqualToString:DebuggerStepOverToolbarItem]) { + NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:itemIdentifier]; + + [item setLabel:@"Step Over"]; + [item setPaletteLabel:@"Step Over"]; + + [item setToolTip:@"Step over function call"]; + [item setImage:[NSImage imageNamed:@"stepOver"]]; + + [item setTarget:self]; + [item setAction:@selector(stepOver:)]; + + return [item autorelease]; + } else if ([itemIdentifier isEqualToString:DebuggerStepOutToolbarItem]) { + NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:itemIdentifier]; + + [item setLabel:@"Step Out"]; + [item setPaletteLabel:@"Step Over"]; + + [item setToolTip:@"Step out of current function"]; + [item setImage:[NSImage imageNamed:@"stepOut"]]; + + [item setTarget:self]; + [item setAction:@selector(stepOut:)]; + + return [item autorelease]; + } + + return nil; +} + +- (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar*)toolbar +{ + return [NSArray arrayWithObjects:DebuggerContinueToolbarItem, DebuggerPauseToolbarItem, + NSToolbarSeparatorItemIdentifier, DebuggerStepIntoToolbarItem, DebuggerStepOutToolbarItem, + DebuggerStepOverToolbarItem, NSToolbarFlexibleSpaceItemIdentifier, DebuggerConsoleToolbarItem, nil]; +} + +- (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar*)toolbar +{ + return [NSArray arrayWithObjects:DebuggerConsoleToolbarItem, DebuggerContinueToolbarItem, DebuggerPauseToolbarItem, + DebuggerStepIntoToolbarItem, DebuggerStepOutToolbarItem, DebuggerStepOverToolbarItem, NSToolbarCustomizeToolbarItemIdentifier, + NSToolbarFlexibleSpaceItemIdentifier, NSToolbarSpaceItemIdentifier, NSToolbarSeparatorItemIdentifier, nil]; +} + +- (BOOL)validateUserInterfaceItem:(id <NSValidatedUserInterfaceItem>)interfaceItem +{ + SEL action = [interfaceItem action]; + if (action == @selector(pause:)) { + if (!webViewLoaded) + return NO; + + return !debuggerDocument->isPaused([[webView mainFrame] globalContext]); + } + if (action == @selector(resume:) || + action == @selector(stepOver:) || + action == @selector(stepOut:) || + action == @selector(stepInto:)) { + if (!webViewLoaded) + return YES; + + return debuggerDocument->isPaused([[webView mainFrame] globalContext]); + } + return YES; +} + +#pragma mark - +#pragma mark WebView UI Delegate + +- (WebView *)webView:(WebView *)sender createWebViewWithRequest:(NSURLRequest *)request +{ + WebView *newWebView = [[WebView alloc] initWithFrame:NSZeroRect frameName:nil groupName:nil]; + [newWebView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)]; + [newWebView setUIDelegate:self]; + [newWebView setPolicyDelegate:self]; + [newWebView setFrameLoadDelegate:self]; + if (request) + [[newWebView mainFrame] loadRequest:request]; + + NSWindow *window = [[NSWindow alloc] initWithContentRect:NSZeroRect styleMask:(NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask | NSUnifiedTitleAndToolbarWindowMask) backing:NSBackingStoreBuffered defer:NO screen:[[webView window] screen]]; + [window setReleasedWhenClosed:YES]; + [newWebView setFrame:[[window contentView] frame]]; + [[window contentView] addSubview:newWebView]; + [newWebView release]; + + return newWebView; +} + +- (void)webViewShow:(WebView *)sender +{ + [[sender window] makeKeyAndOrderFront:sender]; +} + +- (BOOL)webViewAreToolbarsVisible:(WebView *)sender +{ + return [[[sender window] toolbar] isVisible]; +} + +- (void)webView:(WebView *)sender setToolbarsVisible:(BOOL)visible +{ + [[[sender window] toolbar] setVisible:visible]; +} + +- (void)webView:(WebView *)sender setResizable:(BOOL)resizable +{ + [[sender window] setShowsResizeIndicator:resizable]; + [[[sender window] standardWindowButton:NSWindowZoomButton] setEnabled:resizable]; +} + +- (void)webView:(WebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame +{ + NSRange range = [message rangeOfString:@"\t"]; + NSString *title = @"Alert"; + if (range.location != NSNotFound) { + title = [message substringToIndex:range.location]; + message = [message substringFromIndex:(range.location + range.length)]; + } + + NSBeginInformationalAlertSheet(title, nil, nil, nil, [sender window], nil, NULL, NULL, NULL, message); +} + +- (void)scriptConfirmSheetDidEnd:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(long *)contextInfo +{ + *contextInfo = returnCode; +} + +- (BOOL)webView:(WebView *)sender runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame +{ + NSRange range = [message rangeOfString:@"\t"]; + NSString *title = @"Alert"; + if (range.location != NSNotFound) { + title = [message substringToIndex:range.location]; + message = [message substringFromIndex:(range.location + range.length)]; + } + + long result = NSNotFound; + NSBeginInformationalAlertSheet(title, nil, @"Cancel", nil, [sender window], self, @selector(scriptConfirmSheetDidEnd:returnCode:contextInfo:), NULL, &result, message); + + while (result == NSNotFound) { + NSEvent *nextEvent = [[NSApplication sharedApplication] nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate distantFuture] inMode:NSDefaultRunLoopMode dequeue:YES]; + [[NSApplication sharedApplication] sendEvent:nextEvent]; + } + + return result; +} + +#pragma mark - +#pragma mark WebView Frame Load Delegate + +- (void)webView:(WebView *)sender windowScriptObjectAvailable:(WebScriptObject *)windowScriptObject +{ + // note: this is the Debuggers's own WebView, not the one being debugged + JSContextRef context = [[webView mainFrame] globalContext]; + JSObjectRef globalObject = JSContextGetGlobalObject(context); + + debuggerDocument->windowScriptObjectAvailable(context, globalObject); +} + +- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame +{ + // note: this is the Debuggers's own WebView, not the one being debugged + if ([[sender window] isEqual:[self window]]) { + webViewLoaded = YES; + [server setGlobalContext:[[webView mainFrame] globalContext]]; + } +} + +- (void)webView:(WebView *)sender didReceiveTitle:(NSString *)title forFrame:(WebFrame *)frame +{ + // note: this is the Debuggers's own WebViews, not the one being debugged + if ([frame isEqual:[sender mainFrame]]) { + NSDictionary *info = [[(DebuggerApplication *)[[NSApplication sharedApplication] delegate] knownServers] objectForKey:[server currentServerName]]; + NSString *processName = [info objectForKey:WebScriptDebugServerProcessNameKey]; + if (info && [processName length]) { + NSMutableString *newTitle = [[NSMutableString alloc] initWithString:processName]; + [newTitle appendString:@" - "]; + [newTitle appendString:title]; + [[sender window] setTitle:newTitle]; + [newTitle release]; + } else + [[sender window] setTitle:title]; + } +} + +@end diff --git a/WebKitTools/Drosera/mac/DebuggerDocumentPlatform.mm b/WebKitTools/Drosera/mac/DebuggerDocumentPlatform.mm new file mode 100644 index 0000000..b49338c --- /dev/null +++ b/WebKitTools/Drosera/mac/DebuggerDocumentPlatform.mm @@ -0,0 +1,205 @@ +/* + * 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 "config.h" +#import "DebuggerDocument.h" + +#import "DebuggerClient.h" +#import "ServerConnection.h" + +#import <JavaScriptCore/JSRetainPtr.h> +#import <JavaScriptCore/JSStringRefCF.h> +#import <JavaScriptCore/RetainPtr.h> + +// Converting string types +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 WebScriptObject (WebScriptObjectExtras) ++ (NSArray *)webScriptAttributeKeys:(WebScriptObject *)object; +@end + +@implementation WebScriptObject (WebScriptObjectExtras) ++ (NSArray *)webScriptAttributeKeys:(WebScriptObject *)object; +{ + WebScriptObject *enumerateAttributes = [object evaluateWebScript:@"(function () { var result = new Array(); for (var x in this) { result.push(x); } return result; })"]; + + NSMutableArray *result = [[NSMutableArray alloc] init]; + WebScriptObject *variables = [enumerateAttributes callWebScriptMethod:@"call" withArguments:[NSArray arrayWithObject:object]]; + unsigned length = [[variables valueForKey:@"length"] intValue]; + for (unsigned i = 0; i < length; i++) { + NSString *key = [variables webScriptValueAtIndex:i]; + [result addObject:key]; + } + + [result sortUsingSelector:@selector(compare:)]; + return [result autorelease]; +} +@end + +// DebuggerDocument platform specific implementations + +void DebuggerDocument::platformPause() +{ + [m_server.get() pause]; +} + +void DebuggerDocument::platformResume() +{ + [m_server.get() resume]; +} + +void DebuggerDocument::platformStepInto() +{ + [m_server.get() stepInto]; +} + +JSValueRef DebuggerDocument::platformEvaluateScript(JSContextRef context, JSStringRef script, int callFrame) +{ + WebScriptCallFrame *cframe = [m_server.get() 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()]; + NSString *result = [NSString stringOrNilFromWebScriptResult:value]; + if (!result) + return JSValueMakeNull(context); + + return JSValueRefCreateWithNSString(context, result); +} + +void DebuggerDocument::getPlatformCurrentFunctionStack(JSContextRef context, Vector<JSValueRef>& currentStack) +{ + for (WebScriptCallFrame *frame = [m_server.get() 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_server.get() 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 = [WebScriptObject webScriptAttributeKeys: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_server.get() 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)); + NSLog(@"%@", msgNS.get()); +} + diff --git a/WebKitTools/Drosera/mac/Drosera.xcodeproj/project.pbxproj b/WebKitTools/Drosera/mac/Drosera.xcodeproj/project.pbxproj new file mode 100644 index 0000000..3ef8b64 --- /dev/null +++ b/WebKitTools/Drosera/mac/Drosera.xcodeproj/project.pbxproj @@ -0,0 +1,659 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 42; + objects = { + +/* Begin PBXBuildFile section */ + 15CE85540ADBEA620078A734 /* fileIcon.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 15CE854F0ADBEA610078A734 /* fileIcon.jpg */; }; + 15CE85550ADBEA620078A734 /* siteCollapsed.tif in Resources */ = {isa = PBXBuildFile; fileRef = 15CE85500ADBEA610078A734 /* siteCollapsed.tif */; }; + 15CE85560ADBEA620078A734 /* siteExpanded.tif in Resources */ = {isa = PBXBuildFile; fileRef = 15CE85510ADBEA610078A734 /* siteExpanded.tif */; }; + 15CE85570ADBEA620078A734 /* siteIcon.tif in Resources */ = {isa = PBXBuildFile; fileRef = 15CE85520ADBEA610078A734 /* siteIcon.tif */; }; + 15CE85580ADBEA620078A734 /* SourceArrowOpen.png in Resources */ = {isa = PBXBuildFile; fileRef = 15CE85530ADBEA610078A734 /* SourceArrowOpen.png */; }; + 1C2632D30A4AF0A800EA7CD8 /* verticalSplitterBar.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 1C2632D10A4AF0A800EA7CD8 /* verticalSplitterBar.tiff */; }; + 1C2632D40A4AF0A800EA7CD8 /* verticalSplitterDimple.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 1C2632D20A4AF0A800EA7CD8 /* verticalSplitterDimple.tiff */; }; + 1C2632D70A4AF0B800EA7CD8 /* SourceArrow.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C2632D50A4AF0B800EA7CD8 /* SourceArrow.png */; }; + 1C2632D80A4AF0B800EA7CD8 /* SourceArrowBlank.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C2632D60A4AF0B800EA7CD8 /* SourceArrowBlank.png */; }; + 1C2632DA0A4AF0D200EA7CD8 /* background_stripe.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C2632D90A4AF0D200EA7CD8 /* background_stripe.png */; }; + 1C27ABC60A413B720016ECF4 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C27ABC50A413B720016ECF4 /* WebKit.framework */; }; + 1C27AC200A413D2D0016ECF4 /* debugger.html in Resources */ = {isa = PBXBuildFile; fileRef = 1C27AC1F0A413D2D0016ECF4 /* debugger.html */; }; + 1C27B1260A421D870016ECF4 /* debugger.js in Resources */ = {isa = PBXBuildFile; fileRef = 1C27AC230A413D660016ECF4 /* debugger.js */; }; + 1C3487980A81208400101C5C /* Drosera.icns in Resources */ = {isa = PBXBuildFile; fileRef = 1C3487970A81208400101C5C /* Drosera.icns */; }; + 1C4FF7440A44F52C0000D05D /* debugger.css in Resources */ = {isa = PBXBuildFile; fileRef = 1C4FF7430A44F5260000D05D /* debugger.css */; }; + 1C4FF7540A44F6320000D05D /* gutter.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C4FF7530A44F6320000D05D /* gutter.png */; }; + 1C4FF9210A45F3520000D05D /* glossyHeader.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C4FF91F0A45F3520000D05D /* glossyHeader.png */; }; + 1C4FF94E0A45F5060000D05D /* popUpArrows.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C4FF94D0A45F5060000D05D /* popUpArrows.png */; }; + 1C4FFE5E0A466F5D0000D05D /* programCounterBreakPoint.tif in Resources */ = {isa = PBXBuildFile; fileRef = 1C4FFE5C0A466F5D0000D05D /* programCounterBreakPoint.tif */; }; + 1C4FFE5F0A466F5D0000D05D /* programCounterBreakPointDisabled.tif in Resources */ = {isa = PBXBuildFile; fileRef = 1C4FFE5D0A466F5D0000D05D /* programCounterBreakPointDisabled.tif */; }; + 1C6F83FF0A58E97D004FCD89 /* stepOut.tif in Resources */ = {isa = PBXBuildFile; fileRef = 1C6F83FE0A58E97D004FCD89 /* stepOut.tif */; }; + 1C6F84520A58EDFE004FCD89 /* console.png in Resources */ = {isa = PBXBuildFile; fileRef = 1C6F84510A58EDFE004FCD89 /* console.png */; }; + 1C6F84550A58EE06004FCD89 /* console.css in Resources */ = {isa = PBXBuildFile; fileRef = 1C6F84530A58EE06004FCD89 /* console.css */; }; + 1C6F84560A58EE06004FCD89 /* console.html in Resources */ = {isa = PBXBuildFile; fileRef = 1C6F84540A58EE06004FCD89 /* console.html */; }; + 1C6F86730A59A18B004FCD89 /* console.js in Resources */ = {isa = PBXBuildFile; fileRef = 1C6F861F0A599F65004FCD89 /* console.js */; }; + 1C74F0350A47BF8300FEC632 /* viewer.html in Resources */ = {isa = PBXBuildFile; fileRef = 1C74F0340A47BF8300FEC632 /* viewer.html */; }; + 1C74F04B0A47BFE800FEC632 /* viewer.css in Resources */ = {isa = PBXBuildFile; fileRef = 1C74F03A0A47BFD600FEC632 /* viewer.css */; }; + 1C74F1850A47DEE600FEC632 /* DebuggerApplication.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1C74F1840A47DEE600FEC632 /* DebuggerApplication.mm */; }; + 1CC058EE0A44A210006FE533 /* breakPoint.tif in Resources */ = {isa = PBXBuildFile; fileRef = 1CC058B80A44A210006FE533 /* breakPoint.tif */; }; + 1CC058EF0A44A210006FE533 /* breakPointDisabled.tif in Resources */ = {isa = PBXBuildFile; fileRef = 1CC058B90A44A210006FE533 /* breakPointDisabled.tif */; }; + 1CC059020A44A210006FE533 /* glossyFooterFill.tif in Resources */ = {isa = PBXBuildFile; fileRef = 1CC058CC0A44A210006FE533 /* glossyFooterFill.tif */; }; + 1CC0590E0A44A210006FE533 /* navLeftDisabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 1CC058D80A44A210006FE533 /* navLeftDisabled.png */; }; + 1CC0590F0A44A210006FE533 /* navLeftNormal.png in Resources */ = {isa = PBXBuildFile; fileRef = 1CC058D90A44A210006FE533 /* navLeftNormal.png */; }; + 1CC059100A44A210006FE533 /* navLeftPressed.png in Resources */ = {isa = PBXBuildFile; fileRef = 1CC058DA0A44A210006FE533 /* navLeftPressed.png */; }; + 1CC059110A44A210006FE533 /* navRightDisabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 1CC058DB0A44A210006FE533 /* navRightDisabled.png */; }; + 1CC059120A44A210006FE533 /* navRightNormal.png in Resources */ = {isa = PBXBuildFile; fileRef = 1CC058DC0A44A210006FE533 /* navRightNormal.png */; }; + 1CC059130A44A210006FE533 /* navRightPressed.png in Resources */ = {isa = PBXBuildFile; fileRef = 1CC058DD0A44A210006FE533 /* navRightPressed.png */; }; + 1CC059160A44A210006FE533 /* programCounter.tif in Resources */ = {isa = PBXBuildFile; fileRef = 1CC058E00A44A210006FE533 /* programCounter.tif */; }; + 1CC059170A44A210006FE533 /* splitterBar.tif in Resources */ = {isa = PBXBuildFile; fileRef = 1CC058E10A44A210006FE533 /* splitterBar.tif */; }; + 1CC059180A44A210006FE533 /* splitterDimple.tif in Resources */ = {isa = PBXBuildFile; fileRef = 1CC058E20A44A210006FE533 /* splitterDimple.tif */; }; + 1CC0591A0A44A210006FE533 /* continue.tif in Resources */ = {isa = PBXBuildFile; fileRef = 1CC058E40A44A210006FE533 /* continue.tif */; }; + 1CC0591D0A44A210006FE533 /* pause.tif in Resources */ = {isa = PBXBuildFile; fileRef = 1CC058E70A44A210006FE533 /* pause.tif */; }; + 1CC0591E0A44A210006FE533 /* run.tif in Resources */ = {isa = PBXBuildFile; fileRef = 1CC058E80A44A210006FE533 /* run.tif */; }; + 1CC0591F0A44A210006FE533 /* step.tif in Resources */ = {isa = PBXBuildFile; fileRef = 1CC058E90A44A210006FE533 /* step.tif */; }; + 1CC059200A44A210006FE533 /* stepOver.tif in Resources */ = {isa = PBXBuildFile; fileRef = 1CC058EA0A44A210006FE533 /* stepOver.tif */; }; + 1CC059700A44A485006FE533 /* toolbarBackground.png in Resources */ = {isa = PBXBuildFile; fileRef = 1CC0596F0A44A485006FE533 /* toolbarBackground.png */; }; + 1CD434B20A4B86F800A007AB /* glossyHeaderPressed.png in Resources */ = {isa = PBXBuildFile; fileRef = 1CD434B10A4B86F800A007AB /* glossyHeaderPressed.png */; }; + 1CD8D5690A49041C00E5677B /* launcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 1CD8D5680A49041C00E5677B /* launcher.m */; }; + 1CD8D56C0A49043E00E5677B /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A7FEA54F5311CA2CBB /* Cocoa.framework */; }; + 1CD8D5A60A49102900E5677B /* Drosera.app in Resources */ = {isa = PBXBuildFile; fileRef = 8D15AC370486D014006FF6A4 /* Drosera.app */; }; + 5D2C827F0A816BA700C193FD /* Drosera.icns in Resources */ = {isa = PBXBuildFile; fileRef = 1C3487970A81208400101C5C /* Drosera.icns */; }; + 63D54BD70AE600560064C440 /* breakpointeditor.png in Resources */ = {isa = PBXBuildFile; fileRef = 63D54BD60AE600560064C440 /* breakpointeditor.png */; }; + 63D54CBD0AE72C990064C440 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63D54CBC0AE72C990064C440 /* Carbon.framework */; }; + 63D54D7E0AE75CF10064C440 /* close_active.tif in Resources */ = {isa = PBXBuildFile; fileRef = 63D54D7B0AE75CF10064C440 /* close_active.tif */; }; + 63D54D7F0AE75CF10064C440 /* close_hover.tif in Resources */ = {isa = PBXBuildFile; fileRef = 63D54D7C0AE75CF10064C440 /* close_hover.tif */; }; + 63D54D800AE75CF10064C440 /* close.tif in Resources */ = {isa = PBXBuildFile; fileRef = 63D54D7D0AE75CF10064C440 /* close.tif */; }; + 63D54F780AE8280F0064C440 /* breakpointEditor.html in Resources */ = {isa = PBXBuildFile; fileRef = 63D54F770AE8280F0064C440 /* breakpointEditor.html */; }; + 8D15AC2D0486D014006FF6A4 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 2A37F4B6FDCFA73011CA2CEA /* MainMenu.nib */; }; + 8D15AC2E0486D014006FF6A4 /* Debugger.nib in Resources */ = {isa = PBXBuildFile; fileRef = 2A37F4B4FDCFA73011CA2CEA /* Debugger.nib */; }; + 8D15AC320486D014006FF6A4 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A37F4B0FDCFA73011CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; + 8D15AC340486D014006FF6A4 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A7FEA54F5311CA2CBB /* Cocoa.framework */; }; + 957876850C9A226A008B6383 /* ServerConnection.mm in Sources */ = {isa = PBXBuildFile; fileRef = 957876840C9A226A008B6383 /* ServerConnection.mm */; }; + 95B2A4500C95EECD00850C41 /* DebuggerClient.mm in Sources */ = {isa = PBXBuildFile; fileRef = 95B2A44F0C95EECD00850C41 /* DebuggerClient.mm */; }; + 95B955250C975C7500AAB83B /* DebuggerDocumentPlatform.mm in Sources */ = {isa = PBXBuildFile; fileRef = 95B955240C975C7500AAB83B /* DebuggerDocumentPlatform.mm */; }; + D23E47C60C4460C600B7CD07 /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D23E47C50C4460C600B7CD07 /* JavaScriptCore.framework */; }; + D2D794FD0C4BED83004784F7 /* DebuggerDocument.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D2D794ED0C4BED83004784F7 /* DebuggerDocument.cpp */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 1CD8D5A90A49104E00E5677B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 2A37F4A9FDCFA73011CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8D15AC270486D014006FF6A4; + remoteInfo = Drosera; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 1058C7A7FEA54F5311CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; }; + 13E42FBA07B3F13500E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = "<absolute>"; }; + 15CE854F0ADBEA610078A734 /* fileIcon.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; name = fileIcon.jpg; path = ../Images/fileIcon.jpg; sourceTree = SOURCE_ROOT; }; + 15CE85500ADBEA610078A734 /* siteCollapsed.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = siteCollapsed.tif; path = ../Images/siteCollapsed.tif; sourceTree = SOURCE_ROOT; }; + 15CE85510ADBEA610078A734 /* siteExpanded.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = siteExpanded.tif; path = ../Images/siteExpanded.tif; sourceTree = SOURCE_ROOT; }; + 15CE85520ADBEA610078A734 /* siteIcon.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = siteIcon.tif; path = ../Images/siteIcon.tif; sourceTree = SOURCE_ROOT; }; + 15CE85530ADBEA610078A734 /* SourceArrowOpen.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = SourceArrowOpen.png; path = ../Images/SourceArrowOpen.png; sourceTree = SOURCE_ROOT; }; + 1C2632D10A4AF0A800EA7CD8 /* verticalSplitterBar.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = verticalSplitterBar.tiff; path = ../Images/verticalSplitterBar.tiff; sourceTree = SOURCE_ROOT; }; + 1C2632D20A4AF0A800EA7CD8 /* verticalSplitterDimple.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = verticalSplitterDimple.tiff; path = ../Images/verticalSplitterDimple.tiff; sourceTree = SOURCE_ROOT; }; + 1C2632D50A4AF0B800EA7CD8 /* SourceArrow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = SourceArrow.png; path = ../Images/SourceArrow.png; sourceTree = SOURCE_ROOT; }; + 1C2632D60A4AF0B800EA7CD8 /* SourceArrowBlank.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = SourceArrowBlank.png; path = ../Images/SourceArrowBlank.png; sourceTree = SOURCE_ROOT; }; + 1C2632D90A4AF0D200EA7CD8 /* background_stripe.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = background_stripe.png; path = ../Images/background_stripe.png; sourceTree = SOURCE_ROOT; }; + 1C27ABC50A413B720016ECF4 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = /System/Library/Frameworks/WebKit.framework; sourceTree = "<absolute>"; }; + 1C27AC1F0A413D2D0016ECF4 /* debugger.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = debugger.html; path = ../debugger.html; sourceTree = SOURCE_ROOT; tabWidth = 8; usesTabs = 0; }; + 1C27AC230A413D660016ECF4 /* debugger.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = debugger.js; path = ../debugger.js; sourceTree = SOURCE_ROOT; tabWidth = 8; usesTabs = 0; }; + 1C3487970A81208400101C5C /* Drosera.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = Drosera.icns; path = ../Drosera.icns; sourceTree = SOURCE_ROOT; }; + 1C4FF7430A44F5260000D05D /* debugger.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = debugger.css; path = ../debugger.css; sourceTree = SOURCE_ROOT; tabWidth = 8; usesTabs = 0; }; + 1C4FF7530A44F6320000D05D /* gutter.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = gutter.png; path = ../Images/gutter.png; sourceTree = SOURCE_ROOT; }; + 1C4FF91F0A45F3520000D05D /* glossyHeader.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = glossyHeader.png; path = ../Images/glossyHeader.png; sourceTree = SOURCE_ROOT; }; + 1C4FF94D0A45F5060000D05D /* popUpArrows.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = popUpArrows.png; path = ../Images/popUpArrows.png; sourceTree = SOURCE_ROOT; }; + 1C4FFE5C0A466F5D0000D05D /* programCounterBreakPoint.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = programCounterBreakPoint.tif; path = ../Images/programCounterBreakPoint.tif; sourceTree = SOURCE_ROOT; }; + 1C4FFE5D0A466F5D0000D05D /* programCounterBreakPointDisabled.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = programCounterBreakPointDisabled.tif; path = ../Images/programCounterBreakPointDisabled.tif; sourceTree = SOURCE_ROOT; }; + 1C6F83FE0A58E97D004FCD89 /* stepOut.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = stepOut.tif; path = ../Images/stepOut.tif; sourceTree = SOURCE_ROOT; }; + 1C6F84510A58EDFE004FCD89 /* console.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = console.png; path = ../Images/console.png; sourceTree = SOURCE_ROOT; }; + 1C6F84530A58EE06004FCD89 /* console.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = console.css; path = ../console.css; sourceTree = SOURCE_ROOT; }; + 1C6F84540A58EE06004FCD89 /* console.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = console.html; path = ../console.html; sourceTree = SOURCE_ROOT; }; + 1C6F861F0A599F65004FCD89 /* console.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = console.js; path = ../console.js; sourceTree = SOURCE_ROOT; }; + 1C74F0340A47BF8300FEC632 /* viewer.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = viewer.html; path = ../viewer.html; sourceTree = SOURCE_ROOT; tabWidth = 8; usesTabs = 0; }; + 1C74F03A0A47BFD600FEC632 /* viewer.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = viewer.css; path = ../viewer.css; sourceTree = SOURCE_ROOT; tabWidth = 8; usesTabs = 0; }; + 1C74F1830A47DEE600FEC632 /* DebuggerApplication.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DebuggerApplication.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; }; + 1C74F1840A47DEE600FEC632 /* DebuggerApplication.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DebuggerApplication.mm; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; }; + 1CC058B80A44A210006FE533 /* breakPoint.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = breakPoint.tif; path = ../Images/breakPoint.tif; sourceTree = SOURCE_ROOT; }; + 1CC058B90A44A210006FE533 /* breakPointDisabled.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = breakPointDisabled.tif; path = ../Images/breakPointDisabled.tif; sourceTree = SOURCE_ROOT; }; + 1CC058CC0A44A210006FE533 /* glossyFooterFill.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = glossyFooterFill.tif; path = ../Images/glossyFooterFill.tif; sourceTree = SOURCE_ROOT; }; + 1CC058D80A44A210006FE533 /* navLeftDisabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = navLeftDisabled.png; path = ../Images/navLeftDisabled.png; sourceTree = SOURCE_ROOT; }; + 1CC058D90A44A210006FE533 /* navLeftNormal.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = navLeftNormal.png; path = ../Images/navLeftNormal.png; sourceTree = SOURCE_ROOT; }; + 1CC058DA0A44A210006FE533 /* navLeftPressed.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = navLeftPressed.png; path = ../Images/navLeftPressed.png; sourceTree = SOURCE_ROOT; }; + 1CC058DB0A44A210006FE533 /* navRightDisabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = navRightDisabled.png; path = ../Images/navRightDisabled.png; sourceTree = SOURCE_ROOT; }; + 1CC058DC0A44A210006FE533 /* navRightNormal.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = navRightNormal.png; path = ../Images/navRightNormal.png; sourceTree = SOURCE_ROOT; }; + 1CC058DD0A44A210006FE533 /* navRightPressed.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = navRightPressed.png; path = ../Images/navRightPressed.png; sourceTree = SOURCE_ROOT; }; + 1CC058E00A44A210006FE533 /* programCounter.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = programCounter.tif; path = ../Images/programCounter.tif; sourceTree = SOURCE_ROOT; }; + 1CC058E10A44A210006FE533 /* splitterBar.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = splitterBar.tif; path = ../Images/splitterBar.tif; sourceTree = SOURCE_ROOT; }; + 1CC058E20A44A210006FE533 /* splitterDimple.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = splitterDimple.tif; path = ../Images/splitterDimple.tif; sourceTree = SOURCE_ROOT; }; + 1CC058E40A44A210006FE533 /* continue.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = continue.tif; path = ../Images/continue.tif; sourceTree = SOURCE_ROOT; }; + 1CC058E60A44A210006FE533 /* finishFunction.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = finishFunction.tif; sourceTree = "<group>"; }; + 1CC058E70A44A210006FE533 /* pause.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = pause.tif; path = ../Images/pause.tif; sourceTree = SOURCE_ROOT; }; + 1CC058E80A44A210006FE533 /* run.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = run.tif; path = ../Images/run.tif; sourceTree = SOURCE_ROOT; }; + 1CC058E90A44A210006FE533 /* step.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = step.tif; path = ../Images/step.tif; sourceTree = SOURCE_ROOT; }; + 1CC058EA0A44A210006FE533 /* stepOver.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = stepOver.tif; path = ../Images/stepOver.tif; sourceTree = SOURCE_ROOT; }; + 1CC058EB0A44A210006FE533 /* stop.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = stop.tif; sourceTree = "<group>"; }; + 1CC0596F0A44A485006FE533 /* toolbarBackground.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = toolbarBackground.png; path = ../Images/toolbarBackground.png; sourceTree = SOURCE_ROOT; }; + 1CD434B10A4B86F800A007AB /* glossyHeaderPressed.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = glossyHeaderPressed.png; path = ../Images/glossyHeaderPressed.png; sourceTree = SOURCE_ROOT; }; + 1CD8D54D0A4902B000E5677B /* DroseraLauncher.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DroseraLauncher.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 1CD8D54F0A4902B000E5677B /* LauncherInfo.plist */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = LauncherInfo.plist; sourceTree = "<group>"; }; + 1CD8D5680A49041C00E5677B /* launcher.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = launcher.m; sourceTree = "<group>"; }; + 2A37F4B0FDCFA73011CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; }; + 2A37F4B5FDCFA73011CA2CEA /* Debugger.nib */ = {isa = PBXFileReference; explicitFileType = wrapper.nib; name = Debugger.nib; path = ../English.lproj/Debugger.nib; sourceTree = "<group>"; }; + 2A37F4B7FDCFA73011CA2CEA /* MainMenu.nib */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = MainMenu.nib; path = ../English.lproj/MainMenu.nib; sourceTree = "<group>"; }; + 2A37F4C4FDCFA73011CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; }; + 2A37F4C5FDCFA73011CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; }; + 63D54BD60AE600560064C440 /* breakpointeditor.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = breakpointeditor.png; path = ../Images/breakpointeditor.png; sourceTree = SOURCE_ROOT; }; + 63D54CBC0AE72C990064C440 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = "<absolute>"; }; + 63D54D7B0AE75CF10064C440 /* close_active.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = close_active.tif; path = ../Images/close_active.tif; sourceTree = SOURCE_ROOT; }; + 63D54D7C0AE75CF10064C440 /* close_hover.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = close_hover.tif; path = ../Images/close_hover.tif; sourceTree = SOURCE_ROOT; }; + 63D54D7D0AE75CF10064C440 /* close.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = close.tif; path = ../Images/close.tif; sourceTree = SOURCE_ROOT; }; + 63D54F770AE8280F0064C440 /* breakpointEditor.html */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.html; name = breakpointEditor.html; path = ../breakpointEditor.html; sourceTree = SOURCE_ROOT; }; + 8D15AC360486D014006FF6A4 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; }; + 8D15AC370486D014006FF6A4 /* Drosera.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Drosera.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 957876760C9A221B008B6383 /* ServerConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ServerConnection.h; sourceTree = "<group>"; }; + 957876840C9A226A008B6383 /* ServerConnection.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ServerConnection.mm; sourceTree = "<group>"; }; + 957879610C9B37BC008B6383 /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = config.h; path = ../config.h; sourceTree = SOURCE_ROOT; }; + 95B2A44E0C95EECD00850C41 /* DebuggerClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DebuggerClient.h; sourceTree = "<group>"; }; + 95B2A44F0C95EECD00850C41 /* DebuggerClient.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DebuggerClient.mm; sourceTree = "<group>"; }; + 95B955240C975C7500AAB83B /* DebuggerDocumentPlatform.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DebuggerDocumentPlatform.mm; sourceTree = "<group>"; }; + 95C906AF0C8E439200F9BE0F /* Platform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Platform.h; path = ../ForwardingHeaders/wtf/Platform.h; sourceTree = SOURCE_ROOT; }; + D23E47C50C4460C600B7CD07 /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = /System/Library/Frameworks/JavaScriptCore.framework; sourceTree = "<absolute>"; }; + D2D794ED0C4BED83004784F7 /* DebuggerDocument.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 30; name = DebuggerDocument.cpp; path = ../DebuggerDocument.cpp; sourceTree = SOURCE_ROOT; }; + D2D794EE0C4BED83004784F7 /* DebuggerDocument.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; fileEncoding = 30; name = DebuggerDocument.h; path = ../DebuggerDocument.h; sourceTree = SOURCE_ROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 1CD8D54B0A4902B000E5677B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 1CD8D56C0A49043E00E5677B /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8D15AC330486D014006FF6A4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 63D54CBD0AE72C990064C440 /* Carbon.framework in Frameworks */, + 8D15AC340486D014006FF6A4 /* Cocoa.framework in Frameworks */, + D23E47C60C4460C600B7CD07 /* JavaScriptCore.framework in Frameworks */, + 1C27ABC60A413B720016ECF4 /* WebKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 1058C7A6FEA54F5311CA2CBB /* Linked Frameworks */ = { + isa = PBXGroup; + children = ( + 63D54CBC0AE72C990064C440 /* Carbon.framework */, + 1058C7A7FEA54F5311CA2CBB /* Cocoa.framework */, + 1C27ABC50A413B720016ECF4 /* WebKit.framework */, + ); + name = "Linked Frameworks"; + sourceTree = "<group>"; + }; + 1058C7A8FEA54F5311CA2CBB /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + 2A37F4C4FDCFA73011CA2CEA /* AppKit.framework */, + 13E42FBA07B3F13500E4EEF1 /* CoreData.framework */, + 2A37F4C5FDCFA73011CA2CEA /* Foundation.framework */, + ); + name = "Other Frameworks"; + sourceTree = "<group>"; + }; + 19C28FB0FE9D524F11CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 8D15AC370486D014006FF6A4 /* Drosera.app */, + 1CD8D54D0A4902B000E5677B /* DroseraLauncher.app */, + ); + name = Products; + sourceTree = "<group>"; + }; + 1CC058B70A44A210006FE533 /* Images */ = { + isa = PBXGroup; + children = ( + 63D54D7B0AE75CF10064C440 /* close_active.tif */, + 63D54D7C0AE75CF10064C440 /* close_hover.tif */, + 63D54D7D0AE75CF10064C440 /* close.tif */, + 63D54BD60AE600560064C440 /* breakpointeditor.png */, + 15CE854F0ADBEA610078A734 /* fileIcon.jpg */, + 15CE85500ADBEA610078A734 /* siteCollapsed.tif */, + 15CE85510ADBEA610078A734 /* siteExpanded.tif */, + 15CE85520ADBEA610078A734 /* siteIcon.tif */, + 15CE85530ADBEA610078A734 /* SourceArrowOpen.png */, + 1C6F84510A58EDFE004FCD89 /* console.png */, + 1C4FF7530A44F6320000D05D /* gutter.png */, + 1C4FF91F0A45F3520000D05D /* glossyHeader.png */, + 1CD434B10A4B86F800A007AB /* glossyHeaderPressed.png */, + 1C4FF94D0A45F5060000D05D /* popUpArrows.png */, + 1CC058B80A44A210006FE533 /* breakPoint.tif */, + 1CC058B90A44A210006FE533 /* breakPointDisabled.tif */, + 1CC058E00A44A210006FE533 /* programCounter.tif */, + 1C4FFE5C0A466F5D0000D05D /* programCounterBreakPoint.tif */, + 1C4FFE5D0A466F5D0000D05D /* programCounterBreakPointDisabled.tif */, + 1CC058CC0A44A210006FE533 /* glossyFooterFill.tif */, + 1CC058D80A44A210006FE533 /* navLeftDisabled.png */, + 1CC058D90A44A210006FE533 /* navLeftNormal.png */, + 1CC058DA0A44A210006FE533 /* navLeftPressed.png */, + 1CC058DB0A44A210006FE533 /* navRightDisabled.png */, + 1CC058DC0A44A210006FE533 /* navRightNormal.png */, + 1CC058DD0A44A210006FE533 /* navRightPressed.png */, + 1CC058E10A44A210006FE533 /* splitterBar.tif */, + 1CC058E20A44A210006FE533 /* splitterDimple.tif */, + 1CC058E60A44A210006FE533 /* finishFunction.tif */, + 1CC058E40A44A210006FE533 /* continue.tif */, + 1CC058E70A44A210006FE533 /* pause.tif */, + 1CC058E80A44A210006FE533 /* run.tif */, + 1CC058E90A44A210006FE533 /* step.tif */, + 1C6F83FE0A58E97D004FCD89 /* stepOut.tif */, + 1CC058EA0A44A210006FE533 /* stepOver.tif */, + 1CC058EB0A44A210006FE533 /* stop.tif */, + 1CC0596F0A44A485006FE533 /* toolbarBackground.png */, + 1C2632D10A4AF0A800EA7CD8 /* verticalSplitterBar.tiff */, + 1C2632D20A4AF0A800EA7CD8 /* verticalSplitterDimple.tiff */, + 1C2632D50A4AF0B800EA7CD8 /* SourceArrow.png */, + 1C2632D60A4AF0B800EA7CD8 /* SourceArrowBlank.png */, + 1C2632D90A4AF0D200EA7CD8 /* background_stripe.png */, + ); + name = Images; + path = ../Images; + sourceTree = "<group>"; + }; + 1CD8D53C0A49025D00E5677B /* Nightly Support */ = { + isa = PBXGroup; + children = ( + 1CD8D54F0A4902B000E5677B /* LauncherInfo.plist */, + 1CD8D5680A49041C00E5677B /* launcher.m */, + ); + name = "Nightly Support"; + sourceTree = "<group>"; + }; + 2A37F4AAFDCFA73011CA2CEA /* SafariBug */ = { + isa = PBXGroup; + children = ( + D23E47C50C4460C600B7CD07 /* JavaScriptCore.framework */, + 2A37F4ABFDCFA73011CA2CEA /* Classes */, + 2A37F4AFFDCFA73011CA2CEA /* Other Sources */, + 2A37F4B8FDCFA73011CA2CEA /* Resources */, + 1CD8D53C0A49025D00E5677B /* Nightly Support */, + 2A37F4C3FDCFA73011CA2CEA /* Frameworks */, + 19C28FB0FE9D524F11CA2CBB /* Products */, + ); + name = SafariBug; + sourceTree = "<group>"; + }; + 2A37F4ABFDCFA73011CA2CEA /* Classes */ = { + isa = PBXGroup; + children = ( + 63D54F770AE8280F0064C440 /* breakpointEditor.html */, + 1C6F84530A58EE06004FCD89 /* console.css */, + 1C6F84540A58EE06004FCD89 /* console.html */, + 1C6F861F0A599F65004FCD89 /* console.js */, + 1C74F1830A47DEE600FEC632 /* DebuggerApplication.h */, + 1C74F1840A47DEE600FEC632 /* DebuggerApplication.mm */, + 95B2A44E0C95EECD00850C41 /* DebuggerClient.h */, + 95B2A44F0C95EECD00850C41 /* DebuggerClient.mm */, + D2D794ED0C4BED83004784F7 /* DebuggerDocument.cpp */, + D2D794EE0C4BED83004784F7 /* DebuggerDocument.h */, + 95B955240C975C7500AAB83B /* DebuggerDocumentPlatform.mm */, + 1C27AC230A413D660016ECF4 /* debugger.js */, + 1C27AC1F0A413D2D0016ECF4 /* debugger.html */, + 1C4FF7430A44F5260000D05D /* debugger.css */, + 95C906AF0C8E439200F9BE0F /* Platform.h */, + 957876760C9A221B008B6383 /* ServerConnection.h */, + 957876840C9A226A008B6383 /* ServerConnection.mm */, + 1C74F0340A47BF8300FEC632 /* viewer.html */, + 1C74F03A0A47BFD600FEC632 /* viewer.css */, + ); + name = Classes; + sourceTree = "<group>"; + tabWidth = 8; + usesTabs = 0; + }; + 2A37F4AFFDCFA73011CA2CEA /* Other Sources */ = { + isa = PBXGroup; + children = ( + 957879610C9B37BC008B6383 /* config.h */, + 2A37F4B0FDCFA73011CA2CEA /* main.m */, + ); + name = "Other Sources"; + sourceTree = "<group>"; + tabWidth = 8; + usesTabs = 0; + }; + 2A37F4B8FDCFA73011CA2CEA /* Resources */ = { + isa = PBXGroup; + children = ( + 1C3487970A81208400101C5C /* Drosera.icns */, + 2A37F4B6FDCFA73011CA2CEA /* MainMenu.nib */, + 2A37F4B4FDCFA73011CA2CEA /* Debugger.nib */, + 8D15AC360486D014006FF6A4 /* Info.plist */, + 1CC058B70A44A210006FE533 /* Images */, + ); + name = Resources; + sourceTree = "<group>"; + tabWidth = 8; + usesTabs = 0; + }; + 2A37F4C3FDCFA73011CA2CEA /* Frameworks */ = { + isa = PBXGroup; + children = ( + 1058C7A6FEA54F5311CA2CBB /* Linked Frameworks */, + 1058C7A8FEA54F5311CA2CBB /* Other Frameworks */, + ); + name = Frameworks; + sourceTree = "<group>"; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 1CD8D54C0A4902B000E5677B /* Drosera (Nightly Launcher) */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1CD8D5500A4902B000E5677B /* Build configuration list for PBXNativeTarget "Drosera (Nightly Launcher)" */; + buildPhases = ( + 1CD8D5490A4902B000E5677B /* Resources */, + 1CD8D54A0A4902B000E5677B /* Sources */, + 1CD8D54B0A4902B000E5677B /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 1CD8D5AA0A49104E00E5677B /* PBXTargetDependency */, + ); + name = "Drosera (Nightly Launcher)"; + productName = "Drosera (Nightly Launcher)"; + productReference = 1CD8D54D0A4902B000E5677B /* DroseraLauncher.app */; + productType = "com.apple.product-type.application"; + }; + 8D15AC270486D014006FF6A4 /* Drosera */ = { + isa = PBXNativeTarget; + buildConfigurationList = C05733C708A9546B00998B17 /* Build configuration list for PBXNativeTarget "Drosera" */; + buildPhases = ( + 8D15AC2B0486D014006FF6A4 /* Resources */, + 8D15AC300486D014006FF6A4 /* Sources */, + 8D15AC330486D014006FF6A4 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Drosera; + productInstallPath = "$(HOME)/Applications"; + productName = SafariBug; + productReference = 8D15AC370486D014006FF6A4 /* Drosera.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 2A37F4A9FDCFA73011CA2CEA /* Project object */ = { + isa = PBXProject; + buildConfigurationList = C05733CB08A9546B00998B17 /* Build configuration list for PBXProject "Drosera" */; + compatibilityVersion = "Xcode 2.4"; + hasScannedForEncodings = 1; + mainGroup = 2A37F4AAFDCFA73011CA2CEA /* SafariBug */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8D15AC270486D014006FF6A4 /* Drosera */, + 1CD8D54C0A4902B000E5677B /* Drosera (Nightly Launcher) */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 1CD8D5490A4902B000E5677B /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1CD8D5A60A49102900E5677B /* Drosera.app in Resources */, + 5D2C827F0A816BA700C193FD /* Drosera.icns in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8D15AC2B0486D014006FF6A4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8D15AC2E0486D014006FF6A4 /* Debugger.nib in Resources */, + 1C3487980A81208400101C5C /* Drosera.icns in Resources */, + 8D15AC2D0486D014006FF6A4 /* MainMenu.nib in Resources */, + 1C2632D70A4AF0B800EA7CD8 /* SourceArrow.png in Resources */, + 1C2632D80A4AF0B800EA7CD8 /* SourceArrowBlank.png in Resources */, + 15CE85580ADBEA620078A734 /* SourceArrowOpen.png in Resources */, + 1C2632DA0A4AF0D200EA7CD8 /* background_stripe.png in Resources */, + 1CC058EE0A44A210006FE533 /* breakPoint.tif in Resources */, + 1CC058EF0A44A210006FE533 /* breakPointDisabled.tif in Resources */, + 63D54F780AE8280F0064C440 /* breakpointEditor.html in Resources */, + 63D54BD70AE600560064C440 /* breakpointeditor.png in Resources */, + 63D54D800AE75CF10064C440 /* close.tif in Resources */, + 63D54D7E0AE75CF10064C440 /* close_active.tif in Resources */, + 63D54D7F0AE75CF10064C440 /* close_hover.tif in Resources */, + 1C6F84550A58EE06004FCD89 /* console.css in Resources */, + 1C6F84560A58EE06004FCD89 /* console.html in Resources */, + 1C6F86730A59A18B004FCD89 /* console.js in Resources */, + 1C6F84520A58EDFE004FCD89 /* console.png in Resources */, + 1CC0591A0A44A210006FE533 /* continue.tif in Resources */, + 1C4FF7440A44F52C0000D05D /* debugger.css in Resources */, + 1C27AC200A413D2D0016ECF4 /* debugger.html in Resources */, + 1C27B1260A421D870016ECF4 /* debugger.js in Resources */, + 15CE85540ADBEA620078A734 /* fileIcon.jpg in Resources */, + 1CC059020A44A210006FE533 /* glossyFooterFill.tif in Resources */, + 1C4FF9210A45F3520000D05D /* glossyHeader.png in Resources */, + 1CD434B20A4B86F800A007AB /* glossyHeaderPressed.png in Resources */, + 1C4FF7540A44F6320000D05D /* gutter.png in Resources */, + 1CC0590E0A44A210006FE533 /* navLeftDisabled.png in Resources */, + 1CC0590F0A44A210006FE533 /* navLeftNormal.png in Resources */, + 1CC059100A44A210006FE533 /* navLeftPressed.png in Resources */, + 1CC059110A44A210006FE533 /* navRightDisabled.png in Resources */, + 1CC059120A44A210006FE533 /* navRightNormal.png in Resources */, + 1CC059130A44A210006FE533 /* navRightPressed.png in Resources */, + 1CC0591D0A44A210006FE533 /* pause.tif in Resources */, + 1C4FF94E0A45F5060000D05D /* popUpArrows.png in Resources */, + 1CC059160A44A210006FE533 /* programCounter.tif in Resources */, + 1C4FFE5E0A466F5D0000D05D /* programCounterBreakPoint.tif in Resources */, + 1C4FFE5F0A466F5D0000D05D /* programCounterBreakPointDisabled.tif in Resources */, + 1CC0591E0A44A210006FE533 /* run.tif in Resources */, + 15CE85550ADBEA620078A734 /* siteCollapsed.tif in Resources */, + 15CE85560ADBEA620078A734 /* siteExpanded.tif in Resources */, + 15CE85570ADBEA620078A734 /* siteIcon.tif in Resources */, + 1CC059170A44A210006FE533 /* splitterBar.tif in Resources */, + 1CC059180A44A210006FE533 /* splitterDimple.tif in Resources */, + 1CC0591F0A44A210006FE533 /* step.tif in Resources */, + 1C6F83FF0A58E97D004FCD89 /* stepOut.tif in Resources */, + 1CC059200A44A210006FE533 /* stepOver.tif in Resources */, + 1CC059700A44A485006FE533 /* toolbarBackground.png in Resources */, + 1C2632D30A4AF0A800EA7CD8 /* verticalSplitterBar.tiff in Resources */, + 1C2632D40A4AF0A800EA7CD8 /* verticalSplitterDimple.tiff in Resources */, + 1C74F04B0A47BFE800FEC632 /* viewer.css in Resources */, + 1C74F0350A47BF8300FEC632 /* viewer.html in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 1CD8D54A0A4902B000E5677B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1CD8D5690A49041C00E5677B /* launcher.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8D15AC300486D014006FF6A4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1C74F1850A47DEE600FEC632 /* DebuggerApplication.mm in Sources */, + 95B2A4500C95EECD00850C41 /* DebuggerClient.mm in Sources */, + D2D794FD0C4BED83004784F7 /* DebuggerDocument.cpp in Sources */, + 95B955250C975C7500AAB83B /* DebuggerDocumentPlatform.mm in Sources */, + 957876850C9A226A008B6383 /* ServerConnection.mm in Sources */, + 8D15AC320486D014006FF6A4 /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 1CD8D5AA0A49104E00E5677B /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 8D15AC270486D014006FF6A4 /* Drosera */; + targetProxy = 1CD8D5A90A49104E00E5677B /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 2A37F4B4FDCFA73011CA2CEA /* Debugger.nib */ = { + isa = PBXVariantGroup; + children = ( + 2A37F4B5FDCFA73011CA2CEA /* Debugger.nib */, + ); + name = Debugger.nib; + sourceTree = "<group>"; + }; + 2A37F4B6FDCFA73011CA2CEA /* MainMenu.nib */ = { + isa = PBXVariantGroup; + children = ( + 2A37F4B7FDCFA73011CA2CEA /* MainMenu.nib */, + ); + name = MainMenu.nib; + sourceTree = "<group>"; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 1CD8D5510A4902B000E5677B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DEBUGGING_SYMBOLS = full; + GCC_DYNAMIC_NO_PIC = NO; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + INFOPLIST_FILE = LauncherInfo.plist; + INSTALL_PATH = "$(HOME)/Applications"; + PRODUCT_NAME = DroseraLauncher; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + 1CD8D5520A4902B000E5677B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + DEPLOYMENT_POSTPROCESSING = YES; + GCC_DEBUGGING_SYMBOLS = full; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + INFOPLIST_FILE = LauncherInfo.plist; + INSTALL_PATH = "$(HOME)/Applications"; + PRODUCT_NAME = DroseraLauncher; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; + C05733C808A9546B00998B17 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = c99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREFIX_HEADER = ""; + HEADER_SEARCH_PATHS = ../ForwardingHeaders; + INFOPLIST_FILE = Info.plist; + PRODUCT_NAME = Drosera; + USER_HEADER_SEARCH_PATHS = ../ForwardingHeaders/; + VALID_ARCHS = "ppc7400 ppc970 i386 ppc"; + WRAPPER_EXTENSION = app; + ZERO_LINK = NO; + }; + name = Debug; + }; + C05733C908A9546B00998B17 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_C_LANGUAGE_STANDARD = c99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_MODEL_TUNING = G5; + GCC_PREFIX_HEADER = ""; + HEADER_SEARCH_PATHS = ../ForwardingHeaders; + INFOPLIST_FILE = Info.plist; + PRODUCT_NAME = Drosera; + USER_HEADER_SEARCH_PATHS = ../ForwardingHeaders/; + VALID_ARCHS = "ppc7400 ppc970 i386 ppc"; + WRAPPER_EXTENSION = app; + ZERO_LINK = NO; + }; + name = Release; + }; + C05733CC08A9546B00998B17 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEBUG_INFORMATION_FORMAT = dwarf; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PREBINDING = NO; + USER_HEADER_SEARCH_PATHS = ../ForwardingHeaders/; + }; + name = Debug; + }; + C05733CD08A9546B00998B17 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEBUG_INFORMATION_FORMAT = dwarf; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PREBINDING = NO; + USER_HEADER_SEARCH_PATHS = ../ForwardingHeaders/; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1CD8D5500A4902B000E5677B /* Build configuration list for PBXNativeTarget "Drosera (Nightly Launcher)" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1CD8D5510A4902B000E5677B /* Debug */, + 1CD8D5520A4902B000E5677B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C05733C708A9546B00998B17 /* Build configuration list for PBXNativeTarget "Drosera" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C05733C808A9546B00998B17 /* Debug */, + C05733C908A9546B00998B17 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C05733CB08A9546B00998B17 /* Build configuration list for PBXProject "Drosera" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C05733CC08A9546B00998B17 /* Debug */, + C05733CD08A9546B00998B17 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 2A37F4A9FDCFA73011CA2CEA /* Project object */; +} diff --git a/WebKitTools/Drosera/mac/Info.plist b/WebKitTools/Drosera/mac/Info.plist new file mode 100644 index 0000000..536f5a3 --- /dev/null +++ b/WebKitTools/Drosera/mac/Info.plist @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleName</key> + <string>${PRODUCT_NAME}</string> + <key>CFBundleExecutable</key> + <string>${EXECUTABLE_NAME}</string> + <key>CFBundleGetInfoString</key> + <string>420+, Copyright 2006 Apple Computer, Inc.</string> + <key>CFBundleIdentifier</key> + <string>org.webkit.drosera</string> + <key>CFBundleVersion</key> + <string>1.0</string> + <key>CFBundleIconFile</key> + <string>Drosera</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>NSMainNibFile</key> + <string>MainMenu</string> + <key>NSPrincipalClass</key> + <string>NSApplication</string> +</dict> +</plist> diff --git a/WebKitTools/Drosera/mac/LauncherInfo.plist b/WebKitTools/Drosera/mac/LauncherInfo.plist new file mode 100644 index 0000000..12c4472 --- /dev/null +++ b/WebKitTools/Drosera/mac/LauncherInfo.plist @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleDevelopmentRegion</key> + <string>English</string> + <key>CFBundleExecutable</key> + <string>${EXECUTABLE_NAME}</string> + <key>CFBundleIconFile</key> + <string>Drosera</string> + <key>CFBundleIdentifier</key> + <string>org.webkit.drosera.launcher</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleVersion</key> + <string>VERSION</string> + <key>NSMainNibFile</key> + <string>MainMenu</string> + <key>NSPrincipalClass</key> + <string>NSApplication</string> +</dict> +</plist> diff --git a/WebKitTools/Drosera/mac/Makefile b/WebKitTools/Drosera/mac/Makefile new file mode 100644 index 0000000..058c21e --- /dev/null +++ b/WebKitTools/Drosera/mac/Makefile @@ -0,0 +1,2 @@ +SCRIPTS_PATH = ../../Scripts +include ../../../Makefile.shared diff --git a/WebKitTools/Drosera/mac/ServerConnection.h b/WebKitTools/Drosera/mac/ServerConnection.h new file mode 100644 index 0000000..f2b1303 --- /dev/null +++ b/WebKitTools/Drosera/mac/ServerConnection.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 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. + */ + +@class DebuggerClient; +@class NSString; +@class WebScriptCallFrame; +@class WebScriptDebugServer; + +@interface ServerConnection : NSObject <WebScriptDebugListener> +{ + NSString *currentServerName; + WebScriptCallFrame *currentFrame; + id<WebScriptDebugServer> server; + JSGlobalContextRef globalContext; +} + +- (id)initWithServerName:(NSString *)serverName; +- (void)setGlobalContext:(JSGlobalContextRef)globalContextRef; +- (void)pause; +- (void)resume; +- (void)stepInto; +- (void)switchToServerNamed:(NSString *)name; +- (void)applicationTerminating:(NSNotification *)notifiction; +- (WebScriptCallFrame *)currentFrame; +- (NSString *)currentServerName; + +@end diff --git a/WebKitTools/Drosera/mac/ServerConnection.mm b/WebKitTools/Drosera/mac/ServerConnection.mm new file mode 100644 index 0000000..8444ee9 --- /dev/null +++ b/WebKitTools/Drosera/mac/ServerConnection.mm @@ -0,0 +1,265 @@ +/* + * Copyright (C) 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 "config.h" +#import "ServerConnection.h" + +#import "DebuggerDocument.h" + +#import <JavaScriptCore/JSContextRef.h> +#import <JavaScriptCore/JSRetainPtr.h> +#import <JavaScriptCore/JSStringRefCF.h> +#import <JavaScriptCore/RetainPtr.h> + +@implementation ServerConnection + +#pragma mark - +- (id)initWithServerName:(NSString *)serverName; +{ + if (!(self = [super init])) + return nil; + + [self switchToServerNamed:serverName]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationTerminating:) name:NSApplicationWillTerminateNotification object:nil]; + + return self; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self name:NSApplicationWillTerminateNotification object:nil]; + + [currentServerName release]; + [currentFrame release]; + [server release]; + JSGlobalContextRelease(globalContext); + [super dealloc]; +} + +- (void)setGlobalContext:(JSGlobalContextRef)globalContextRef +{ + globalContext = JSGlobalContextRetain(globalContextRef); +} + +#pragma mark - +#pragma mark Pause & Step + +- (void)pause +{ + if ([[(NSDistantObject *)server connectionForProxy] isValid]) + [server pause]; + [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; +} + +- (void)resume +{ + if ([[(NSDistantObject *)server connectionForProxy] isValid]) + [server resume]; +} + +- (void)stepInto +{ + if ([[(NSDistantObject *)server connectionForProxy] isValid]) + [server step]; +} + +#pragma mark - +#pragma mark Connection Handling + +- (void)switchToServerNamed:(NSString *)name +{ + if (server) { + [[NSNotificationCenter defaultCenter] removeObserver:self name:NSConnectionDidDieNotification object:[(NSDistantObject *)server connectionForProxy]]; + if ([[(NSDistantObject *)server connectionForProxy] isValid]) { + [server removeListener:self]; + [self resume]; + } + } + + id<WebScriptDebugServer> oldServer = server; + server = [name length] ? [[NSConnection rootProxyForConnectionWithRegisteredName:name host:nil] retain] : nil; + [oldServer release]; + + NSString *oldServerName = currentServerName; + currentServerName = [name retain]; + [oldServerName release]; + + if (server) { + @try { + [(NSDistantObject *)server setProtocolForProxy:@protocol(WebScriptDebugServer)]; + [server addListener:self]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(serverConnectionDidDie:) name:NSConnectionDidDieNotification object:[(NSDistantObject *)server connectionForProxy]]; + } @catch (NSException *exception) { + [currentServerName release]; + currentServerName = nil; + [server release]; + server = nil; + } + } +} + +- (void)applicationTerminating:(NSNotification *)notifiction +{ + if (server && [[(NSDistantObject *)server connectionForProxy] isValid]) { + [self switchToServerNamed:nil]; + // call the runloop for a while to make sure our removeListener: is sent to the server + [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.25]]; + } +} + +- (void)serverConnectionDidDie:(NSNotification *)notifiction +{ + [self switchToServerNamed:nil]; +} + +#pragma mark - +#pragma mark Debug Listener Callbacks + +- (void)webView:(WebView *)view didLoadMainResourceForDataSource:(WebDataSource *)dataSource +{ + // Get document source + NSString *documentSource = nil; + id <WebDocumentRepresentation> rep = [dataSource representation]; + if ([rep canProvideDocumentSource]) + documentSource = [rep documentSource]; + + if (!documentSource) + return; + + JSRetainPtr<JSStringRef> documentSourceJS(Adopt, JSStringCreateWithCFString((CFStringRef)documentSource)); + + // Get URL + NSString *url = [[[dataSource response] URL] absoluteString]; + JSRetainPtr<JSStringRef> urlJS(Adopt, JSStringCreateWithCFString(url ? (CFStringRef)url : CFSTR(""))); + + DebuggerDocument::updateFileSource(globalContext, documentSourceJS.get(), urlJS.get()); +} + +- (void)webView:(WebView *)view didParseSource:(NSString *)source baseLineNumber:(unsigned)baseLine fromURL:(NSURL *)url sourceId:(int)sid forWebFrame:(WebFrame *)webFrame +{ + if (!globalContext) + return; + + RetainPtr<NSString> sourceCopy = source; + if (!sourceCopy.get()) + return; + + RetainPtr<NSString> documentSourceCopy; + RetainPtr<NSString> urlCopy = [url absoluteString]; + + WebDataSource *dataSource = [webFrame dataSource]; + if (!url || [[[dataSource response] URL] isEqual:url]) { + id <WebDocumentRepresentation> rep = [dataSource representation]; + if ([rep canProvideDocumentSource]) + documentSourceCopy = [rep documentSource]; + if (!urlCopy.get()) + urlCopy = [[[dataSource response] URL] absoluteString]; + } + + JSRetainPtr<JSStringRef> sourceCopyJS(Adopt, JSStringCreateWithCFString((CFStringRef)sourceCopy.get())); // We checked for NULL earlier. + JSRetainPtr<JSStringRef> documentSourceCopyJS(Adopt, JSStringCreateWithCFString(documentSourceCopy.get() ? (CFStringRef)documentSourceCopy.get() : CFSTR(""))); + JSRetainPtr<JSStringRef> urlCopyJS(Adopt, JSStringCreateWithCFString(urlCopy.get() ? (CFStringRef)urlCopy.get() : CFSTR(""))); + JSValueRef sidJS = JSValueMakeNumber(globalContext, sid); + JSValueRef baseLineJS = JSValueMakeNumber(globalContext, baseLine); + + DebuggerDocument::didParseScript(globalContext, sourceCopyJS.get(), documentSourceCopyJS.get(), urlCopyJS.get(), sidJS, baseLineJS); +} + +- (void)webView:(WebView *)view failedToParseSource:(NSString *)source baseLineNumber:(unsigned)baseLine fromURL:(NSURL *)url withError:(NSError *)error forWebFrame:(WebFrame *)webFrame +{ +} + +- (void)webView:(WebView *)view didEnterCallFrame:(WebScriptCallFrame *)frame sourceId:(int)sid line:(int)lineno forWebFrame:(WebFrame *)webFrame +{ + if (!globalContext) + return; + + id old = currentFrame; + currentFrame = [frame retain]; + [old release]; + + JSValueRef sidJS = JSValueMakeNumber(globalContext, sid); + JSValueRef linenoJS = JSValueMakeNumber(globalContext, lineno); + + DebuggerDocument::didEnterCallFrame(globalContext, sidJS, linenoJS); +} + +- (void)webView:(WebView *)view willExecuteStatement:(WebScriptCallFrame *)frame sourceId:(int)sid line:(int)lineno forWebFrame:(WebFrame *)webFrame +{ + if (!globalContext) + return; + + JSValueRef sidJS = JSValueMakeNumber(globalContext, sid); + JSValueRef linenoJS = JSValueMakeNumber(globalContext, lineno); + + DebuggerDocument::willExecuteStatement(globalContext, sidJS, linenoJS); +} + +- (void)webView:(WebView *)view willLeaveCallFrame:(WebScriptCallFrame *)frame sourceId:(int)sid line:(int)lineno forWebFrame:(WebFrame *)webFrame +{ + if (!globalContext) + return; + + JSValueRef sidJS = JSValueMakeNumber(globalContext, sid); + JSValueRef linenoJS = JSValueMakeNumber(globalContext, lineno); + + DebuggerDocument::willLeaveCallFrame(globalContext, sidJS, linenoJS); + + id old = currentFrame; + currentFrame = [[frame caller] retain]; + [old release]; +} + +- (void)webView:(WebView *)view exceptionWasRaised:(WebScriptCallFrame *)frame sourceId:(int)sid line:(int)lineno forWebFrame:(WebFrame *)webFrame +{ + if (!globalContext) + return; + + JSValueRef sidJS = JSValueMakeNumber(globalContext, sid); + JSValueRef linenoJS = JSValueMakeNumber(globalContext, lineno); + + DebuggerDocument::exceptionWasRaised(globalContext, sidJS, linenoJS); +} + +#pragma mark - +#pragma mark Stack & Variables + +- (WebScriptCallFrame *)currentFrame +{ + return currentFrame; +} + +#pragma mark - +#pragma mark Server Detection Callbacks + +-(NSString *)currentServerName +{ + return currentServerName; +} +@end diff --git a/WebKitTools/Drosera/mac/launcher.m b/WebKitTools/Drosera/mac/launcher.m new file mode 100644 index 0000000..7722312 --- /dev/null +++ b/WebKitTools/Drosera/mac/launcher.m @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2006, 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. + */ + +#import <Cocoa/Cocoa.h> +#import <CoreFoundation/CoreFoundation.h> + +void displayErrorAndQuit(NSString *title, NSString *message) +{ + NSApplicationLoad(); + NSRunCriticalAlertPanel(title, message, @"Quit", nil, nil); + exit(0); +} + +void checkMacOSXVersion() +{ + long versionNumber = 0; + OSErr error = Gestalt(gestaltSystemVersion, &versionNumber); + if (error != noErr || versionNumber < 0x1040) + displayErrorAndQuit(@"Mac OS X 10.4 is Required", @"Nightly builds of Drosera require Mac OS X 10.4 or newer."); +} + +static void myExecve(NSString *executable, NSArray *args, NSDictionary *environment) +{ + char **argv = (char **)calloc(sizeof(char *), [args count] + 1); + char **env = (char **)calloc(sizeof(char *), [environment count] + 1); + + NSEnumerator *e = [args objectEnumerator]; + NSString *s; + int i = 0; + while (s = [e nextObject]) + argv[i++] = (char *) [s UTF8String]; + + e = [environment keyEnumerator]; + i = 0; + while (s = [e nextObject]) + env[i++] = (char *) [[NSString stringWithFormat:@"%@=%@", s, [environment objectForKey:s]] UTF8String]; + + execve([executable fileSystemRepresentation], argv, env); +} + +NSString *currentSystemVersion() +{ + long version; + if (Gestalt(gestaltSystemVersion, &version) != noErr) + return @"10.4"; + + return [NSString stringWithFormat:@"%x.%x", (version & 0xFF00) >> 8, (version & 0x00F0) >> 4]; +} + +int main(int argc, char *argv[]) +{ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + checkMacOSXVersion(); + + CFURLRef webkitURL = nil; + OSStatus err = LSFindApplicationForInfo(kLSUnknownCreator, CFSTR("org.webkit.nightly.WebKit"), nil, nil, &webkitURL); + if (err != noErr) + displayErrorAndQuit(@"Unable to locate WebKit.app", @"Drosera nightly builds require WebKit.app to run. Please check that it is available and then try again."); + + NSBundle *webKitAppBundle = [NSBundle bundleWithPath:[(NSURL *)webkitURL path]]; + NSString *frameworkPath = [[webKitAppBundle privateFrameworksPath] stringByAppendingPathComponent:currentSystemVersion()]; + NSBundle *droseraBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"Drosera" ofType:@"app"]]; + NSString *executablePath = [droseraBundle executablePath]; + NSString *pathToEnablerLib = [webKitAppBundle pathForResource:@"WebKitNightlyEnabler" ofType:@"dylib"]; + + NSMutableArray *arguments = [NSMutableArray arrayWithObjects:executablePath, @"-WebKitDeveloperExtras", @"YES", nil]; + + while (*++argv) + [arguments addObject:[NSString stringWithUTF8String:*argv]]; + + NSDictionary *environment = [NSDictionary dictionaryWithObjectsAndKeys:frameworkPath, @"DYLD_FRAMEWORK_PATH", + @"YES", @"WEBKIT_UNSET_DYLD_FRAMEWORK_PATH", pathToEnablerLib, @"DYLD_INSERT_LIBRARIES", + [[NSBundle mainBundle] executablePath], @"WebKitAppPath", nil]; + + myExecve(executablePath, arguments, environment); + + char *error = strerror(errno); + NSString *errorMessage = [NSString stringWithFormat:@"Launching Drosera at %@ failed with the error '%s' (%d)", [(NSURL *)webkitURL path], error, errno]; + displayErrorAndQuit(@"Unable to launch Drosera", errorMessage); + + [pool release]; + return 0; +} diff --git a/WebKitTools/Drosera/mac/main.m b/WebKitTools/Drosera/mac/main.m new file mode 100644 index 0000000..2c09761 --- /dev/null +++ b/WebKitTools/Drosera/mac/main.m @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2006 Apple Computer, 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 <Cocoa/Cocoa.h> + +int main(int argc, char *argv[]) +{ + return NSApplicationMain(argc, (const char **) argv); +} |