<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>PBGitXProtocol.h</filename>
    </added>
    <added>
      <filename>PBGitXProtocol.m</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -12,6 +12,7 @@
 #import &quot;PBRepositoryDocumentController.h&quot;
 #import &quot;PBCLIProxy.h&quot;
 #import &quot;PBServicesController.h&quot;
+#import &quot;PBGitXProtocol.h&quot;
 
 @implementation ApplicationController
 @synthesize cliProxy;
@@ -34,6 +35,9 @@
 
 - (void)registerServices
 {
+	// Register URL
+	[NSURLProtocol registerClass:[PBGitXProtocol class]];
+
 	// Register the service class
 	PBServicesController *services = [[PBServicesController alloc] init];
 	[NSApp setServicesProvider:services];</diff>
      <filename>ApplicationController.m</filename>
    </modified>
    <modified>
      <diff>@@ -78,4 +78,24 @@ async, which means that it doesn't matter if it takes a long time to run.
 
 While you can have direct access to most objects, sometimes it is useful to
 have an async task, for example if the operation can take a long time. Use
-this function to keep the UI responsive.
\ No newline at end of file
+this function to keep the UI responsive.
+
+Loading files from WebKit
+=========================
+
+All views that have a subclass of PBWebController set as ResourceLoadDelegate
+(this happens automatically if you assign a view to your controllers) gain
+access to the GitX:// protocol. This protocol allows you to load in blobs from
+the repository. The format is as follows:
+
+	GitX://REVISION/path/to/file
+
+Which means that revision can't have a path separator in it (so HEAD is valid,
+but pu/pb/fix_it is not). You also can't just pass on a blob oid. These things
+will probably be fixed in future revisions of the protocol.
+
+What this allows you to do, for instance, is to display images that have
+changed. For example, if you want to show the new file from a diff, you can
+use something like
+
+	&lt;img src=&quot;GitX://HEAD:Images/new_file.png&quot;&gt;
\ No newline at end of file</diff>
      <filename>Documentation/CallingFromWebKit.txt</filename>
    </modified>
    <modified>
      <diff>@@ -68,6 +68,7 @@
 		F5E92A1B0E88550E00056E75 /* empty_file.png in Resources */ = {isa = PBXBuildFile; fileRef = F5E92A1A0E88550E00056E75 /* empty_file.png */; };
 		F5E92A230E88569500056E75 /* new_file.png in Resources */ = {isa = PBXBuildFile; fileRef = F5E92A220E88569500056E75 /* new_file.png */; };
 		F5EF8C8E0E9D4A5D0050906B /* PBWebController.m in Sources */ = {isa = PBXBuildFile; fileRef = F5EF8C8D0E9D4A5D0050906B /* PBWebController.m */; };
+		F5FC41F40EBCBD4300191D80 /* PBGitXProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = F5FC41F30EBCBD4300191D80 /* PBGitXProtocol.m */; };
 		F5FE6C030EB13BC900F30D12 /* PBServicesController.m in Sources */ = {isa = PBXBuildFile; fileRef = F5FE6C020EB13BC900F30D12 /* PBServicesController.m */; };
 		F5FF4E180E0829C20006317A /* PBGitRevList.m in Sources */ = {isa = PBXBuildFile; fileRef = F5FF4E170E0829C20006317A /* PBGitRevList.m */; };
 		F5FF4E7A0E082E440006317A /* PBGitGrapher.m in Sources */ = {isa = PBXBuildFile; fileRef = F5FF4E790E082E440006317A /* PBGitGrapher.m */; };
@@ -199,6 +200,8 @@
 		F5E92A220E88569500056E75 /* new_file.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = new_file.png; path = Images/new_file.png; sourceTree = &quot;&lt;group&gt;&quot;; };
 		F5EF8C8C0E9D4A5D0050906B /* PBWebController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PBWebController.h; sourceTree = &quot;&lt;group&gt;&quot;; };
 		F5EF8C8D0E9D4A5D0050906B /* PBWebController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PBWebController.m; sourceTree = &quot;&lt;group&gt;&quot;; };
+		F5FC41F20EBCBD4300191D80 /* PBGitXProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PBGitXProtocol.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+		F5FC41F30EBCBD4300191D80 /* PBGitXProtocol.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PBGitXProtocol.m; sourceTree = &quot;&lt;group&gt;&quot;; };
 		F5FE6C010EB13BC900F30D12 /* PBServicesController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PBServicesController.h; sourceTree = &quot;&lt;group&gt;&quot;; };
 		F5FE6C020EB13BC900F30D12 /* PBServicesController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PBServicesController.m; sourceTree = &quot;&lt;group&gt;&quot;; };
 		F5FF4E160E0829C20006317A /* PBGitRevList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PBGitRevList.h; sourceTree = &quot;&lt;group&gt;&quot;; };
@@ -410,6 +413,8 @@
 				F56244080E9684B0002B6C44 /* PBUnsortableTableHeader.m */,
 				F50A41210EBB875D00208746 /* PBNiceSplitView.h */,
 				F50A41220EBB875D00208746 /* PBNiceSplitView.m */,
+				F5FC41F20EBCBD4300191D80 /* PBGitXProtocol.h */,
+				F5FC41F30EBCBD4300191D80 /* PBGitXProtocol.m */,
 			);
 			name = Aux;
 			sourceTree = &quot;&lt;group&gt;&quot;;
@@ -643,6 +648,7 @@
 				F5E424180EA3E4EB0046E362 /* PBWebDiffController.m in Sources */,
 				F5FE6C030EB13BC900F30D12 /* PBServicesController.m in Sources */,
 				F50A41230EBB875D00208746 /* PBNiceSplitView.m in Sources */,
+				F5FC41F40EBCBD4300191D80 /* PBGitXProtocol.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};</diff>
      <filename>GitX.xcodeproj/project.pbxproj</filename>
    </modified>
    <modified>
      <diff>@@ -16,9 +16,13 @@
 
 	// For async git reading
 	NSMapTable *callbacks;
+
+	// For the repository access
+	IBOutlet id repository;
 }
 
 @property (retain) NSString *startFile;
+@property (retain) id repository;
 
 - (WebScriptObject *) script;
 @end</diff>
      <filename>PBWebController.h</filename>
    </modified>
    <modified>
      <diff>@@ -8,11 +8,13 @@
 
 #import &quot;PBWebController.h&quot;
 #import &quot;PBGitRepository.h&quot;
+#import &quot;PBGitXProtocol.h&quot;
+
 #include &lt;SystemConfiguration/SCNetworkReachability.h&gt;
 
 @implementation PBWebController
 
-@synthesize startFile;
+@synthesize startFile, repository;
 
 - (void) awakeFromNib
 {
@@ -25,6 +27,7 @@
 	finishedLoading = NO;
 	[view setUIDelegate:self];
 	[view setFrameLoadDelegate:self];
+	[view setResourceLoadDelegate:self];
 	[[view mainFrame] loadRequest:request];
 }
 
@@ -50,6 +53,26 @@
 	NSLog(@&quot;Error from webkit: %@&quot;, dictionary);
 }
 
+- (NSURLRequest *)webView:(WebView *)sender
+                 resource:(id)identifier
+          willSendRequest:(NSURLRequest *)request
+         redirectResponse:(NSURLResponse *)redirectResponse
+           fromDataSource:(WebDataSource *)dataSource
+{
+	if (!self.repository)
+		return request;
+
+	// TODO: Change this to canInitWithRequest
+	if ([[[request URL] scheme] isEqualToString:@&quot;GitX&quot;]) {
+		NSMutableURLRequest *newRequest = [request mutableCopy];
+		[newRequest setRepository:self.repository];
+		return newRequest;
+	}
+
+	return request;
+}
+
+
 + (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector
 {
 	return NO;
@@ -81,7 +104,7 @@
 
 #pragma mark Using async function from JS
 
-- (void) runCommand:(WebScriptObject *)arguments inRepository:(PBGitRepository *)repository callBack:(WebScriptObject *)callBack
+- (void) runCommand:(WebScriptObject *)arguments inRepository:(PBGitRepository *)repo callBack:(WebScriptObject *)callBack
 {
 	// The JS bridge does not handle JS Arrays, even though the docs say it does. So, we convert it ourselves.
 	int length = [[arguments valueForKey:@&quot;length&quot;] intValue];
@@ -90,7 +113,7 @@
 	for (i = 0; i &lt; length; i++)
 		[realArguments addObject:[arguments webScriptValueAtIndex:i]];
 
-	NSFileHandle *handle = [repository handleInWorkDirForArguments:realArguments];
+	NSFileHandle *handle = [repo handleInWorkDirForArguments:realArguments];
 	[callbacks setObject:callBack forKey:handle];
 	[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(JSRunCommandDone:) name:NSFileHandleReadToEndOfFileCompletionNotification object:handle]; 
 	[handle readToEndOfFileInBackgroundAndNotify];</diff>
      <filename>PBWebController.m</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>b7645ec9679a88d9ef2c2954f214c4342fffa200</id>
    </parent>
  </parents>
  <author>
    <name>Pieter de Bie</name>
    <email>pdebie@ai.rug.nl</email>
  </author>
  <url>http://github.com/pieter/gitx/commit/e232181faefd7e8639c28653de10f14d6b7c869e</url>
  <id>e232181faefd7e8639c28653de10f14d6b7c869e</id>
  <committed-date>2008-11-01T11:06:05-07:00</committed-date>
  <authored-date>2008-11-01T11:06:05-07:00</authored-date>
  <message>Add a GitX:// protocol handler

This allows to read in arbitrary blobs from the repository.
For more information, see the CallingFromWebKit.txt
document in the Documentation/ directory.</message>
  <tree>84e2eca4b67939f21072a5438874ab977d636047</tree>
  <committer>
    <name>Pieter de Bie</name>
    <email>pdebie@ai.rug.nl</email>
  </committer>
</commit>
