blob: ca4484851b6b7a59a4de1c2ee8dfafcb2deea4d6 [file] [log] [blame]
// 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