summaryrefslogtreecommitdiffstats
path: root/WebKitTools/Drosera/mac
diff options
context:
space:
mode:
Diffstat (limited to 'WebKitTools/Drosera/mac')
-rw-r--r--WebKitTools/Drosera/mac/DebuggerApplication.h39
-rw-r--r--WebKitTools/Drosera/mac/DebuggerApplication.mm154
-rw-r--r--WebKitTools/Drosera/mac/DebuggerClient.h52
-rw-r--r--WebKitTools/Drosera/mac/DebuggerClient.mm387
-rw-r--r--WebKitTools/Drosera/mac/DebuggerDocumentPlatform.mm205
-rw-r--r--WebKitTools/Drosera/mac/Drosera.xcodeproj/project.pbxproj659
-rw-r--r--WebKitTools/Drosera/mac/Info.plist30
-rw-r--r--WebKitTools/Drosera/mac/LauncherInfo.plist26
-rw-r--r--WebKitTools/Drosera/mac/Makefile2
-rw-r--r--WebKitTools/Drosera/mac/ServerConnection.h53
-rw-r--r--WebKitTools/Drosera/mac/ServerConnection.mm265
-rw-r--r--WebKitTools/Drosera/mac/launcher.m108
-rw-r--r--WebKitTools/Drosera/mac/main.m34
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);
+}