Changeset 195090 in webkit
- Timestamp:
- Jan 14, 2016 9:40:39 PM (8 years ago)
- Location:
- trunk/Source
- Files:
-
- 14 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r195088 r195090 1 2016-01-14 Brady Eidson <beidson@apple.com> 2 3 Modern IDB: Support opening and deleting SQLite databases on disk. 4 https://bugs.webkit.org/show_bug.cgi?id=153084 5 6 Reviewed by Alex Christensen, Sam Weinig and Andy Estes (oh my!). 7 8 No new tests (Infrastructure, no testable change in behavior). 9 10 * Modules/indexeddb/IDBDatabaseIdentifier.cpp: 11 (WebCore::IDBDatabaseIdentifier::databaseDirectoryRelativeToRoot): 12 * Modules/indexeddb/IDBDatabaseIdentifier.h: 13 14 * Modules/indexeddb/server/IDBServer.cpp: 15 (WebCore::IDBServer::IDBServer::create): 16 (WebCore::IDBServer::IDBServer::IDBServer): 17 (WebCore::IDBServer::IDBServer::createBackingStore): 18 * Modules/indexeddb/server/IDBServer.h: 19 20 * Modules/indexeddb/server/SQLiteIDBBackingStore.cpp: 21 (WebCore::IDBServer::SQLiteIDBBackingStore::SQLiteIDBBackingStore): 22 (WebCore::IDBServer::SQLiteIDBBackingStore::getOrEstablishDatabaseInfo): 23 (WebCore::IDBServer::SQLiteIDBBackingStore::deleteBackingStore): 24 * Modules/indexeddb/server/SQLiteIDBBackingStore.h: 25 26 * Modules/indexeddb/shared/InProcessIDBServer.cpp: 27 (WebCore::InProcessIDBServer::create): 28 (WebCore::InProcessIDBServer::InProcessIDBServer): 29 * Modules/indexeddb/shared/InProcessIDBServer.h: 30 1 31 2016-01-14 Myles C. Maxfield <mmaxfield@apple.com> 2 32 -
trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseIdentifier.cpp
r194428 r195090 29 29 #if ENABLE(INDEXED_DATABASE) 30 30 31 #include "FileSystem.h" 32 #include "SecurityOrigin.h" 31 33 #include <wtf/Ref.h> 32 34 #include <wtf/RefCounted.h> … … 56 58 } 57 59 60 String IDBDatabaseIdentifier::databaseDirectoryRelativeToRoot(const String& rootDirectory) const 61 { 62 String mainFrameDirectory = pathByAppendingComponent(rootDirectory, m_mainFrameOrigin.securityOrigin()->databaseIdentifier()); 63 64 // If the opening origin and main frame origins are the same, there is no partitioning. 65 if (m_openingOrigin == m_mainFrameOrigin) 66 return mainFrameDirectory; 67 68 return pathByAppendingComponent(mainFrameDirectory, m_openingOrigin.securityOrigin()->databaseIdentifier()); 69 } 70 58 71 #ifndef NDEBUG 59 72 String IDBDatabaseIdentifier::debugString() const -
trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseIdentifier.h
r194687 r195090 93 93 const String& databaseName() const { return m_databaseName; } 94 94 95 String databaseDirectoryRelativeToRoot(const String& rootDirectory) const; 96 95 97 #ifndef NDEBUG 96 98 String debugString() const; -
trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp
r194904 r195090 33 33 #include "Logging.h" 34 34 #include "MemoryIDBBackingStore.h" 35 #include "SQLiteIDBBackingStore.h" 35 36 #include <wtf/Locker.h> 36 37 #include <wtf/MainThread.h> … … 44 45 } 45 46 47 Ref<IDBServer> IDBServer::create(const String& databaseDirectoryPath) 48 { 49 return adoptRef(*new IDBServer(databaseDirectoryPath)); 50 } 51 46 52 IDBServer::IDBServer() 47 53 { 54 Locker<Lock> locker(m_databaseThreadCreationLock); 55 m_threadID = createThread(IDBServer::databaseThreadEntry, this, "IndexedDatabase Server"); 56 } 57 58 IDBServer::IDBServer(const String& databaseDirectoryPath) 59 : m_databaseDirectoryPath(databaseDirectoryPath) 60 { 61 LOG(IndexedDB, "IDBServer created at path %s", databaseDirectoryPath.utf8().data()); 62 48 63 Locker<Lock> locker(m_databaseThreadCreationLock); 49 64 m_threadID = createThread(IDBServer::databaseThreadEntry, this, "IndexedDatabase Server"); … … 103 118 ASSERT(!isMainThread()); 104 119 105 // FIXME: For now we only have the in-memory backing store, which we'll continue to use for private browsing. 106 // Once it's time for persistent backing stores this is where we'll calculate the correct path on disk 107 // and create it. 120 // FIXME: Once the SQLite backing store is functional, conditionally make either a Memory or SQLite backing store. 108 121 109 122 return MemoryIDBBackingStore::create(identifier); -
trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.h
r194904 r195090 52 52 public: 53 53 static Ref<IDBServer> create(); 54 static Ref<IDBServer> create(const String& databaseDirectoryPath); 54 55 55 56 void registerConnection(IDBConnectionToClient&); … … 93 94 private: 94 95 IDBServer(); 96 IDBServer(const String& databaseDirectoryPath); 95 97 96 98 UniqueIDBDatabase& getOrCreateUniqueIDBDatabase(const IDBDatabaseIdentifier&); … … 113 115 HashMap<uint64_t, UniqueIDBDatabaseConnection*> m_databaseConnections; 114 116 HashMap<IDBResourceIdentifier, UniqueIDBDatabaseTransaction*> m_transactions; 117 118 String m_databaseDirectoryPath; 115 119 }; 116 120 -
trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.cpp
r194905 r195090 29 29 #if ENABLE(INDEXED_DATABASE) 30 30 31 #include "FileSystem.h" 31 32 #include "IDBDatabaseException.h" 32 #include "NotImplemented.h" 33 #include "IDBKeyData.h" 34 #include "Logging.h" 35 #include "SQLiteDatabase.h" 36 #include "SQLiteFileSystem.h" 37 #include <wtf/NeverDestroyed.h> 33 38 34 39 namespace WebCore { 35 40 namespace IDBServer { 36 41 37 SQLiteIDBBackingStore::SQLiteIDBBackingStore(const IDBDatabaseIdentifier& identifier )42 SQLiteIDBBackingStore::SQLiteIDBBackingStore(const IDBDatabaseIdentifier& identifier, const String& databaseRootDirectory) 38 43 : m_identifier(identifier) 39 44 { 45 m_absoluteDatabaseDirectory = identifier.databaseDirectoryRelativeToRoot(databaseRootDirectory); 40 46 } 41 47 42 48 SQLiteIDBBackingStore::~SQLiteIDBBackingStore() 43 49 { 50 if (m_sqliteDB) 51 m_sqliteDB->close(); 44 52 } 45 53 46 54 const IDBDatabaseInfo& SQLiteIDBBackingStore::getOrEstablishDatabaseInfo() 47 55 { 48 if (!m_databaseInfo) 49 m_databaseInfo = std::make_unique<IDBDatabaseInfo>(m_identifier.databaseName(), 0); 56 LOG(IndexedDB, "SQLiteIDBBackingStore::getOrEstablishDatabaseInfo - database %s", m_identifier.databaseName().utf8().data()); 57 58 if (m_databaseInfo) 59 return *m_databaseInfo; 60 61 m_databaseInfo = std::make_unique<IDBDatabaseInfo>(m_identifier.databaseName(), 0); 62 63 makeAllDirectories(m_absoluteDatabaseDirectory); 64 65 String dbFilename = pathByAppendingComponent(m_absoluteDatabaseDirectory, "IndexedDB.sqlite3"); 66 67 m_sqliteDB = std::make_unique<SQLiteDatabase>(); 68 if (!m_sqliteDB->open(dbFilename)) { 69 LOG_ERROR("Failed to open SQLite database at path '%s'", dbFilename.utf8().data()); 70 m_sqliteDB = nullptr; 71 } 72 73 if (!m_sqliteDB) 74 return *m_databaseInfo; 75 76 // FIXME: Support populating new SQLite files and pulling DatabaseInfo from existing SQLite files. 77 // Doing so will make a new m_databaseInfo which overrides the default one we created up above. 50 78 51 79 return *m_databaseInfo; … … 149 177 void SQLiteIDBBackingStore::deleteBackingStore() 150 178 { 151 notImplemented(); 179 String dbFilename = pathByAppendingComponent(m_absoluteDatabaseDirectory, "IndexedDB.sqlite3"); 180 181 LOG(IndexedDB, "SQLiteIDBBackingStore::deleteBackingStore deleting file '%s' on disk", dbFilename.utf8().data()); 182 183 if (m_sqliteDB) { 184 m_sqliteDB->close(); 185 m_sqliteDB = nullptr; 186 } 187 188 SQLiteFileSystem::deleteDatabaseFile(dbFilename); 189 SQLiteFileSystem::deleteEmptyDatabaseDirectory(m_absoluteDatabaseDirectory); 152 190 } 153 191 -
trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.h
r194905 r195090 34 34 35 35 namespace WebCore { 36 37 class SQLiteDatabase; 38 36 39 namespace IDBServer { 37 40 38 41 class SQLiteIDBBackingStore : public IDBBackingStore { 39 42 public: 40 SQLiteIDBBackingStore(const IDBDatabaseIdentifier& );43 SQLiteIDBBackingStore(const IDBDatabaseIdentifier&, const String& databaseRootDirectory); 41 44 42 45 virtual ~SQLiteIDBBackingStore() override final; … … 69 72 IDBDatabaseIdentifier m_identifier; 70 73 std::unique_ptr<IDBDatabaseInfo> m_databaseInfo; 74 75 std::unique_ptr<SQLiteDatabase> m_sqliteDB; 76 77 String m_absoluteDatabaseDirectory; 71 78 }; 72 79 -
trunk/Source/WebCore/Modules/indexeddb/shared/InProcessIDBServer.cpp
r194904 r195090 48 48 } 49 49 50 Ref<InProcessIDBServer> InProcessIDBServer::create(const String& databaseDirectoryPath) 51 { 52 Ref<InProcessIDBServer> server = adoptRef(*new InProcessIDBServer(databaseDirectoryPath)); 53 server->m_server->registerConnection(server->connectionToClient()); 54 return server; 55 } 56 50 57 InProcessIDBServer::InProcessIDBServer() 51 58 : m_server(IDBServer::IDBServer::create()) … … 56 63 } 57 64 65 InProcessIDBServer::InProcessIDBServer(const String& databaseDirectoryPath) 66 : m_server(IDBServer::IDBServer::create(databaseDirectoryPath)) 67 { 68 relaxAdoptionRequirement(); 69 m_connectionToServer = IDBClient::IDBConnectionToServer::create(*this); 70 m_connectionToClient = IDBServer::IDBConnectionToClient::create(*this); 71 } 72 58 73 uint64_t InProcessIDBServer::identifier() const 59 74 { -
trunk/Source/WebCore/Modules/indexeddb/shared/InProcessIDBServer.h
r194904 r195090 50 50 public: 51 51 WEBCORE_EXPORT static Ref<InProcessIDBServer> create(); 52 WEBCORE_EXPORT static Ref<InProcessIDBServer> create(const String& databaseDirectoryPath); 52 53 53 54 WEBCORE_EXPORT IDBClient::IDBConnectionToServer& connectionToServer() const; … … 102 103 private: 103 104 InProcessIDBServer(); 105 InProcessIDBServer(const String& databaseDirectoryPath); 104 106 105 107 Ref<IDBServer::IDBServer> m_server; -
trunk/Source/WebKit/ChangeLog
r194987 r195090 1 2016-01-14 Brady Eidson <beidson@apple.com> 2 3 Modern IDB: Support opening and deleting SQLite databases on disk. 4 https://bugs.webkit.org/show_bug.cgi?id=153084 5 6 Reviewed by Alex Christensen, Sam Weinig and Andy Estes (oh my!). 7 8 * Storage/WebDatabaseProvider.cpp: 9 (WebDatabaseProvider::idbConnectionToServerForSession): 10 * Storage/WebDatabaseProvider.h: 11 12 * WebKit.xcodeproj/project.pbxproj: 13 1 14 2016-01-13 Chris Dumez <cdumez@apple.com> 2 15 -
trunk/Source/WebKit/Storage/WebDatabaseProvider.cpp
r190291 r195090 54 54 { 55 55 auto result = m_idbServerMap.add(sessionID.sessionID(), nullptr); 56 if (result.isNewEntry) 57 result.iterator->value = WebCore::InProcessIDBServer::create(); 56 if (result.isNewEntry) { 57 if (sessionID.isEphemeral()) 58 result.iterator->value = WebCore::InProcessIDBServer::create(); 59 else 60 result.iterator->value = WebCore::InProcessIDBServer::create(indexedDatabaseDirectoryPath()); 61 } 58 62 59 63 return result.iterator->value->connectionToServer(); -
trunk/Source/WebKit/Storage/WebDatabaseProvider.h
r191264 r195090 50 50 explicit WebDatabaseProvider(); 51 51 52 static String indexedDatabaseDirectoryPath(); 53 52 54 #if ENABLE(INDEXED_DATABASE) 53 55 virtual RefPtr<WebCore::IDBFactoryBackendInterface> createIDBFactoryBackend() override; -
trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj
r192995 r195090 128 128 511F3FD70CECC88F00852565 /* WebDatabaseManagerClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 511F3FD30CECC88F00852565 /* WebDatabaseManagerClient.h */; }; 129 129 511F3FD80CECC88F00852565 /* WebDatabaseManagerClient.mm in Sources */ = {isa = PBXBuildFile; fileRef = 511F3FD40CECC88F00852565 /* WebDatabaseManagerClient.mm */; }; 130 512BDB531C471591006494DF /* WebDatabaseProvider.mm in Sources */ = {isa = PBXBuildFile; fileRef = 512BDB521C471591006494DF /* WebDatabaseProvider.mm */; }; 130 131 51494CD60C7EBDE0004178C5 /* WebIconDatabaseClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 51494CD40C7EBDE0004178C5 /* WebIconDatabaseClient.h */; }; 131 132 51494CD70C7EBDE0004178C5 /* WebIconDatabaseClient.mm in Sources */ = {isa = PBXBuildFile; fileRef = 51494CD50C7EBDE0004178C5 /* WebIconDatabaseClient.mm */; }; … … 607 608 511F3FD30CECC88F00852565 /* WebDatabaseManagerClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebDatabaseManagerClient.h; sourceTree = "<group>"; }; 608 609 511F3FD40CECC88F00852565 /* WebDatabaseManagerClient.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebDatabaseManagerClient.mm; sourceTree = "<group>"; }; 610 512BDB521C471591006494DF /* WebDatabaseProvider.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebDatabaseProvider.mm; sourceTree = "<group>"; }; 609 611 513D422E034CF55A00CA2ACD /* WebResourceLoadDelegate.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = WebResourceLoadDelegate.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; }; 610 612 51443F9A0429392B00CA2D3A /* WebPolicyDelegate.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = WebPolicyDelegate.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; }; … … 1224 1226 1AA83F811A5C4AE400026EC6 /* WebDatabaseProvider.cpp */, 1225 1227 1AA83F821A5C4AE400026EC6 /* WebDatabaseProvider.h */, 1228 512BDB521C471591006494DF /* WebDatabaseProvider.mm */, 1226 1229 A5DEFC0D11D5343E00885273 /* WebDatabaseQuotaManager.h */, 1227 1230 A5DEFC0E11D5343E00885273 /* WebDatabaseQuotaManager.mm */, … … 2296 2299 934C4A910F01406C009372C0 /* WebNSObjectExtras.mm in Sources */, 2297 2300 939810C80824BF01008DF038 /* WebNSPasteboardExtras.mm in Sources */, 2301 512BDB531C471591006494DF /* WebDatabaseProvider.mm in Sources */, 2298 2302 939811190824BF01008DF038 /* WebNSPrintOperationExtras.m in Sources */, 2299 2303 A10C1D3B18202FC50036883A /* WebNSStringExtrasIOS.m in Sources */, -
trunk/Source/WebKit/mac/ChangeLog
r195081 r195090 1 2016-01-14 Brady Eidson <beidson@apple.com> 2 3 Modern IDB: Support opening and deleting SQLite databases on disk. 4 https://bugs.webkit.org/show_bug.cgi?id=153084 5 6 Reviewed by Alex Christensen, Sam Weinig and Andy Estes (oh my!). 7 8 * Storage/WebDatabaseProvider.mm: Copied from Source/WebKit/Storage/WebDatabaseProvider.cpp. 9 (WebDatabaseProvider::indexedDatabaseDirectoryPath): 10 1 11 2016-01-14 Beth Dakin <bdakin@apple.com> 2 12 -
trunk/Source/WebKit/mac/Storage/WebDatabaseProvider.mm
r195089 r195090 1 1 /* 2 * Copyright (C) 201 5Apple Inc. All rights reserved.2 * Copyright (C) 2016 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 24 24 */ 25 25 26 #include "WebDatabaseProvider.h" 26 #import "WebDatabaseProvider.h" 27 #import "WebDatabaseManagerPrivate.h" 27 28 28 #include <WebCore/IDBFactoryBackendInterface.h> 29 #include <WebCore/SessionID.h> 30 #include <wtf/NeverDestroyed.h> 29 #import <WebCore/FileSystem.h> 31 30 32 WebDatabaseProvider& WebDatabaseProvider::singleton()31 String WebDatabaseProvider::indexedDatabaseDirectoryPath() 33 32 { 34 static WebDatabaseProvider& databaseProvider = adoptRef(*new WebDatabaseProvider).leakRef(); 35 36 return databaseProvider; 33 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 34 NSString *databasesDirectory = [defaults objectForKey:WebDatabaseDirectoryDefaultsKey]; 35 if (!databasesDirectory || ![databasesDirectory isKindOfClass:[NSString class]]) 36 databasesDirectory = WebCore::pathByAppendingComponent(ASCIILiteral("~/Library/WebKit/Databases/___IndexedDB"), [[NSBundle mainBundle] bundleIdentifier]); 37 else 38 databasesDirectory = WebCore::pathByAppendingComponent(databasesDirectory, ASCIILiteral("___IndexedDB")); 39 40 return [databasesDirectory stringByStandardizingPath]; 37 41 } 38 39 WebDatabaseProvider::WebDatabaseProvider()40 {41 }42 43 WebDatabaseProvider::~WebDatabaseProvider()44 {45 }46 47 #if ENABLE(INDEXED_DATABASE)48 RefPtr<WebCore::IDBFactoryBackendInterface> WebDatabaseProvider::createIDBFactoryBackend()49 {50 return nullptr;51 }52 53 WebCore::IDBClient::IDBConnectionToServer& WebDatabaseProvider::idbConnectionToServerForSession(const WebCore::SessionID& sessionID)54 {55 auto result = m_idbServerMap.add(sessionID.sessionID(), nullptr);56 if (result.isNewEntry)57 result.iterator->value = WebCore::InProcessIDBServer::create();58 59 return result.iterator->value->connectionToServer();60 }61 #endif
Note: See TracChangeset
for help on using the changeset viewer.