diff -r 000000000000 -r 4f2f89ce4247 WebKitTools/WebKitLauncher/WebKitLauncherURLProtocol.m --- /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 +#import +#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