WebKitTools/WebKitLauncher/WebKitLauncherURLProtocol.m
changeset 0 4f2f89ce4247
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WebKitTools/WebKitLauncher/WebKitLauncherURLProtocol.m	Fri Sep 17 09:02:29 2010 +0300
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2009 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 INC. OR
+ * 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 "WebKitLauncherURLProtocol.h"
+#import "WebKitNightlyEnabler.h"
+
+#if ENABLE_SPARKLE
+#import <AppKit/AppKit.h>
+#import <Sparkle/Sparkle.h>
+#endif
+
+@interface WebKitLauncherURLProtocol (ImplementationDetails)
+-(void)handleIsWebKitLauncherAvailableJS;
+-(void)handleCheckForUpdates;
+-(void)resourceNotFound;
+@end
+
+@implementation WebKitLauncherURLProtocol
+
++(void)load
+{
+    [NSURLProtocol registerClass:self];
+}
+
++(BOOL)canInitWithRequest:(NSURLRequest *)request
+{
+    if (![[[request URL] scheme] isEqualToString:@"x-webkit-launcher"])
+        return NO;
+
+    NSURL *mainDocumentURL = [request mainDocumentURL];
+    if (!mainDocumentURL)
+        return NO;
+
+    NSString *mainDocumentHost = [mainDocumentURL host];
+    if (![mainDocumentHost isEqualToString:@"webkit.org"] && ![mainDocumentHost hasSuffix:@".webkit.org"])
+        return NO;
+
+    return YES;
+}
+
++(NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request
+{
+    return request;
+}
+
+-(void)startLoading
+{
+    NSURLRequest *request = [self request];
+    NSString *resourceSpecifier = [[request URL] resourceSpecifier];
+    if ([resourceSpecifier isEqualToString:@"is-x-webkit-launcher-available.js"]) {
+        [self handleIsWebKitLauncherAvailableJS];
+        return;
+    }
+#if ENABLE_SPARKLE
+    if ([resourceSpecifier isEqualToString:@"check-for-updates"]) {
+        [self handleCheckForUpdates];
+        return;
+    }
+#endif
+    [self resourceNotFound];
+}
+
+-(void)stopLoading
+{
+}
+
+-(void)handleIsWebKitLauncherAvailableJS
+{
+    id client = [self client];
+    NSURLResponse *response = [[NSURLResponse alloc] initWithURL:[[self request] URL] MIMEType:@"text/javascript" expectedContentLength:0 textEncodingName:@"utf-8"];
+    [client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageAllowed];
+    [response release];
+
+    NSData *data = [@"var isWebKitLauncherAvailable = true;" dataUsingEncoding:NSUTF8StringEncoding];
+    [client URLProtocol:self didLoadData:data];
+    [client URLProtocolDidFinishLoading:self];
+}
+
+#if ENABLE_SPARKLE
+-(void)handleCheckForUpdates
+{
+    id client = [self client];
+    NSURLResponse *response = [[NSURLResponse alloc] initWithURL:[[self request] URL] MIMEType:@"text/plain" expectedContentLength:0 textEncodingName:@"utf-8"];
+    [client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
+    [response release];
+
+    SUUpdater *updater = [SUUpdater updaterForBundle:webKitLauncherBundle()];
+    [updater performSelectorOnMainThread:@selector(checkForUpdates:) withObject:self waitUntilDone:NO];
+    [client URLProtocolDidFinishLoading:self];
+}
+#endif
+
+-(void)resourceNotFound
+{
+    id client = [self client];
+    NSDictionary *infoDictionary = [NSDictionary dictionaryWithObject:NSErrorFailingURLStringKey forKey:[[self request] URL]];
+    NSError *error = [NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorFileDoesNotExist userInfo:infoDictionary];
+    [client URLProtocol:self didFailWithError:error];
+}
+
+@end