adium-1.4 3440:768ae5f17d0a: FBXMPP Account: Refactor Facebook n...

commits at adium.im commits at adium.im
Mon Mar 21 03:40:28 UTC 2011


details:	http://hg.adium.im/adium-1.4/rev/768ae5f17d0a
revision:	3440:768ae5f17d0a
branch:		facebook-xmpp
author:		Colin Barrett <colin at springsandstruts.com>
date:		Sun Mar 20 18:13:49 2011 -0700

FBXMPP Account: Refactor Facebook network code in preparation for making it asynchronous.
Subject: adium-1.4 3441:4ddd96b14b12: Comment out some extraneous logging statements

details:	http://hg.adium.im/adium-1.4/rev/4ddd96b14b12
revision:	3441:4ddd96b14b12
branch:		facebook-xmpp
author:		Colin Barrett <colin at springsandstruts.com>
date:		Sun Mar 20 20:19:18 2011 -0700

Comment out some extraneous logging statements
Subject: adium-1.4 3442:35d923dc71f4: FBXMPP: We now make our network requests off the main thread. Woo!

details:	http://hg.adium.im/adium-1.4/rev/35d923dc71f4
revision:	3442:35d923dc71f4
branch:		facebook-xmpp
author:		Colin Barrett <colin at springsandstruts.com>
date:		Sun Mar 20 20:19:55 2011 -0700

FBXMPP: We now make our network requests off the main thread. Woo!
Subject: adium-1.4 3443:2eed27cd9ddf: Merge

details:	http://hg.adium.im/adium-1.4/rev/2eed27cd9ddf
revision:	3443:2eed27cd9ddf
branch:		facebook-xmpp
author:		Colin Barrett <colin at springsandstruts.com>
date:		Sun Mar 20 20:39:20 2011 -0700

Merge

diffs (truncated from 1661 to 1000 lines):

diff -r 6ffc02f14020 -r 2eed27cd9ddf Plugins/Purple Service/AIFacebookXMPPAccount.h
--- a/Plugins/Purple Service/AIFacebookXMPPAccount.h	Fri Mar 18 20:46:09 2011 -0400
+++ b/Plugins/Purple Service/AIFacebookXMPPAccount.h	Sun Mar 20 20:39:20 2011 -0700
@@ -12,7 +12,14 @@
 
 @interface AIFacebookXMPPAccount : CBPurpleAccount {
 	AIFacebookXMPPOAuthWebViewWindowController *oAuthWC;
-	AIAccount *migratingAccount;
+	AIAccount *migratingAccount; // weak
+    
+    NSString *oAuthToken;
+    NSUInteger networkState;
+    
+    NSURLConnection *connection; // weak
+    NSURLResponse *connectionResponse;
+    NSMutableData *connectionData;
 }
 
 @property (nonatomic, retain) AIFacebookXMPPOAuthWebViewWindowController *oAuthWC;
diff -r 6ffc02f14020 -r 2eed27cd9ddf Plugins/Purple Service/AIFacebookXMPPAccount.m
--- a/Plugins/Purple Service/AIFacebookXMPPAccount.m	Fri Mar 18 20:46:09 2011 -0400
+++ b/Plugins/Purple Service/AIFacebookXMPPAccount.m	Sun Mar 20 20:39:20 2011 -0700
@@ -25,14 +25,43 @@
 #import <AIUtilities/AIStringAdditions.h>
 #import <Adium/AIService.h>
 
+enum {
+    AINoNetworkState,
+    AIMeGraphAPINetworkState,
+    AIPromoteSessionNetworkState
+};
+
 @interface AIFacebookXMPPAccount ()
 - (void)finishMigration;
+
+ at property (nonatomic, copy) NSString *oAuthToken;
+ at property (nonatomic, assign) NSUInteger networkState;
+ at property (nonatomic, assign) NSURLConnection *connection; // assign because NSURLConnection retains its delegate.
+ at property (nonatomic, retain) NSURLResponse *connectionResponse;
+ at property (nonatomic, retain) NSMutableData *connectionData;
+
+- (void)meGraphAPIDidFinishLoading:(NSData *)graphAPIData response:(NSURLResponse *)response error:(NSError *)inError;
+- (void)promoteSessionDidFinishLoading:(NSData *)secretData response:(NSURLResponse *)response error:(NSError *)inError;
 @end
 
 @implementation AIFacebookXMPPAccount
 
 @synthesize oAuthWC;
 @synthesize migratingAccount;
+ at synthesize oAuthToken;
+ at synthesize networkState, connection, connectionResponse, connectionData;
+
+- (void)dealloc
+{
+    [oAuthWC release];
+    [oAuthToken release];
+    
+    [connection cancel];
+    [connectionResponse release];
+    [connectionData release];
+
+    [super dealloc];
+}
 
 #pragma mark Connectivitiy
 
@@ -124,63 +153,6 @@
 	}
 }
 
-#pragma mark Status
-
-- (const char *)purpleStatusIDForStatus:(AIStatus *)statusState
-							  arguments:(NSMutableDictionary *)arguments
-{
-	const char		*statusID = NULL;
-	NSString		*statusName = statusState.statusName;
-	NSString		*statusMessageString = [statusState statusMessageString];
-	NSNumber		*priority = nil;
-	
-	if (!statusMessageString) statusMessageString = @"";
-	
-	switch (statusState.statusType) {
-		case AIAvailableStatusType:
-		{
-			if (([statusName isEqualToString:STATUS_NAME_FREE_FOR_CHAT]) ||
-				([statusMessageString caseInsensitiveCompare:[adium.statusController localizedDescriptionForCoreStatusName:STATUS_NAME_FREE_FOR_CHAT]] == NSOrderedSame))
-				statusID = jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_CHAT);
-			priority = [self preferenceForKey:KEY_JABBER_PRIORITY_AVAILABLE group:GROUP_ACCOUNT_STATUS];
-			break;
-		}
-			
-		case AIAwayStatusType:
-		{
-			if (([statusName isEqualToString:STATUS_NAME_DND]) ||
-				([statusMessageString caseInsensitiveCompare:[adium.statusController localizedDescriptionForCoreStatusName:STATUS_NAME_DND]] == NSOrderedSame) ||
-				[statusName isEqualToString:STATUS_NAME_BUSY]) {
-				//Note that Jabber doesn't actually support a 'busy' status; if we have it set because some other service supports it, treat it as DND
-				statusID = jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_DND);
-				
-			} else if (([statusName isEqualToString:STATUS_NAME_EXTENDED_AWAY]) ||
-					   ([statusMessageString caseInsensitiveCompare:[adium.statusController localizedDescriptionForCoreStatusName:STATUS_NAME_EXTENDED_AWAY]] == NSOrderedSame))
-				statusID = jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_XA);
-			priority = [self preferenceForKey:KEY_JABBER_PRIORITY_AWAY group:GROUP_ACCOUNT_STATUS];
-			break;
-		}
-			
-		case AIInvisibleStatusType:
-			AILog(@"Warning: Invisibility is not yet supported in libpurple 2.0.0 jabber");
-			priority = [self preferenceForKey:KEY_JABBER_PRIORITY_AWAY group:GROUP_ACCOUNT_STATUS];
-			statusID = jabber_buddy_state_get_status_id(JABBER_BUDDY_STATE_AWAY);
-			break;
-			
-		case AIOfflineStatusType:
-			break;
-	}
-	
-	//Set our priority, which is actually set along with the status...Default is 0.
-	[arguments setObject:(priority ? priority : [NSNumber numberWithInt:0])
-				  forKey:@"priority"];
-	
-	//If we didn't get a purple status ID, request one from super
-	if (statusID == NULL) statusID = [super purpleStatusIDForStatus:statusState arguments:arguments];
-	
-	return statusID;
-}
-
 #pragma mark Account configuration
 
 - (void)setName:(NSString *)name UID:(NSString *)inUID
@@ -239,6 +211,7 @@
 	if (self.migratingAccount) {
 		self.oAuthWC.autoFillUsername = self.migratingAccount.UID;
 		self.oAuthWC.autoFillPassword = [adium.accountController passwordForAccount:self.migratingAccount];
+		[self.oAuthWC.window setTitle:[NSString stringWithFormat:AILocalizedString(@"Migrating %@", nil), self.migratingAccount.UID]];
 	}
 
 	[self.oAuthWC showWindow:self];
@@ -246,43 +219,123 @@
 
 - (void)oAuthWebViewController:(AIFacebookXMPPOAuthWebViewWindowController *)wc didSucceedWithToken:(NSString *)token
 {
-    NSString *urlstring = [NSString stringWithFormat:@"https://graph.facebook.com/me?access_token=%@", token];
+    [self setOAuthToken:token];
+    
+    NSString *urlstring = [NSString stringWithFormat:@"https://graph.facebook.com/me?access_token=%@", [self oAuthToken]];
     NSURL *url = [NSURL URLWithString:[urlstring stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]];
     NSURLRequest *request = [NSURLRequest requestWithURL:url];
-    NSURLResponse *response;
-    NSError *error;
     
-    NSData *conn = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
-    NSDictionary *resp = [conn objectFromJSONDataWithParseOptions:JKParseOptionNone error:&error];
+    self.networkState = AIMeGraphAPINetworkState;
+    self.connectionData = [NSMutableData data];
+    self.connection = [NSURLConnection connectionWithRequest:request delegate:self];
+}
+
+- (void)meGraphAPIDidFinishLoading:(NSData *)graphAPIData response:(NSURLResponse *)inResponse error:(NSError *)inError
+{
+    if (inError) {
+        NSLog(@"error loading graph API: %@", inError);
+        // TODO: indicate setup failed 
+        return;
+    }
+    
+    NSError *error = nil;
+    NSDictionary *resp = [graphAPIData objectFromJSONDataWithParseOptions:JKParseOptionNone error:&error];
+    if (!resp) {
+        NSLog(@"error decoding graph API response: %@", error);
+        // TODO: indicate setup failed
+        return;
+    }
+    
     NSString *uuid = [resp objectForKey:@"id"];
     NSString *name = [resp objectForKey:@"name"];
     
-    NSString *sessionKey = [[token componentsSeparatedByString:@"|"] objectAtIndex:1];
-    
-    NSString *secretURLString = [NSString stringWithFormat:@"https://api.facebook.com/method/auth.promoteSession?access_token=%@&format=JSON", token];
+    /* Passwords are keyed by UID, so we need to make this change before storing the password */
+	[self setName:name UID:uuid];
+        
+    NSString *secretURLString = [NSString stringWithFormat:@"https://api.facebook.com/method/auth.promoteSession?access_token=%@&format=JSON", [self oAuthToken]];
     NSURL *secretURL = [NSURL URLWithString:[secretURLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
     NSURLRequest *secretRequest = [NSURLRequest requestWithURL:secretURL];
-    NSData *secretData = [NSURLConnection sendSynchronousRequest:secretRequest returningResponse:&response error:&error];
+
+    self.networkState = AIPromoteSessionNetworkState;
+    self.connectionData = [NSMutableData data];
+    self.connection = [NSURLConnection connectionWithRequest:secretRequest delegate:self];
+}
+
+- (void)promoteSessionDidFinishLoading:(NSData *)secretData response:(NSURLResponse *)response error:(NSError *)inError
+{
+    if (inError) {
+        NSLog(@"error promoting session: %@", inError);
+        // TODO: indicate setup failed
+        return;
+    }    
+    
     NSString *secret = [[[NSString alloc] initWithData:secretData encoding:NSUTF8StringEncoding] autorelease];
     secret = [secret substringWithRange:NSMakeRange(1, [secret length] - 2)]; // strip off the quotes    
-    
-	/* Passwords are keyed by UID, so we need to make this change before storing the password */
-	[self setName:name UID:uuid];
-	
+    NSString *sessionKey = [[[self oAuthToken] componentsSeparatedByString:@"|"] objectAtIndex:1];
+   	
 	[[adium accountController] setPassword:sessionKey forAccount:self];
 	[self setPasswordTemporarily:sessionKey];
 	
 	[self setPreference:secret
 				 forKey:@"FBSessionSecret"
 				  group:GROUP_ACCOUNT_STATUS];
-
+    
 	self.oAuthWC = nil;
-
+    self.oAuthToken = nil;
+    
 	/* When we're newly authorized, connect! */
 	[self connect];
 	
-	if (self.migratingAccount)
-		[self finishMigration];
+	if (self.migratingAccount) {
+		[self finishMigration];        
+    }
+}
+
+#pragma mark NSURLConnectionDelegate
+
+- (void)connection:(NSURLConnection *)inConnection didReceiveResponse:(NSURLResponse *)response
+{
+    [[self connectionData] setLength:0];
+    [self setConnectionResponse:response];
+}
+
+- (void)connection:(NSURLConnection *)inConnection didReceiveData:(NSData *)data
+{
+    [[self connectionData] appendData:data];
+}
+
+- (void)connection:(NSURLConnection *)inConnection didFailWithError:(NSError *)error
+{
+    NSUInteger state = [self networkState];
+    
+    [self setNetworkState:AINoNetworkState];
+    [self setConnection:nil];
+    [self setConnectionResponse:nil];
+    [self setConnectionData:nil];    
+    
+    if (state == AIMeGraphAPINetworkState) {
+        [self meGraphAPIDidFinishLoading:nil response:nil error:error];
+    } else if (state == AIPromoteSessionNetworkState) {
+        [self promoteSessionDidFinishLoading:nil response:nil error:error];
+    }
+}
+
+- (void)connectionDidFinishLoading:(NSURLConnection *)inConnection
+{
+    NSURLResponse *response = [[[self connectionResponse] retain] autorelease];
+    NSMutableData *data = [[[self connectionData] retain] autorelease];
+    NSUInteger state = [self networkState]; 
+    
+    [self setNetworkState:AINoNetworkState];
+    [self setConnection:nil];
+    [self setConnectionResponse:nil];
+    [self setConnectionData:nil];
+    
+    if (state == AIMeGraphAPINetworkState) {
+        [self meGraphAPIDidFinishLoading:data response:response error:nil];
+    } else if (state == AIPromoteSessionNetworkState) {
+        [self promoteSessionDidFinishLoading:data response:response error:nil];
+    }    
 }
 
 #pragma mark Migration
diff -r 6ffc02f14020 -r 2eed27cd9ddf Plugins/Purple Service/AIFacebookXMPPAccountViewController.m
--- a/Plugins/Purple Service/AIFacebookXMPPAccountViewController.m	Fri Mar 18 20:46:09 2011 -0400
+++ b/Plugins/Purple Service/AIFacebookXMPPAccountViewController.m	Sun Mar 20 20:39:20 2011 -0700
@@ -9,6 +9,7 @@
 #import "AIFacebookXMPPAccount.h"
 #import "AIFacebookXMPPAccountViewController.h"
 #import <Adium/AIAccount.h>
+#import <Adium/AIAccountControllerProtocol.h>
 
 @implementation AIFacebookXMPPAccountViewController
 @synthesize view_migration, textField_migrationStatus, button_migrationHelp, button_migrationOAuthStart, migrationSpinner;
@@ -43,6 +44,19 @@
 }
 
 /*!
+ * @brief Configure controls
+ */
+- (void)configureForAccount:(AIAccount *)inAccount
+{
+	[super configureForAccount:inAccount];
+	
+	if (account.UID && [[adium.accountController passwordForAccount:account] length]) {
+		[textField_OAuthStatus setStringValue:AILocalizedString(@"Adium currently has access to your account.", nil)];
+		[button_OAuthStart setEnabled:NO];
+	}
+}
+
+/*!
  * @brief A preference was changed
  *
  * Don't save here; merely update controls as necessary.
diff -r 6ffc02f14020 -r 2eed27cd9ddf Plugins/Purple Service/AIFacebookXMPPOAuthWebViewWindowController.m
--- a/Plugins/Purple Service/AIFacebookXMPPOAuthWebViewWindowController.m	Fri Mar 18 20:46:09 2011 -0400
+++ b/Plugins/Purple Service/AIFacebookXMPPOAuthWebViewWindowController.m	Sun Mar 20 20:39:20 2011 -0700
@@ -136,45 +136,45 @@
 - (void)addCookiesToRequest:(NSMutableURLRequest *)request
 {
     NSURL *requestURL = [request URL];
-    NSLog(@"requestURL: %@", requestURL);
+    //NSLog(@"requestURL: %@", requestURL);
     NSMutableArray *sentCookies = [NSMutableArray array];
     
     // same origin: domain, port, path.
     for (NSHTTPCookie *cookie in cookies) {
         if ([[cookie expiresDate] timeIntervalSinceNow] < 0) {
-            NSLog(@"****** expired: %@", cookie);
+            //NSLog(@"****** expired: %@", cookie);
             continue;
         }
         
         if ([cookie isSecure] && ![[requestURL scheme] isEqualToString:@"https"]) {
-            NSLog(@"****** secure not https: %@", cookie);
+            //NSLog(@"****** secure not https: %@", cookie);
             continue;
         }
         
         if ([[cookie domain] hasPrefix:@"."]) { // ".example.com" should match "foo.example.com" and "example.com"            
             if (!([[requestURL host] hasSuffix:[cookie domain]] ||
                   [[@"." stringByAppendingString:[requestURL host]] isEqualToString:[cookie domain]])) {
-                NSLog(@"****** dot prefix host mismatch: %@", cookie);
+                //NSLog(@"****** dot prefix host mismatch: %@", cookie);
                 continue;
             }
         } else {
             if (![[requestURL host] isEqualToString:[cookie domain]]) {
-                NSLog(@"****** host mismatch: %@", cookie);
+                //NSLog(@"****** host mismatch: %@", cookie);
                 continue;
             }
         }
         
         if ([cookie portList] && ![[cookie portList] containsObject:[requestURL port]]) {
-            NSLog(@"****** port mismatch: %@", cookie);
+            //NSLog(@"****** port mismatch: %@", cookie);
             continue;
         }
         
         if (![[requestURL path] hasPrefix:[cookie path]]) {
-            NSLog(@"****** path mismatch: %@", cookie);
+            //NSLog(@"****** path mismatch: %@", cookie);
             continue;
         }
         
-        NSLog(@"adding cookie: %@", cookie);
+        //NSLog(@"adding cookie: %@", cookie);
         [sentCookies addObject:cookie];
     }
     
diff -r 6ffc02f14020 -r 2eed27cd9ddf Plugins/Purple Service/AIFacebookXMPPOauthWebViewWindow.xib
--- a/Plugins/Purple Service/AIFacebookXMPPOauthWebViewWindow.xib	Fri Mar 18 20:46:09 2011 -0400
+++ b/Plugins/Purple Service/AIFacebookXMPPOauthWebViewWindow.xib	Sun Mar 20 20:39:20 2011 -0700
@@ -3,7 +3,7 @@
 	<data>
 		<int key="IBDocument.SystemTarget">1050</int>
 		<string key="IBDocument.SystemVersion">10J567</string>
-		<string key="IBDocument.InterfaceBuilderVersion">788</string>
+		<string key="IBDocument.InterfaceBuilderVersion">1305</string>
 		<string key="IBDocument.AppKitVersion">1038.35</string>
 		<string key="IBDocument.HIToolboxVersion">462.00</string>
 		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
@@ -15,13 +15,17 @@
 			</object>
 			<object class="NSMutableArray" key="dict.values">
 				<bool key="EncodedWithXMLCoder">YES</bool>
-				<string>788</string>
-				<string>788</string>
+				<string>1305</string>
+				<string>30</string>
 			</object>
 		</object>
-		<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
+		<object class="NSArray" key="IBDocument.IntegratedClassDependencies">
 			<bool key="EncodedWithXMLCoder">YES</bool>
-			<integer value="1"/>
+			<string>NSWindowTemplate</string>
+			<string>NSView</string>
+			<string>NSProgressIndicator</string>
+			<string>NSCustomObject</string>
+			<string>WebView</string>
 		</object>
 		<object class="NSArray" key="IBDocument.PluginDependencies">
 			<bool key="EncodedWithXMLCoder">YES</bool>
@@ -33,9 +37,7 @@
 			<object class="NSArray" key="dict.sortedKeys" id="0">
 				<bool key="EncodedWithXMLCoder">YES</bool>
 			</object>
-			<object class="NSMutableArray" key="dict.values">
-				<bool key="EncodedWithXMLCoder">YES</bool>
-			</object>
+			<reference key="dict.values" ref="0"/>
 		</object>
 		<object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
 			<bool key="EncodedWithXMLCoder">YES</bool>
@@ -53,10 +55,9 @@
 				<int key="NSWindowBacking">2</int>
 				<string key="NSWindowRect">{{196, 130}, {640, 380}}</string>
 				<int key="NSWTFlags">544735232</int>
-				<string key="NSWindowTitle">Window</string>
+				<string key="NSWindowTitle">Facebook Account Setup</string>
 				<string key="NSWindowClass">NSWindow</string>
 				<nil key="NSViewClass"/>
-				<string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
 				<object class="NSView" key="NSWindowView" id="1006">
 					<reference key="NSNextResponder"/>
 					<int key="NSvFlags">256</int>
@@ -88,6 +89,7 @@
 							</object>
 							<string key="NSFrameSize">{640, 380}</string>
 							<reference key="NSSuperview" ref="1006"/>
+							<reference key="NSWindow"/>
 							<reference key="NSNextKeyView"/>
 							<string key="FrameName"/>
 							<string key="GroupName"/>
@@ -118,16 +120,19 @@
 							<object class="NSPSMatrix" key="NSDrawMatrix"/>
 							<string key="NSFrame">{{304, 174}, {32, 32}}</string>
 							<reference key="NSSuperview" ref="1006"/>
+							<reference key="NSWindow"/>
+							<reference key="NSNextKeyView"/>
 							<int key="NSpiFlags">28682</int>
 							<double key="NSMaxValue">100</double>
 						</object>
 					</object>
-					<string key="NSFrameSize">{640, 380}</string>
+					<string key="NSFrame">{{7, 11}, {640, 380}}</string>
 					<reference key="NSSuperview"/>
+					<reference key="NSWindow"/>
 					<reference key="NSNextKeyView" ref="950810926"/>
 				</object>
 				<string key="NSScreenRect">{{0, 0}, {1680, 1028}}</string>
-				<string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
+				<string key="NSMaxSize">{1e+13, 1e+13}</string>
 				<string key="NSFrameAutosaveName">FBXMPPOAUTH</string>
 			</object>
 		</object>
@@ -267,17 +272,13 @@
 			<object class="NSMutableDictionary" key="unlocalizedProperties">
 				<bool key="EncodedWithXMLCoder">YES</bool>
 				<reference key="dict.sortedKeys" ref="0"/>
-				<object class="NSMutableArray" key="dict.values">
-					<bool key="EncodedWithXMLCoder">YES</bool>
-				</object>
+				<reference key="dict.values" ref="0"/>
 			</object>
 			<nil key="activeLocalization"/>
 			<object class="NSMutableDictionary" key="localizations">
 				<bool key="EncodedWithXMLCoder">YES</bool>
 				<reference key="dict.sortedKeys" ref="0"/>
-				<object class="NSMutableArray" key="dict.values">
-					<bool key="EncodedWithXMLCoder">YES</bool>
-				</object>
+				<reference key="dict.values" ref="0"/>
 			</object>
 			<nil key="sourceID"/>
 			<int key="maxID">9</int>
@@ -322,7 +323,7 @@
 					</object>
 					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Plugins/Purple Service/AIFacebookXMPPOAuthWebViewWindowController.h</string>
+						<string key="minorKey">./Classes/AIFacebookXMPPOAuthWebViewWindowController.h</string>
 					</object>
 				</object>
 				<object class="IBPartialClassDescription">
@@ -341,1163 +342,25 @@
 					</object>
 					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Frameworks/Adium Framework/Source/AIWindowController.h</string>
+						<string key="minorKey">./Classes/AIWindowController.h</string>
 					</object>
 				</object>
 				<object class="IBPartialClassDescription">
-					<string key="className">NSApplication</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Frameworks/AIUtilities Framework/Source/AIApplicationAdditions.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSMenu</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Frameworks/AIUtilities Framework/Source/AIMenuAdditions.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Frameworks/AIUtilities Framework/Source/AIDividedAlternatingRowOutlineView.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Frameworks/AIUtilities Framework/Source/AIMultiCellOutlineView.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Frameworks/AIUtilities Framework/Source/AIObjectAdditions.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Frameworks/AIUtilities Framework/Source/AIToolbarTabView.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Frameworks/AIUtilities Framework/Source/AIToolbarUtilities.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Frameworks/AIUtilities Framework/Source/AIVariableHeightFlexibleColumnsOutlineView.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Frameworks/AIUtilities Framework/Source/AIVariableHeightOutlineView.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
+					<string key="className">WebView</string>
 					<object class="NSMutableDictionary" key="actions">
-						<string key="NS.key.0">toggleFindPanel:</string>
+						<string key="NS.key.0">reloadFromOrigin:</string>
 						<string key="NS.object.0">id</string>
 					</object>
 					<object class="NSMutableDictionary" key="actionInfosByName">
-						<string key="NS.key.0">toggleFindPanel:</string>
+						<string key="NS.key.0">reloadFromOrigin:</string>
 						<object class="IBActionInfo" key="NS.object.0">
-							<string key="name">toggleFindPanel:</string>
+							<string key="name">reloadFromOrigin:</string>
 							<string key="candidateClassName">id</string>
 						</object>
 					</object>
 					<object class="IBClassDescriptionSource" key="sourceIdentifier">
 						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Frameworks/Adium Framework/Source/AIAbstractListController.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Frameworks/Adium Framework/Source/AIAccountControllerProtocol.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Frameworks/Adium Framework/Source/AICustomSocialNetworkingStatusWindowController.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Frameworks/Adium Framework/Source/AIEditStateWindowController.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="NSMutableDictionary" key="actions">
-						<string key="NS.key.0">adiumPrint:</string>
-						<string key="NS.object.0">id</string>
-					</object>
-					<object class="NSMutableDictionary" key="actionInfosByName">
-						<string key="NS.key.0">adiumPrint:</string>
-						<object class="IBActionInfo" key="NS.object.0">
-							<string key="name">adiumPrint:</string>
-							<string key="candidateClassName">id</string>
-						</object>
-					</object>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier" id="109735573">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Frameworks/Adium Framework/Source/AIInterfaceControllerProtocol.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Frameworks/Adium Framework/Source/AILocalizationAssistance.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Frameworks/Adium Framework/Source/AIMenuControllerProtocol.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Frameworks/Adium Framework/Source/AIPreferenceControllerProtocol.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Frameworks/Adium Framework/Source/ESContactAlertsViewController.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Frameworks/Adium Framework/Source/ESPresetManagementController.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Frameworks/Adium Framework/Source/ESPresetNameSheetController.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Frameworks/Adium Framework/Source/ESTextAndButtonsWindowController.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Frameworks/Adium Framework/Source/JVFontPreviewField.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="NSMutableDictionary" key="actions">
-						<string key="NS.key.0">prefsWindowWillClose:</string>
-						<string key="NS.object.0">SS_PrefsController</string>
-					</object>
-					<object class="NSMutableDictionary" key="actionInfosByName">
-						<string key="NS.key.0">prefsWindowWillClose:</string>
-						<object class="IBActionInfo" key="NS.object.0">
-							<string key="name">prefsWindowWillClose:</string>
-							<string key="candidateClassName">SS_PrefsController</string>
-						</object>
-					</object>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier" id="1040092293">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Frameworks/Adium Framework/Source/SS_PrefsController.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="NSMutableDictionary" key="actions">
-						<bool key="EncodedWithXMLCoder">YES</bool>
-						<object class="NSArray" key="dict.sortedKeys">
-							<bool key="EncodedWithXMLCoder">YES</bool>
-							<string>didAdjustSubviews:</string>
-							<string>willAdjustSubviews:</string>
-						</object>
-						<object class="NSMutableArray" key="dict.values">
-							<bool key="EncodedWithXMLCoder">YES</bool>
-							<string>RBSplitView</string>
-							<string>RBSplitView</string>
-						</object>
-					</object>
-					<object class="NSMutableDictionary" key="actionInfosByName">
-						<bool key="EncodedWithXMLCoder">YES</bool>
-						<object class="NSArray" key="dict.sortedKeys">
-							<bool key="EncodedWithXMLCoder">YES</bool>
-							<string>didAdjustSubviews:</string>
-							<string>willAdjustSubviews:</string>
-						</object>
-						<object class="NSMutableArray" key="dict.values">
-							<bool key="EncodedWithXMLCoder">YES</bool>
-							<object class="IBActionInfo">
-								<string key="name">didAdjustSubviews:</string>
-								<string key="candidateClassName">RBSplitView</string>
-							</object>
-							<object class="IBActionInfo">
-								<string key="name">willAdjustSubviews:</string>
-								<string key="candidateClassName">RBSplitView</string>
-							</object>
-						</object>
-					</object>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier" id="73674137">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Frameworks/RBSplitView/Source/RBSplitView.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Frameworks/ShortcutRecorder/Source/SRRecorderCell.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Frameworks/ShortcutRecorder/Source/SRRecorderControl.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Frameworks/ShortcutRecorder/Source/SRValidator.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Plugins/Bonjour/libezv/Simple HTTP Server/AsyncSocket.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Plugins/Purple Service/SLPurpleCocoaAdapter.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Plugins/WebKit Message View/ESWebView.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Source/AIListLayoutWindowController.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Source/AIListThemeWindowController.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Source/AIMenuItemView.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Source/AINewBookmarkWindowController.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Source/AIObjectDebug.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Source/AIServiceMenu.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Source/KNShelfSplitView.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Source/OWABSearchWindowController.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSView</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Frameworks/AIUtilities Framework/Source/AIViewAdditions.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSWindow</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Frameworks/AIUtilities Framework/Source/AIWindowAdditions.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSWindow</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Source/NSWindowScriptingAdditions.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSWindowController</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Frameworks/AIUtilities Framework/Source/AIWindowControllerAdditions.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSWindowController</string>
-					<reference key="sourceIdentifier" ref="109735573"/>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">RBSplitSubview</string>
-					<string key="superclassName">NSView</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBProjectSource</string>
-						<string key="minorKey">Frameworks/RBSplitView/Source/RBSplitSubview.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">RBSplitView</string>
-					<string key="superclassName">RBSplitSubview</string>
-					<object class="NSMutableDictionary" key="outlets">
-						<string key="NS.key.0">delegate</string>
-						<string key="NS.object.0">id</string>
-					</object>
-					<object class="NSMutableDictionary" key="toOneOutletInfosByName">
-						<string key="NS.key.0">delegate</string>
-						<object class="IBToOneOutletInfo" key="NS.object.0">
-							<string key="name">delegate</string>
-							<string key="candidateClassName">id</string>
-						</object>
-					</object>
-					<reference key="sourceIdentifier" ref="73674137"/>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">SS_PrefsController</string>
-					<string key="superclassName">NSObject</string>
-					<object class="NSMutableDictionary" key="outlets">
-						<string key="NS.key.0">delegate</string>
-						<string key="NS.object.0">id</string>
-					</object>
-					<object class="NSMutableDictionary" key="toOneOutletInfosByName">
-						<string key="NS.key.0">delegate</string>
-						<object class="IBToOneOutletInfo" key="NS.object.0">
-							<string key="name">delegate</string>
-							<string key="candidateClassName">id</string>
-						</object>
-					</object>
-					<reference key="sourceIdentifier" ref="1040092293"/>
-				</object>
-			</object>
-			<object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+">
-				<bool key="EncodedWithXMLCoder">YES</bool>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSApplication</string>
-					<string key="superclassName">NSResponder</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier" id="275189657">
-						<string key="majorKey">IBFrameworkSource</string>
-						<string key="minorKey">AppKit.framework/Headers/NSApplication.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSApplication</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier" id="356639062">
-						<string key="majorKey">IBFrameworkSource</string>
-						<string key="minorKey">AppKit.framework/Headers/NSApplicationScripting.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSApplication</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier" id="918129567">
-						<string key="majorKey">IBFrameworkSource</string>
-						<string key="minorKey">AppKit.framework/Headers/NSColorPanel.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSApplication</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBFrameworkSource</string>
-						<string key="minorKey">AppKit.framework/Headers/NSHelpManager.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSApplication</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBFrameworkSource</string>
-						<string key="minorKey">AppKit.framework/Headers/NSPageLayout.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSApplication</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBFrameworkSource</string>
-						<string key="minorKey">AppKit.framework/Headers/NSUserInterfaceItemSearching.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSMenu</string>
-					<string key="superclassName">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier" id="513132299">
-						<string key="majorKey">IBFrameworkSource</string>
-						<string key="minorKey">AppKit.framework/Headers/NSMenu.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBFrameworkSource</string>
-						<string key="minorKey">AddressBook.framework/Headers/ABActions.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBFrameworkSource</string>
-						<string key="minorKey">AppKit.framework/Headers/NSAccessibility.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<reference key="sourceIdentifier" ref="275189657"/>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<reference key="sourceIdentifier" ref="356639062"/>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<reference key="sourceIdentifier" ref="918129567"/>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBFrameworkSource</string>
-						<string key="minorKey">AppKit.framework/Headers/NSControl.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBFrameworkSource</string>
-						<string key="minorKey">AppKit.framework/Headers/NSDictionaryController.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">
-					<string key="className">NSObject</string>
-					<object class="IBClassDescriptionSource" key="sourceIdentifier">
-						<string key="majorKey">IBFrameworkSource</string>
-						<string key="minorKey">AppKit.framework/Headers/NSDragging.h</string>
-					</object>
-				</object>
-				<object class="IBPartialClassDescription">




More information about the commits mailing list