/* * 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