Changeset 195090 in webkit


Ignore:
Timestamp:
Jan 14, 2016 9:40:39 PM (8 years ago)
Author:
beidson@apple.com
Message:

Modern IDB: Support opening and deleting SQLite databases on disk.
https://bugs.webkit.org/show_bug.cgi?id=153084

Reviewed by Alex Christensen, Sam Weinig and Andy Estes (oh my!).

Source/WebCore:

No new tests (Infrastructure, no testable change in behavior).

  • Modules/indexeddb/IDBDatabaseIdentifier.cpp:

(WebCore::IDBDatabaseIdentifier::databaseDirectoryRelativeToRoot):

  • Modules/indexeddb/IDBDatabaseIdentifier.h:
  • Modules/indexeddb/server/IDBServer.cpp:

(WebCore::IDBServer::IDBServer::create):
(WebCore::IDBServer::IDBServer::IDBServer):
(WebCore::IDBServer::IDBServer::createBackingStore):

  • Modules/indexeddb/server/IDBServer.h:
  • Modules/indexeddb/server/SQLiteIDBBackingStore.cpp:

(WebCore::IDBServer::SQLiteIDBBackingStore::SQLiteIDBBackingStore):
(WebCore::IDBServer::SQLiteIDBBackingStore::getOrEstablishDatabaseInfo):
(WebCore::IDBServer::SQLiteIDBBackingStore::deleteBackingStore):

  • Modules/indexeddb/server/SQLiteIDBBackingStore.h:
  • Modules/indexeddb/shared/InProcessIDBServer.cpp:

(WebCore::InProcessIDBServer::create):
(WebCore::InProcessIDBServer::InProcessIDBServer):

  • Modules/indexeddb/shared/InProcessIDBServer.h:

Source/WebKit:

  • Storage/WebDatabaseProvider.cpp:

(WebDatabaseProvider::idbConnectionToServerForSession):

  • Storage/WebDatabaseProvider.h:
  • WebKit.xcodeproj/project.pbxproj:

Source/WebKit/mac:

  • Storage/WebDatabaseProvider.mm: Copied from Source/WebKit/Storage/WebDatabaseProvider.cpp.

(WebDatabaseProvider::indexedDatabaseDirectoryPath):

Location:
trunk/Source
Files:
14 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r195088 r195090  
     12016-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
    1312016-01-14  Myles C. Maxfield  <mmaxfield@apple.com>
    232
  • trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseIdentifier.cpp

    r194428 r195090  
    2929#if ENABLE(INDEXED_DATABASE)
    3030
     31#include "FileSystem.h"
     32#include "SecurityOrigin.h"
    3133#include <wtf/Ref.h>
    3234#include <wtf/RefCounted.h>
     
    5658}
    5759
     60String 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
    5871#ifndef NDEBUG
    5972String IDBDatabaseIdentifier::debugString() const
  • trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseIdentifier.h

    r194687 r195090  
    9393    const String& databaseName() const { return m_databaseName; }
    9494
     95    String databaseDirectoryRelativeToRoot(const String& rootDirectory) const;
     96
    9597#ifndef NDEBUG
    9698    String debugString() const;
  • trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp

    r194904 r195090  
    3333#include "Logging.h"
    3434#include "MemoryIDBBackingStore.h"
     35#include "SQLiteIDBBackingStore.h"
    3536#include <wtf/Locker.h>
    3637#include <wtf/MainThread.h>
     
    4445}
    4546
     47Ref<IDBServer> IDBServer::create(const String& databaseDirectoryPath)
     48{
     49    return adoptRef(*new IDBServer(databaseDirectoryPath));
     50}
     51
    4652IDBServer::IDBServer()
    4753{
     54    Locker<Lock> locker(m_databaseThreadCreationLock);
     55    m_threadID = createThread(IDBServer::databaseThreadEntry, this, "IndexedDatabase Server");
     56}
     57
     58IDBServer::IDBServer(const String& databaseDirectoryPath)
     59    : m_databaseDirectoryPath(databaseDirectoryPath)
     60{
     61    LOG(IndexedDB, "IDBServer created at path %s", databaseDirectoryPath.utf8().data());
     62
    4863    Locker<Lock> locker(m_databaseThreadCreationLock);
    4964    m_threadID = createThread(IDBServer::databaseThreadEntry, this, "IndexedDatabase Server");
     
    103118    ASSERT(!isMainThread());
    104119
    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.
    108121
    109122    return MemoryIDBBackingStore::create(identifier);
  • trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.h

    r194904 r195090  
    5252public:
    5353    static Ref<IDBServer> create();
     54    static Ref<IDBServer> create(const String& databaseDirectoryPath);
    5455
    5556    void registerConnection(IDBConnectionToClient&);
     
    9394private:
    9495    IDBServer();
     96    IDBServer(const String& databaseDirectoryPath);
    9597
    9698    UniqueIDBDatabase& getOrCreateUniqueIDBDatabase(const IDBDatabaseIdentifier&);
     
    113115    HashMap<uint64_t, UniqueIDBDatabaseConnection*> m_databaseConnections;
    114116    HashMap<IDBResourceIdentifier, UniqueIDBDatabaseTransaction*> m_transactions;
     117
     118    String m_databaseDirectoryPath;
    115119};
    116120
  • trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.cpp

    r194905 r195090  
    2929#if ENABLE(INDEXED_DATABASE)
    3030
     31#include "FileSystem.h"
    3132#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>
    3338
    3439namespace WebCore {
    3540namespace IDBServer {
    3641
    37 SQLiteIDBBackingStore::SQLiteIDBBackingStore(const IDBDatabaseIdentifier& identifier)
     42SQLiteIDBBackingStore::SQLiteIDBBackingStore(const IDBDatabaseIdentifier& identifier, const String& databaseRootDirectory)
    3843    : m_identifier(identifier)
    3944{
     45    m_absoluteDatabaseDirectory = identifier.databaseDirectoryRelativeToRoot(databaseRootDirectory);
    4046}
    4147
    4248SQLiteIDBBackingStore::~SQLiteIDBBackingStore()
    4349{
     50    if (m_sqliteDB)
     51        m_sqliteDB->close();
    4452}
    4553
    4654const IDBDatabaseInfo& SQLiteIDBBackingStore::getOrEstablishDatabaseInfo()
    4755{
    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.
    5078
    5179    return *m_databaseInfo;
     
    149177void SQLiteIDBBackingStore::deleteBackingStore()
    150178{
    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);
    152190}
    153191
  • trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.h

    r194905 r195090  
    3434
    3535namespace WebCore {
     36
     37class SQLiteDatabase;
     38
    3639namespace IDBServer {
    3740
    3841class SQLiteIDBBackingStore : public IDBBackingStore {
    3942public:
    40     SQLiteIDBBackingStore(const IDBDatabaseIdentifier&);
     43    SQLiteIDBBackingStore(const IDBDatabaseIdentifier&, const String& databaseRootDirectory);
    4144   
    4245    virtual ~SQLiteIDBBackingStore() override final;
     
    6972    IDBDatabaseIdentifier m_identifier;
    7073    std::unique_ptr<IDBDatabaseInfo> m_databaseInfo;
     74
     75    std::unique_ptr<SQLiteDatabase> m_sqliteDB;
     76
     77    String m_absoluteDatabaseDirectory;
    7178};
    7279
  • trunk/Source/WebCore/Modules/indexeddb/shared/InProcessIDBServer.cpp

    r194904 r195090  
    4848}
    4949
     50Ref<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
    5057InProcessIDBServer::InProcessIDBServer()
    5158    : m_server(IDBServer::IDBServer::create())
     
    5663}
    5764
     65InProcessIDBServer::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
    5873uint64_t InProcessIDBServer::identifier() const
    5974{
  • trunk/Source/WebCore/Modules/indexeddb/shared/InProcessIDBServer.h

    r194904 r195090  
    5050public:
    5151    WEBCORE_EXPORT static Ref<InProcessIDBServer> create();
     52    WEBCORE_EXPORT static Ref<InProcessIDBServer> create(const String& databaseDirectoryPath);
    5253
    5354    WEBCORE_EXPORT IDBClient::IDBConnectionToServer& connectionToServer() const;
     
    102103private:
    103104    InProcessIDBServer();
     105    InProcessIDBServer(const String& databaseDirectoryPath);
    104106
    105107    Ref<IDBServer::IDBServer> m_server;
  • trunk/Source/WebKit/ChangeLog

    r194987 r195090  
     12016-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
    1142016-01-13  Chris Dumez  <cdumez@apple.com>
    215
  • trunk/Source/WebKit/Storage/WebDatabaseProvider.cpp

    r190291 r195090  
    5454{
    5555    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    }
    5862
    5963    return result.iterator->value->connectionToServer();
  • trunk/Source/WebKit/Storage/WebDatabaseProvider.h

    r191264 r195090  
    5050    explicit WebDatabaseProvider();
    5151
     52    static String indexedDatabaseDirectoryPath();
     53
    5254#if ENABLE(INDEXED_DATABASE)
    5355    virtual RefPtr<WebCore::IDBFactoryBackendInterface> createIDBFactoryBackend() override;
  • trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj

    r192995 r195090  
    128128                511F3FD70CECC88F00852565 /* WebDatabaseManagerClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 511F3FD30CECC88F00852565 /* WebDatabaseManagerClient.h */; };
    129129                511F3FD80CECC88F00852565 /* WebDatabaseManagerClient.mm in Sources */ = {isa = PBXBuildFile; fileRef = 511F3FD40CECC88F00852565 /* WebDatabaseManagerClient.mm */; };
     130                512BDB531C471591006494DF /* WebDatabaseProvider.mm in Sources */ = {isa = PBXBuildFile; fileRef = 512BDB521C471591006494DF /* WebDatabaseProvider.mm */; };
    130131                51494CD60C7EBDE0004178C5 /* WebIconDatabaseClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 51494CD40C7EBDE0004178C5 /* WebIconDatabaseClient.h */; };
    131132                51494CD70C7EBDE0004178C5 /* WebIconDatabaseClient.mm in Sources */ = {isa = PBXBuildFile; fileRef = 51494CD50C7EBDE0004178C5 /* WebIconDatabaseClient.mm */; };
     
    607608                511F3FD30CECC88F00852565 /* WebDatabaseManagerClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebDatabaseManagerClient.h; sourceTree = "<group>"; };
    608609                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>"; };
    609611                513D422E034CF55A00CA2ACD /* WebResourceLoadDelegate.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = WebResourceLoadDelegate.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
    610612                51443F9A0429392B00CA2D3A /* WebPolicyDelegate.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = WebPolicyDelegate.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
     
    12241226                                1AA83F811A5C4AE400026EC6 /* WebDatabaseProvider.cpp */,
    12251227                                1AA83F821A5C4AE400026EC6 /* WebDatabaseProvider.h */,
     1228                                512BDB521C471591006494DF /* WebDatabaseProvider.mm */,
    12261229                                A5DEFC0D11D5343E00885273 /* WebDatabaseQuotaManager.h */,
    12271230                                A5DEFC0E11D5343E00885273 /* WebDatabaseQuotaManager.mm */,
     
    22962299                                934C4A910F01406C009372C0 /* WebNSObjectExtras.mm in Sources */,
    22972300                                939810C80824BF01008DF038 /* WebNSPasteboardExtras.mm in Sources */,
     2301                                512BDB531C471591006494DF /* WebDatabaseProvider.mm in Sources */,
    22982302                                939811190824BF01008DF038 /* WebNSPrintOperationExtras.m in Sources */,
    22992303                                A10C1D3B18202FC50036883A /* WebNSStringExtrasIOS.m in Sources */,
  • trunk/Source/WebKit/mac/ChangeLog

    r195081 r195090  
     12016-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
    1112016-01-14  Beth Dakin  <bdakin@apple.com>
    212
  • trunk/Source/WebKit/mac/Storage/WebDatabaseProvider.mm

    r195089 r195090  
    11/*
    2  * Copyright (C) 2015 Apple Inc. All rights reserved.
     2 * Copyright (C) 2016 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2424 */
    2525
    26 #include "WebDatabaseProvider.h"
     26#import "WebDatabaseProvider.h"
     27#import "WebDatabaseManagerPrivate.h"
    2728
    28 #include <WebCore/IDBFactoryBackendInterface.h>
    29 #include <WebCore/SessionID.h>
    30 #include <wtf/NeverDestroyed.h>
     29#import <WebCore/FileSystem.h>
    3130
    32 WebDatabaseProvider& WebDatabaseProvider::singleton()
     31String WebDatabaseProvider::indexedDatabaseDirectoryPath()
    3332{
    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];
    3741}
    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.