⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 181837 in webkit


Ignore:
Timestamp:
Mar 22, 2015, 3:50:23 PM (11 years ago)
Author:
andersca@apple.com
Message:

_WKWebsiteDataStore should clear WebSQL databases
https://bugs.webkit.org/show_bug.cgi?id=142947
Source/WebCore:

Reviewed by Sam Weinig.

  • Modules/webdatabase/DatabaseTracker.cpp:

(WebCore::DatabaseTracker::trackerWithDatabasePath):
Add a hack so we can get at a tracker from the UI process.

(WebCore::DatabaseTracker::deleteDatabasesModifiedSince):
New function that deletes all databases modified after a given time.

  • Modules/webdatabase/DatabaseTracker.h:

Add new members and export the ones we want to call from WebKit2.

  • Modules/webdatabase/OriginLock.h:

Export the destructor.

Source/WebKit2:

rdar://problem/20242174

Reviewed by Sam Weinig.

  • Shared/WebsiteData/WebsiteDataTypes.h:

Add WebsiteDataTypeWebSQLDatabases.

  • UIProcess/API/Cocoa/APIWebsiteDataStoreCocoa.mm:

(API::WebsiteDataStore::defaultDataStoreConfiguration):
Initialize configuration.webSQLDatabaseDirectory.

  • UIProcess/API/Cocoa/_WKWebsiteDataRecord.h:

Add WKWebsiteDataTypeWebSQLDatabases.

  • UIProcess/API/Cocoa/_WKWebsiteDataRecord.mm:

(dataTypesToString):
Handle WKWebsiteDataTypeWebSQLDatabases.

  • UIProcess/API/Cocoa/_WKWebsiteDataRecordInternal.h:

(WebKit::toWebsiteDataTypes):
(WebKit::toWKWebsiteDataTypes):
Handle WKWebsiteDataTypeWebSQLDatabases and WebsiteDataTypes::WebsiteDataTypeWebSQLDatabases.

  • UIProcess/WebsiteData/WebsiteDataStore.cpp:

(WebKit::WebsiteDataStore::WebsiteDataStore):
Initialize m_webSQLDatabaseDirectory and add a queue member variable.

(WebKit::WebsiteDataStore::fetchData):
Fetch database origins.

(WebKit::WebsiteDataStore::removeData):
Remove databases.

  • UIProcess/WebsiteData/WebsiteDataStore.h:

Add new members.

Tools:

Reviewed by Sam Weinig.

Add a variable that keeps track of the types of data we want to operate on, for easier debugging.

  • MiniBrowser/mac/WK2BrowserWindowController.m:

(-[WK2BrowserWindowController fetchWebsiteData:]):
(-[WK2BrowserWindowController fetchAndClearWebsiteData:]):
(-[WK2BrowserWindowController clearWebsiteData:]):

Location:
trunk
Files:
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r181832 r181837  
     12015-03-22  Anders Carlsson  <andersca@apple.com>
     2
     3        _WKWebsiteDataStore should clear WebSQL databases
     4        https://bugs.webkit.org/show_bug.cgi?id=142947
     5
     6        Reviewed by Sam Weinig.
     7
     8        * Modules/webdatabase/DatabaseTracker.cpp:
     9        (WebCore::DatabaseTracker::trackerWithDatabasePath):
     10        Add a hack so we can get at a tracker from the UI process.
     11
     12        (WebCore::DatabaseTracker::deleteDatabasesModifiedSince):
     13        New function that deletes all databases modified after a given time.
     14
     15        * Modules/webdatabase/DatabaseTracker.h:
     16        Add new members and export the ones we want to call from WebKit2.
     17
     18        * Modules/webdatabase/OriginLock.h:
     19        Export the destructor.
     20
    1212015-03-21  Dean Jackson  <dino@apple.com>
    222
  • trunk/Source/WebCore/Modules/webdatabase/DatabaseTracker.cpp

    r178575 r181837  
    5757namespace WebCore {
    5858
     59std::unique_ptr<DatabaseTracker> DatabaseTracker::trackerWithDatabasePath(const String& databasePath)
     60{
     61    return std::unique_ptr<DatabaseTracker>(new DatabaseTracker(databasePath));
     62}
     63
    5964static DatabaseTracker* staticTracker = 0;
    6065
     
    824829    for (unsigned i = 0; i < originsCopy.size(); ++i)
    825830        deleteOrigin(originsCopy[i].get());
     831}
     832
     833void DatabaseTracker::deleteDatabasesModifiedSince(std::chrono::system_clock::time_point time)
     834{
     835    Vector<RefPtr<SecurityOrigin>> originsCopy;
     836    origins(originsCopy);
     837
     838    for (auto& origin : originsCopy) {
     839        Vector<String> databaseNames;
     840        if (!databaseNamesForOrigin(origin.get(), databaseNames))
     841            continue;
     842
     843        for (auto& databaseName : databaseNames) {
     844            auto fullPath = fullPathForDatabase(origin.get(), databaseName, false);
     845
     846            time_t modificationTime;
     847            if (!getFileModificationTime(fullPath, modificationTime))
     848                continue;
     849
     850            if (modificationTime < std::chrono::system_clock::to_time_t(time))
     851                continue;
     852
     853            deleteDatabase(origin.get(), databaseName);
     854        }
     855    }
    826856}
    827857
  • trunk/Source/WebCore/Modules/webdatabase/DatabaseTracker.h

    r178575 r181837  
    5050    WTF_MAKE_NONCOPYABLE(DatabaseTracker); WTF_MAKE_FAST_ALLOCATED;
    5151public:
     52    // FIXME: This is a hack so we can easily delete databases from the UI process in WebKit2.
     53    WEBCORE_EXPORT static std::unique_ptr<DatabaseTracker> trackerWithDatabasePath(const String& databasePath);
     54
    5255    static void initializeTracker(const String& databasePath);
    5356
     
    8386    String databaseDirectoryPath() const;
    8487
    85     void origins(Vector<RefPtr<SecurityOrigin>>& result);
     88    WEBCORE_EXPORT void origins(Vector<RefPtr<SecurityOrigin>>& result);
    8689    bool databaseNamesForOrigin(SecurityOrigin*, Vector<String>& result);
    8790
     
    9497
    9598    void deleteAllDatabases();
    96     bool deleteOrigin(SecurityOrigin*);
     99    WEBCORE_EXPORT void deleteDatabasesModifiedSince(std::chrono::system_clock::time_point);
     100    WEBCORE_EXPORT bool deleteOrigin(SecurityOrigin*);
    97101    bool deleteDatabase(SecurityOrigin*, const String& name);
    98102
  • trunk/Source/WebCore/Modules/webdatabase/OriginLock.h

    r178575 r181837  
    3838public:
    3939    OriginLock(String originPath);
    40     ~OriginLock();
     40    WEBCORE_EXPORT ~OriginLock();
    4141
    4242    void lock();
  • trunk/Source/WebKit2/ChangeLog

    r181836 r181837  
     12015-03-22  Anders Carlsson  <andersca@apple.com>
     2
     3        _WKWebsiteDataStore should clear WebSQL databases
     4        https://bugs.webkit.org/show_bug.cgi?id=142947
     5        rdar://problem/20242174
     6
     7        Reviewed by Sam Weinig.
     8
     9        * Shared/WebsiteData/WebsiteDataTypes.h:
     10        Add WebsiteDataTypeWebSQLDatabases.
     11
     12        * UIProcess/API/Cocoa/APIWebsiteDataStoreCocoa.mm:
     13        (API::WebsiteDataStore::defaultDataStoreConfiguration):
     14        Initialize configuration.webSQLDatabaseDirectory.
     15
     16        * UIProcess/API/Cocoa/_WKWebsiteDataRecord.h:
     17        Add WKWebsiteDataTypeWebSQLDatabases.
     18
     19        * UIProcess/API/Cocoa/_WKWebsiteDataRecord.mm:
     20        (dataTypesToString):
     21        Handle WKWebsiteDataTypeWebSQLDatabases.
     22
     23        * UIProcess/API/Cocoa/_WKWebsiteDataRecordInternal.h:
     24        (WebKit::toWebsiteDataTypes):
     25        (WebKit::toWKWebsiteDataTypes):
     26        Handle WKWebsiteDataTypeWebSQLDatabases and WebsiteDataTypes::WebsiteDataTypeWebSQLDatabases.
     27
     28        * UIProcess/WebsiteData/WebsiteDataStore.cpp:
     29        (WebKit::WebsiteDataStore::WebsiteDataStore):
     30        Initialize m_webSQLDatabaseDirectory and add a queue member variable.
     31
     32        (WebKit::WebsiteDataStore::fetchData):
     33        Fetch database origins.
     34   
     35        (WebKit::WebsiteDataStore::removeData):
     36        Remove databases.
     37
     38        * UIProcess/WebsiteData/WebsiteDataStore.h:
     39        Add new members.
     40
    1412015-03-22  Dan Bernstein  <mitz@apple.com>
    242
  • trunk/Source/WebKit2/Shared/WebsiteData/WebsiteDataTypes.h

    r180265 r181837  
    3434    WebsiteDataTypeMemoryCache = 1 << 2,
    3535    WebsiteDataTypeLocalStorage = 1 << 3,
     36    WebsiteDataTypeWebSQLDatabases = 1 << 4,
    3637};
    3738
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/APIWebsiteDataStoreCocoa.mm

    r178685 r181837  
    6666
    6767    configuration.localStorageDirectory = websiteDataDirectoryFileSystemRepresentation("LocalStorage");
     68    configuration.webSQLDatabaseDirectory = websiteDataDirectoryFileSystemRepresentation("WebSQL");
    6869
    6970    return configuration;
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKWebsiteDataRecord.h

    r180585 r181837  
    3636
    3737    WKWebsiteDataTypeLocalStorage = 1 << 3,
     38    WKWebsiteDataTypeWebSQLDatabases = 1 << 4,
     39
    3840    WKWebsiteDataTypeAll = NSUIntegerMax,
    3941} WK_ENUM_AVAILABLE(WK_MAC_TBA, WK_IOS_TBA);
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKWebsiteDataRecord.mm

    r180585 r181837  
    5050    if (dataTypes & WKWebsiteDataTypeLocalStorage)
    5151        [array addObject:@"Local Storage"];
     52    if (dataTypes & WKWebsiteDataTypeWebSQLDatabases)
     53        [array addObject:@"Web SQL"];
    5254
    5355    return [array componentsJoinedByString:@", "];
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKWebsiteDataRecordInternal.h

    r180585 r181837  
    5353    if (wkWebsiteDataTypes & WKWebsiteDataTypeLocalStorage)
    5454        websiteDataTypes |= WebsiteDataTypes::WebsiteDataTypeLocalStorage;
     55    if (wkWebsiteDataTypes & WKWebsiteDataTypeWebSQLDatabases)
     56        websiteDataTypes |= WebsiteDataTypes::WebsiteDataTypeWebSQLDatabases;
    5557
    5658    return static_cast<WebsiteDataTypes>(websiteDataTypes);
     
    7173    if (websiteDataTypes & WebsiteDataTypes::WebsiteDataTypeLocalStorage)
    7274        wkWebsiteDataTypes |= WKWebsiteDataTypeLocalStorage;
     75    if (websiteDataTypes & WebsiteDataTypes::WebsiteDataTypeWebSQLDatabases)
     76        wkWebsiteDataTypes |= WKWebsiteDataTypeWebSQLDatabases;
    7377
    7478    return wkWebsiteDataTypes;
  • trunk/Source/WebKit2/UIProcess/WebsiteData/WebsiteDataStore.cpp

    r180892 r181837  
    3131#include "WebProcessPool.h"
    3232#include "WebsiteData.h"
     33#include <WebCore/DatabaseTracker.h>
     34#include <WebCore/OriginLock.h>
    3335#include <wtf/RunLoop.h>
    3436
     
    6365    : m_identifier(generateIdentifier())
    6466    , m_sessionID(WebCore::SessionID::defaultSessionID())
     67    , m_webSQLDatabaseDirectory(WTF::move(configuration.webSQLDatabaseDirectory))
    6568    , m_storageManager(StorageManager::create(WTF::move(configuration.localStorageDirectory)))
     69    , m_queue(WorkQueue::create("com.apple.WebKit.WebsiteDataStore"))
    6670{
    6771    platformInitialize();
     
    7175    : m_identifier(generateIdentifier())
    7276    , m_sessionID(sessionID)
     77    , m_queue(WorkQueue::create("com.apple.WebKit.WebsiteDataStore"))
    7378{
    7479    platformInitialize();
     
    271276    }
    272277
     278    if (dataTypes & WebsiteDataTypeWebSQLDatabases && !isNonPersistent()) {
     279        StringCapture webSQLDatabaseDirectory { m_webSQLDatabaseDirectory };
     280
     281        callbackAggregator->addPendingCallback();
     282
     283        m_queue->dispatch([webSQLDatabaseDirectory, callbackAggregator] {
     284            Vector<RefPtr<WebCore::SecurityOrigin>> origins;
     285            WebCore::DatabaseTracker::trackerWithDatabasePath(webSQLDatabaseDirectory.string())->origins(origins);
     286
     287            RunLoop::main().dispatch([webSQLDatabaseDirectory, callbackAggregator, origins]() mutable {
     288                WebsiteData websiteData;
     289                for (auto& origin : origins)
     290                    websiteData.entries.append(WebsiteData::Entry { WTF::move(origin), WebsiteDataTypeWebSQLDatabases });
     291
     292                callbackAggregator->removePendingCallback(WTF::move(websiteData));
     293            });
     294        });
     295    }
     296
    273297    callbackAggregator->callIfNeeded();
    274298}
     
    397421    }
    398422
     423    if (dataTypes & WebsiteDataTypeWebSQLDatabases && !isNonPersistent()) {
     424        StringCapture webSQLDatabaseDirectory { m_webSQLDatabaseDirectory };
     425
     426        callbackAggregator->addPendingCallback();
     427
     428        m_queue->dispatch([webSQLDatabaseDirectory, callbackAggregator, modifiedSince] {
     429            WebCore::DatabaseTracker::trackerWithDatabasePath(webSQLDatabaseDirectory.string())->deleteDatabasesModifiedSince(modifiedSince);
     430
     431            RunLoop::main().dispatch([callbackAggregator] {
     432                callbackAggregator->removePendingCallback();
     433            });
     434        });
     435    }
     436
    399437    // There's a chance that we don't have any pending callbacks. If so, we want to dispatch the completion handler right away.
    400438    callbackAggregator->callIfNeeded();
     
    410448    }
    411449
    412     struct CallbackAggregator : public RefCounted<CallbackAggregator> {
     450    struct CallbackAggregator : public ThreadSafeRefCounted<CallbackAggregator> {
    413451        explicit CallbackAggregator (std::function<void ()> completionHandler)
    414452            : completionHandler(WTF::move(completionHandler))
     
    509547    }
    510548
     549    if (dataTypes & WebsiteDataTypeWebSQLDatabases && !isNonPersistent()) {
     550        StringCapture webSQLDatabaseDirectory { m_webSQLDatabaseDirectory };
     551
     552        HashSet<RefPtr<WebCore::SecurityOrigin>> origins;
     553        for (const auto& dataRecord : dataRecords) {
     554            for (const auto& origin : dataRecord.origins)
     555                origins.add(origin);
     556        }
     557
     558        callbackAggregator->addPendingCallback();
     559        m_queue->dispatch([origins, callbackAggregator, webSQLDatabaseDirectory] {
     560            auto databaseTracker = WebCore::DatabaseTracker::trackerWithDatabasePath(webSQLDatabaseDirectory.string());
     561
     562            for (const auto& origin : origins)
     563                databaseTracker->deleteOrigin(origin.get());
     564
     565            RunLoop::main().dispatch([callbackAggregator] {
     566                callbackAggregator->removePendingCallback();
     567            });
     568        });
     569    }
     570
    511571    // There's a chance that we don't have any pending callbacks. If so, we want to dispatch the completion handler right away.
    512572    callbackAggregator->callIfNeeded();
  • trunk/Source/WebKit2/UIProcess/WebsiteData/WebsiteDataStore.h

    r180706 r181837  
    3434#include <wtf/RefCounted.h>
    3535#include <wtf/RefPtr.h>
     36#include <wtf/WorkQueue.h>
    3637#include <wtf/text/WTFString.h>
    3738
     
    4546public:
    4647    struct Configuration {
     48        String webSQLDatabaseDirectory;
    4749        String localStorageDirectory;
    4850    };
     
    8284    const WebCore::SessionID m_sessionID;
    8385
     86    const String m_webSQLDatabaseDirectory;
    8487    const RefPtr<StorageManager> m_storageManager;
     88
     89    Ref<WorkQueue> m_queue;
    8590};
    8691
  • trunk/Tools/ChangeLog

    r181821 r181837  
     12015-03-22  Anders Carlsson  <andersca@apple.com>
     2
     3        _WKWebsiteDataStore should clear WebSQL databases
     4        https://bugs.webkit.org/show_bug.cgi?id=142947
     5
     6        Reviewed by Sam Weinig.
     7
     8        Add a variable that keeps track of the types of data we want to operate on, for easier debugging.
     9
     10        * MiniBrowser/mac/WK2BrowserWindowController.m:
     11        (-[WK2BrowserWindowController fetchWebsiteData:]):
     12        (-[WK2BrowserWindowController fetchAndClearWebsiteData:]):
     13        (-[WK2BrowserWindowController clearWebsiteData:]):
     14
    1152015-03-20  Mark Hahnenberg  <mhahnenb@gmail.com>
    216
  • trunk/Tools/MiniBrowser/mac/WK2BrowserWindowController.m

    r180773 r181837  
    408408}
    409409
     410static const WKWebsiteDataTypes dataTypes = WKWebsiteDataTypeAll;
     411
    410412- (IBAction)fetchWebsiteData:(id)sender
    411413{
    412     [_configuration._websiteDataStore fetchDataRecordsOfTypes:WKWebsiteDataTypeAll completionHandler:^(NSArray *websiteDataRecords) {
     414    [_configuration._websiteDataStore fetchDataRecordsOfTypes:dataTypes completionHandler:^(NSArray *websiteDataRecords) {
    413415        NSLog(@"did fetch website data %@.", websiteDataRecords);
    414416    }];
     
    417419- (IBAction)fetchAndClearWebsiteData:(id)sender
    418420{
    419     [_configuration._websiteDataStore fetchDataRecordsOfTypes:WKWebsiteDataTypeAll completionHandler:^(NSArray *websiteDataRecords) {
    420         [_configuration._websiteDataStore removeDataOfTypes:WKWebsiteDataTypeAll forDataRecords:websiteDataRecords completionHandler:^{
    421             [_configuration._websiteDataStore fetchDataRecordsOfTypes:WKWebsiteDataTypeAll completionHandler:^(NSArray *websiteDataRecords) {
     421    [_configuration._websiteDataStore fetchDataRecordsOfTypes:dataTypes completionHandler:^(NSArray *websiteDataRecords) {
     422        [_configuration._websiteDataStore removeDataOfTypes:dataTypes forDataRecords:websiteDataRecords completionHandler:^{
     423            [_configuration._websiteDataStore fetchDataRecordsOfTypes:dataTypes completionHandler:^(NSArray *websiteDataRecords) {
    422424                NSLog(@"did clear website data, after clearing data is %@.", websiteDataRecords);
    423425            }];
     
    428430- (IBAction)clearWebsiteData:(id)sender
    429431{
    430     [_configuration._websiteDataStore removeDataOfTypes:WKWebsiteDataTypeAll modifiedSince:[NSDate distantPast] completionHandler:^{
     432    [_configuration._websiteDataStore removeDataOfTypes:dataTypes modifiedSince:[NSDate distantPast] completionHandler:^{
    431433        NSLog(@"Did clear website data.");
    432434    }];
Note: See TracChangeset for help on using the changeset viewer.