// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #import "crnet_consumer_app_delegate.h" #import "CrNet.h" #include "base/format_macros.h" #import "crnet_consumer_view_controller.h" @implementation CrNetConsumerAppDelegate { NSUInteger _counter; } @synthesize window; @synthesize viewController; // Returns a file name to save net internals logging. This method suffixes // the ivar |_counter| to the file name so a new name can be obtained by // modifying that. - (NSString*)currentNetLogFileName { return [NSString stringWithFormat:@"crnet-consumer-net-log%" PRIuNS ".json", _counter]; } - (NSString*)SDCHPrefStoreFileName { NSFileManager* manager = [NSFileManager defaultManager]; NSArray* possibleURLs = [manager URLsForDirectory:NSApplicationSupportDirectory inDomains:NSUserDomainMask]; NSURL* appSupportDir = [possibleURLs firstObject]; if (appSupportDir == nil) return nil; NSURL* prefStoreFile = [NSURL URLWithString:@"sdch-prefs.json" relativeToURL:appSupportDir]; NSError* error = nil; [manager createDirectoryAtURL:appSupportDir withIntermediateDirectories:YES attributes:nil error:&error]; return error != nil ? [prefStoreFile path] : nil; } - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions { [CrNet setPartialUserAgent:@"Dummy/1.0"]; [CrNet setQuicEnabled:YES]; // Always use QUIC if able. [CrNet setAlternateProtocolThreshold:0.0]; [CrNet setSDCHEnabled:YES withPrefStore:[self SDCHPrefStoreFileName]]; [CrNet install]; [CrNet startNetLogToFile:[self currentNetLogFileName] logBytes:NO]; NSURLSessionConfiguration* config = [NSURLSessionConfiguration ephemeralSessionConfiguration]; [CrNet installIntoSessionConfiguration:config]; // Just for fun, don't route chromium.org requests through CrNet. // // |chromiumPrefix| is declared outside the scope of the request block so that // the block references something outside of its own scope, and cannot be // declared as a global block. This makes sure the block is // an __NSStackBlock__, and verifies the fix for http://crbug.com/436175 . NSString *chromiumPrefix = @"www.chromium.org"; [CrNet setRequestFilterBlock:^BOOL (NSURLRequest *request) { BOOL isChromiumSite = [[[request URL] host] hasPrefix:chromiumPrefix]; return !isChromiumSite; }]; self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.viewController = [[CrNetConsumerViewController alloc] initWithNibName:nil bundle:nil]; self.window.rootViewController = self.viewController; [self.window makeKeyAndVisible]; return YES; } - (void)applicationDidEnterBackground:(UIApplication*)application { [CrNet stopNetLog]; [CrNet clearCacheWithCompletionCallback:^(int error) { NSLog(@"Cache cleared: %d\n", error); }]; } - (void)applicationWillEnterForeground:(UIApplication*)application { _counter++; [CrNet startNetLogToFile:[self currentNetLogFileName] logBytes:NO]; } @end