1 /* 2 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 14 * its contributors may be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #import "WebDatabaseManagerPrivate.h" 30 #import "WebDatabaseManagerInternal.h" 31 32 #if ENABLE(DATABASE) 33 34 #import "WebDatabaseTrackerClient.h" 35 #import "WebSecurityOriginInternal.h" 36 37 #import <WebCore/DatabaseTracker.h> 38 #import <WebCore/SecurityOrigin.h> 39 40 using namespace WebCore; 41 42 NSString *WebDatabaseDirectoryDefaultsKey = @"WebDatabaseDirectory"; 43 44 NSString *WebDatabaseDisplayNameKey = @"WebDatabaseDisplayNameKey"; 45 NSString *WebDatabaseExpectedSizeKey = @"WebDatabaseExpectedSizeKey"; 46 NSString *WebDatabaseUsageKey = @"WebDatabaseUsageKey"; 47 48 NSString *WebDatabaseDidModifyOriginNotification = @"WebDatabaseDidModifyOriginNotification"; 49 NSString *WebDatabaseDidModifyDatabaseNotification = @"WebDatabaseDidModifyDatabaseNotification"; 50 NSString *WebDatabaseIdentifierKey = @"WebDatabaseIdentifierKey"; 51 52 @implementation WebDatabaseManager 53 54 + (WebDatabaseManager *) sharedWebDatabaseManager 55 { 56 static WebDatabaseManager *sharedManager = [[WebDatabaseManager alloc] init]; 57 return sharedManager; 58 } 59 60 - (NSArray *)origins 61 { 62 Vector<RefPtr<SecurityOrigin> > coreOrigins; 63 DatabaseTracker::tracker().origins(coreOrigins); 64 NSMutableArray *webOrigins = [[NSMutableArray alloc] initWithCapacity:coreOrigins.size()]; 65 66 for (unsigned i = 0; i < coreOrigins.size(); ++i) { 67 WebSecurityOrigin *webOrigin = [[WebSecurityOrigin alloc] _initWithWebCoreSecurityOrigin:coreOrigins[i].get()]; 68 [webOrigins addObject:webOrigin]; 69 [webOrigin release]; 70 } 71 72 return [webOrigins autorelease]; 73 } 74 75 - (NSArray *)databasesWithOrigin:(WebSecurityOrigin *)origin 76 { 77 Vector<String> nameVector; 78 if (!DatabaseTracker::tracker().databaseNamesForOrigin([origin _core], nameVector)) 79 return nil; 80 81 NSMutableArray *names = [[NSMutableArray alloc] initWithCapacity:nameVector.size()]; 82 83 for (unsigned i = 0; i < nameVector.size(); ++i) 84 [names addObject:(NSString *)nameVector[i]]; 85 86 return [names autorelease]; 87 } 88 89 - (NSDictionary *)detailsForDatabase:(NSString *)databaseIdentifier withOrigin:(WebSecurityOrigin *)origin 90 { 91 static id keys[3] = {WebDatabaseDisplayNameKey, WebDatabaseExpectedSizeKey, WebDatabaseUsageKey}; 92 93 DatabaseDetails details = DatabaseTracker::tracker().detailsForNameAndOrigin(databaseIdentifier, [origin _core]); 94 if (details.name().isNull()) 95 return nil; 96 97 id objects[3]; 98 objects[0] = details.displayName().isEmpty() ? databaseIdentifier : (NSString *)details.displayName(); 99 objects[1] = [NSNumber numberWithUnsignedLongLong:details.expectedUsage()]; 100 objects[2] = [NSNumber numberWithUnsignedLongLong:details.currentUsage()]; 101 102 return [[[NSDictionary alloc] initWithObjects:objects forKeys:keys count:3] autorelease]; 103 } 104 105 - (void)deleteAllDatabases 106 { 107 DatabaseTracker::tracker().deleteAllDatabases(); 108 } 109 110 - (void)deleteOrigin:(WebSecurityOrigin *)origin 111 { 112 DatabaseTracker::tracker().deleteOrigin([origin _core]); 113 } 114 115 - (void)deleteDatabase:(NSString *)databaseIdentifier withOrigin:(WebSecurityOrigin *)origin 116 { 117 DatabaseTracker::tracker().deleteDatabase([origin _core], databaseIdentifier); 118 } 119 120 @end 121 122 void WebKitInitializeDatabasesIfNecessary() 123 { 124 static BOOL initialized = NO; 125 if (initialized) 126 return; 127 128 // Set the database root path in WebCore 129 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 130 131 NSString *databasesDirectory = [defaults objectForKey:WebDatabaseDirectoryDefaultsKey]; 132 if (!databasesDirectory || ![databasesDirectory isKindOfClass:[NSString class]]) 133 databasesDirectory = @"~/Library/WebKit/Databases"; 134 135 DatabaseTracker::tracker().setDatabaseDirectoryPath([databasesDirectory stringByStandardizingPath]); 136 137 // Set the DatabaseTrackerClient 138 DatabaseTracker::tracker().setClient(WebDatabaseTrackerClient::sharedWebDatabaseTrackerClient()); 139 140 initialized = YES; 141 } 142 143 #endif 144