Changeset 55474 in webkit


Ignore:
Timestamp:
Mar 3, 2010 1:48:49 PM (14 years ago)
Author:
dumi@chromium.org
Message:

WebCore: Adding support for the optional creation callback that could be
passed to openDatabase().

Reviewed by Adam Barth.

Test: storage/open-database-creation-callback.html

https://bugs.webkit.org/show_bug.cgi?id=34726

  • Android.jscbindings.mk
  • Android.v8bindings.mk
  • GNUmakefile.am:
  • WebCore.gypi:
  • WebCore.pro:
  • WebCore.vcproj/WebCore.vcproj:
  • WebCore.xcodeproj/project.pbxproj:
  • bindings/js/JSDOMWindowCustom.cpp:

(WebCore::JSDOMWindow::openDatabase):

  • bindings/js/JSDatabaseCallback.cpp: Added.

(WebCore::JSDatabaseCallback::JSDatabaseCallback):
(WebCore::JSDatabaseCallback::~JSDatabaseCallback):
(WebCore::JSDatabaseCallback::handleEvent):

  • bindings/js/JSDatabaseCallback.h: Added.

(WebCore::JSDatabaseCallback::create):

  • bindings/v8/custom/V8DOMWindowCustom.cpp:

(WebCore::V8DOMWindow::openDatabaseCallback):

  • bindings/v8/custom/V8DatabaseCallback.cpp: Added.

(WebCore::V8DatabaseCallback::V8DatabaseCallback):
(WebCore::V8DatabaseCallback::~V8DatabaseCallback):
(WebCore::V8DatabaseCallback::handleEvent):

  • bindings/v8/custom/V8DatabaseCallback.h: Added.

(WebCore::V8DatabaseCallback::create):

  • page/DOMWindow.cpp:

(WebCore::DOMWindow::openDatabase):

  • page/DOMWindow.h:
  • page/DOMWindow.idl:
  • storage/Database.cpp:

(WebCore::DatabaseCreationCallbackTask::create):
(WebCore::DatabaseCreationCallbackTask::performTask):
(WebCore::DatabaseCreationCallbackTask::DatabaseCreationCallbackTask):
(WebCore::Database::openDatabase):
(WebCore::Database::Database):
(WebCore::Database::performOpenAndVerify):
(WebCore::Database::performCreationCallback):

  • storage/Database.h:

(WebCore::Database::isNew):

  • storage/DatabaseCallback.h: Added.

(WebCore::DatabaseCallback::~DatabaseCallback):

  • workers/WorkerContext.cpp:

(WebCore::WorkerContext::openDatabase):

  • workers/WorkerContext.h:

LayoutTests: Adding a test to test the creation callback passed to
openDatabase() and another one to make sure it is executed in the
correct world.

Reviewed by Adam Barth.

https://bugs.webkit.org/show_bug.cgi?id=34726

  • storage/open-database-creation-callback-expected.txt: Added.
  • storage/open-database-creation-callback.html: Added.
  • storage/open-database-creation-callback-isolated-world-expected.txt: Added.
  • storage/open-database-creation-callback-isolated-world.html: Added.
Location:
trunk
Files:
9 added
19 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r55471 r55474  
     12010-03-03  Dumitru Daniliuc  <dumi@chromium.org>
     2
     3        Reviewed by Adam Barth.
     4
     5        Adding a test to test the creation callback passed to
     6        openDatabase() and another one to make sure it is executed in the
     7        correct world.
     8
     9        https://bugs.webkit.org/show_bug.cgi?id=34726
     10
     11        * storage/open-database-creation-callback-expected.txt: Added.
     12        * storage/open-database-creation-callback.html: Added.
     13        * storage/open-database-creation-callback-isolated-world-expected.txt: Added.
     14        * storage/open-database-creation-callback-isolated-world.html: Added.
     15
    1162010-03-03  Alexey Proskuryakov  <ap@apple.com>
    217
  • trunk/WebCore/Android.jscbindings.mk

    r53915 r55474  
    8181        bindings/js/JSCustomSQLTransactionErrorCallback.cpp \
    8282        bindings/js/JSCustomVoidCallback.cpp \
     83        bindings/js/JSDatabaseCallback.cpp \
    8384        bindings/js/JSDesktopNotificationsCustom.cpp \
    8485        bindings/js/JSDOMApplicationCacheCustom.cpp \
  • trunk/WebCore/Android.v8bindings.mk

    r55096 r55474  
    109109        bindings/v8/custom/V8DOMWindowCustom.cpp \
    110110        bindings/v8/custom/V8DataGridColumnListCustom.cpp \
     111        bindings/v8/custom/V8DatabaseCallback.cpp \
    111112        bindings/v8/custom/V8DatabaseCustom.cpp \
    112113        bindings/v8/custom/V8DedicatedWorkerContextCustom.cpp \
  • trunk/WebCore/ChangeLog

    r55466 r55474  
     12010-03-03  Dumitru Daniliuc  <dumi@chromium.org>
     2
     3        Reviewed by Adam Barth.
     4
     5        Adding support for the optional creation callback that could be
     6        passed to openDatabase().
     7
     8        Test: storage/open-database-creation-callback.html
     9
     10        https://bugs.webkit.org/show_bug.cgi?id=34726
     11
     12        * Android.jscbindings.mk
     13        * Android.v8bindings.mk
     14        * GNUmakefile.am:
     15        * WebCore.gypi:
     16        * WebCore.pro:
     17        * WebCore.vcproj/WebCore.vcproj:
     18        * WebCore.xcodeproj/project.pbxproj:
     19        * bindings/js/JSDOMWindowCustom.cpp:
     20        (WebCore::JSDOMWindow::openDatabase):
     21        * bindings/js/JSDatabaseCallback.cpp: Added.
     22        (WebCore::JSDatabaseCallback::JSDatabaseCallback):
     23        (WebCore::JSDatabaseCallback::~JSDatabaseCallback):
     24        (WebCore::JSDatabaseCallback::handleEvent):
     25        * bindings/js/JSDatabaseCallback.h: Added.
     26        (WebCore::JSDatabaseCallback::create):
     27        * bindings/v8/custom/V8DOMWindowCustom.cpp:
     28        (WebCore::V8DOMWindow::openDatabaseCallback):
     29        * bindings/v8/custom/V8DatabaseCallback.cpp: Added.
     30        (WebCore::V8DatabaseCallback::V8DatabaseCallback):
     31        (WebCore::V8DatabaseCallback::~V8DatabaseCallback):
     32        (WebCore::V8DatabaseCallback::handleEvent):
     33        * bindings/v8/custom/V8DatabaseCallback.h: Added.
     34        (WebCore::V8DatabaseCallback::create):
     35        * page/DOMWindow.cpp:
     36        (WebCore::DOMWindow::openDatabase):
     37        * page/DOMWindow.h:
     38        * page/DOMWindow.idl:
     39        * storage/Database.cpp:
     40        (WebCore::DatabaseCreationCallbackTask::create):
     41        (WebCore::DatabaseCreationCallbackTask::performTask):
     42        (WebCore::DatabaseCreationCallbackTask::DatabaseCreationCallbackTask):
     43        (WebCore::Database::openDatabase):
     44        (WebCore::Database::Database):
     45        (WebCore::Database::performOpenAndVerify):
     46        (WebCore::Database::performCreationCallback):
     47        * storage/Database.h:
     48        (WebCore::Database::isNew):
     49        * storage/DatabaseCallback.h: Added.
     50        (WebCore::DatabaseCallback::~DatabaseCallback):
     51        * workers/WorkerContext.cpp:
     52        (WebCore::WorkerContext::openDatabase):
     53        * workers/WorkerContext.h:
     54
    1552010-03-03  Alexander Pavlov  <apavlov@chromium.org>
    256
  • trunk/WebCore/GNUmakefile.am

    r55457 r55474  
    22292229        WebCore/bindings/js/JSCustomSQLTransactionErrorCallback.cpp \
    22302230        WebCore/bindings/js/JSCustomSQLTransactionErrorCallback.h \
     2231        WebCore/bindings/js/JSDatabaseCallback.cpp \
     2232        WebCore/bindings/js/JSDatabaseCallback.h \
    22312233        WebCore/bindings/js/JSDatabaseCustom.cpp \
    22322234        WebCore/bindings/js/JSSQLResultSetRowListCustom.cpp \
     
    22492251        WebCore/storage/DatabaseAuthorizer.cpp \
    22502252        WebCore/storage/DatabaseAuthorizer.h \
     2253        WebCore/storage/DatabaseCallback.h \
    22512254        WebCore/storage/DatabaseDetails.h \
    22522255        WebCore/storage/DatabaseTask.cpp \
  • trunk/WebCore/WebCore.gypi

    r55424 r55474  
    704704            'bindings/v8/custom/V8CustomXPathNSResolver.cpp',
    705705            'bindings/v8/custom/V8CustomXPathNSResolver.h',
     706            'bindings/v8/custom/V8DatabaseCallback.cpp',
     707            'bindings/v8/custom/V8DatabaseCallback.h',
    706708            'bindings/v8/custom/V8DatabaseCustom.cpp',
    707709            'bindings/v8/custom/V8DataGridColumnListCustom.cpp',
     
    32193221            'storage/DatabaseAuthorizer.cpp',
    32203222            'storage/DatabaseAuthorizer.h',
     3223            'storage/DatabaseCallback.h',
    32213224            'storage/DatabaseDetails.h',
    32223225            'storage/DatabaseTask.cpp',
  • trunk/WebCore/WebCore.pro

    r55455 r55474  
    10131013    bindings/js/JSCustomVoidCallback.h \
    10141014    bindings/js/JSCustomXPathNSResolver.h \
     1015    bindings/js/JSDatabaseCallback.h \
    10151016    bindings/js/JSDataGridDataSource.h \
    10161017    bindings/js/JSDOMBinding.h \
     
    22212222        bindings/js/JSCustomSQLTransactionCallback.cpp \
    22222223        bindings/js/JSCustomSQLTransactionErrorCallback.cpp \
     2224        bindings/js/JSDatabaseCallback.cpp \
    22232225        bindings/js/JSDatabaseCustom.cpp \
    22242226        bindings/js/JSSQLResultSetRowListCustom.cpp \
     
    22312233        storage/DatabaseAuthorizer.h \
    22322234        storage/Database.h \
     2235        storage/DatabaseCallback.h \
    22332236        storage/DatabaseTask.h \
    22342237        storage/DatabaseThread.h \
  • trunk/WebCore/WebCore.vcproj/WebCore.vcproj

    r55387 r55474  
    3534135341                                </File>
    3534235342                                <File
     35343                                        RelativePath="..\bindings\js\JSDatabaseCallback.cpp"
     35344                                        >
     35345                                </File>
     35346                                <File
     35347                                        RelativePath="..\bindings\js\JSDatabaseCallback.h"
     35348                                        >
     35349                                </File>
     35350                                <File
    3534335351                                        RelativePath="..\bindings\js\JSDatabaseCustom.cpp"
    3534435352                                        >
     
    4227842286                        </File>
    4227942287                        <File
     42288                                RelativePath="..\storage\DatabaseCallback.h"
     42289                                >
     42290                        </File>
     42291                        <File
    4228042292                                RelativePath="..\storage\DatabaseTask.cpp"
    4228142293                                >
  • trunk/WebCore/WebCore.xcodeproj/project.pbxproj

    r55455 r55474  
    41154115                B5C1123B102B6C4600096578 /* SQLTransactionCoordinator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5C11239102B6C4600096578 /* SQLTransactionCoordinator.cpp */; };
    41164116                B5C1123C102B6C4600096578 /* SQLTransactionCoordinator.h in Headers */ = {isa = PBXBuildFile; fileRef = B5C1123A102B6C4600096578 /* SQLTransactionCoordinator.h */; };
     4117                B5D3601A112F8B560048DEA8 /* DatabaseCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = B5D36019112F8B560048DEA8 /* DatabaseCallback.h */; };
     4118                B5D3601D112F8BA00048DEA8 /* JSDatabaseCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = B5D3601C112F8BA00048DEA8 /* JSDatabaseCallback.h */; };
     4119                B5D3601F112F8BA80048DEA8 /* JSDatabaseCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5D3601E112F8BA80048DEA8 /* JSDatabaseCallback.cpp */; };
    41174120                B71FE6DF11091CB300DAEF77 /* PrintContext.h in Headers */ = {isa = PBXBuildFile; fileRef = B776D43A1104525D00BEB0EC /* PrintContext.h */; settings = {ATTRIBUTES = (Private, ); }; };
    41184121                B776D43D1104527500BEB0EC /* PrintContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B776D43C1104527500BEB0EC /* PrintContext.cpp */; };
     
    93749377                B5C11239102B6C4600096578 /* SQLTransactionCoordinator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SQLTransactionCoordinator.cpp; sourceTree = "<group>"; };
    93759378                B5C1123A102B6C4600096578 /* SQLTransactionCoordinator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SQLTransactionCoordinator.h; sourceTree = "<group>"; };
     9379                B5D36019112F8B560048DEA8 /* DatabaseCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DatabaseCallback.h; sourceTree = "<group>"; };
     9380                B5D3601C112F8BA00048DEA8 /* JSDatabaseCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSDatabaseCallback.h; sourceTree = "<group>"; };
     9381                B5D3601E112F8BA80048DEA8 /* JSDatabaseCallback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSDatabaseCallback.cpp; sourceTree = "<group>"; };
    93769382                B776D43A1104525D00BEB0EC /* PrintContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PrintContext.h; sourceTree = "<group>"; };
    93779383                B776D43C1104527500BEB0EC /* PrintContext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PrintContext.cpp; sourceTree = "<group>"; };
     
    1056710573                                51A45B550CAD7FD7000D2BE9 /* DatabaseAuthorizer.cpp */,
    1056810574                                51A45B540CAD7FD7000D2BE9 /* DatabaseAuthorizer.h */,
     10575                                B5D36019112F8B560048DEA8 /* DatabaseCallback.h */,
    1056910576                                5116D9750CF177BD00C2B84D /* DatabaseDetails.h */,
    1057010577                                519611E90CAC749C0010A80C /* DatabaseTask.cpp */,
     
    1465214659                                1432E8480C51493F00B1500F /* GCController.cpp */,
    1465314660                                1432E8460C51493800B1500F /* GCController.h */,
     14661                                B5D3601E112F8BA80048DEA8 /* JSDatabaseCallback.cpp */,
     14662                                B5D3601C112F8BA00048DEA8 /* JSDatabaseCallback.h */,
    1465414663                                93B70D4709EB0C7C009D8468 /* JSDOMBinding.cpp */,
    1465514664                                93B70D4809EB0C7C009D8468 /* JSDOMBinding.h */,
     
    1859918608                                E462A4A1113E71BE004A4220 /* IntPointHash.h in Headers */,
    1860018609                                CE172E011136E8CE0062A533 /* ZoomMode.h in Headers */,
     18610                                B5D3601A112F8B560048DEA8 /* DatabaseCallback.h in Headers */,
     18611                                B5D3601D112F8BA00048DEA8 /* JSDatabaseCallback.h in Headers */,
    1860118612                        );
    1860218613                        runOnlyForDeploymentPostprocessing = 0;
     
    2078820799                                596229781133EFD700DC4CBB /* GeolocationPositionCache.cpp in Sources */,
    2078920800                                0BC2C7771134A8FC000B2F61 /* CanvasSurface.cpp in Sources */,
     20801                                B5D3601F112F8BA80048DEA8 /* JSDatabaseCallback.cpp in Sources */,
    2079020802                        );
    2079120803                        runOnlyForDeploymentPostprocessing = 0;
  • trunk/WebCore/bindings/js/JSDOMWindowCustom.cpp

    r55401 r55474  
    2424#include "Base64.h"
    2525#include "Chrome.h"
     26#include "Database.h"
    2627#include "DOMWindow.h"
    2728#include "Document.h"
     
    3738#include "History.h"
    3839#include "JSAudioConstructor.h"
     40#include "JSDatabase.h"
     41#include "JSDatabaseCallback.h"
    3942#include "JSDOMWindowShell.h"
    4043#include "JSEvent.h"
     
    10181021}
    10191022
     1023JSValue JSDOMWindow::openDatabase(ExecState* exec, const ArgList& args)
     1024{
     1025    if (!allowsAccessFrom(exec) || (args.size() < 4))
     1026        return jsUndefined();
     1027    ExceptionCode ec = 0;
     1028    const UString& name = args.at(0).toString(exec);
     1029    const UString& version = args.at(1).toString(exec);
     1030    const UString& displayName = args.at(2).toString(exec);
     1031    unsigned long estimatedSize = args.at(3).toInt32(exec);
     1032    RefPtr<DatabaseCallback> creationCallback;
     1033    if ((args.size() >= 5) && args.at(4).isObject())
     1034        creationCallback = JSDatabaseCallback::create(asObject(args.at(4)), globalObject());
     1035
     1036    JSValue result = toJS(exec, globalObject(), WTF::getPtr(impl()->openDatabase(name, version, displayName, estimatedSize, creationCallback.release(), ec)));
     1037    setDOMException(exec, ec);
     1038    return result;
     1039}
     1040
    10201041DOMWindow* toDOMWindow(JSValue value)
    10211042{
  • trunk/WebCore/bindings/v8/custom/V8DOMWindowCustom.cpp

    r55424 r55474  
    5656#include "V8BindingState.h"
    5757#include "V8CustomEventListener.h"
     58#include "V8Database.h"
     59#include "V8DatabaseCallback.h"
    5860#include "V8GCForContextDispose.h"
    5961#include "V8HTMLCollection.h"
     
    807809}
    808810
     811v8::Handle<v8::Value> V8DOMWindow::openDatabaseCallback(const v8::Arguments& args)
     812{
     813    INC_STATS("DOM.DOMWindow.openDatabase");
     814    if (args.Length() < 4)
     815        return v8::Undefined();
     816
     817    DOMWindow* imp = V8DOMWindow::toNative(args.Holder());
     818    if (!V8BindingSecurity::canAccessFrame(V8BindingState::Only(), imp->frame(), true))
     819        return v8::Undefined();
     820
     821    ExceptionCode ec = 0;
     822    String name = toWebCoreString(args[0]);
     823    String version = toWebCoreString(args[1]);
     824    String displayName = toWebCoreString(args[2]);
     825    unsigned long estimatedSize = args[3]->IntegerValue();
     826    RefPtr<DatabaseCallback> creationCallback;
     827    if ((args.Length() >= 5) && args[4]->IsObject())
     828        creationCallback = V8DatabaseCallback::create(args[4], imp->frame());
     829
     830    v8::Handle<v8::Value> result = toV8(imp->openDatabase(name, version, displayName, estimatedSize, creationCallback.release(), ec));
     831    V8Proxy::setDOMException(ec);
     832    return result;
     833}
     834
    809835bool V8DOMWindow::namedSecurityCheck(v8::Local<v8::Object> host, v8::Local<v8::Value> key, v8::AccessType type, v8::Local<v8::Value> data)
    810836{
  • trunk/WebCore/dom/Document.cpp

    r54992 r55474  
    47314731void Document::postTask(PassOwnPtr<Task> task)
    47324732{
    4733     if (isMainThread()) {
    4734         ScriptExecutionContextTaskTimer* timer = new ScriptExecutionContextTaskTimer(static_cast<Document*>(this), task);
    4735         timer->startOneShot(0);
    4736     } else {
    4737         callOnMainThread(performTask, new PerformTaskContext(m_weakReference, task));
    4738     }
     4733    callOnMainThread(performTask, new PerformTaskContext(m_weakReference, task));
    47394734}
    47404735
  • trunk/WebCore/page/DOMWindow.cpp

    r55452 r55474  
    3636#include "Console.h"
    3737#include "Database.h"
     38#include "DatabaseCallback.h"
    3839#include "DOMApplicationCache.h"
    3940#include "DOMSelection.h"
     
    11261127
    11271128#if ENABLE(DATABASE)
    1128 PassRefPtr<Database> DOMWindow::openDatabase(const String& name, const String& version, const String& displayName, unsigned long estimatedSize, ExceptionCode& ec)
     1129PassRefPtr<Database> DOMWindow::openDatabase(const String& name, const String& version, const String& displayName, unsigned long estimatedSize, PassRefPtr<DatabaseCallback> creationCallback, ExceptionCode& ec)
    11291130{
    11301131    if (!m_frame)
     
    11381139        return 0;
    11391140
    1140     return Database::openDatabase(document, name, version, displayName, estimatedSize, ec);
     1141    return Database::openDatabase(document, name, version, displayName, estimatedSize, creationCallback, ec);
    11411142}
    11421143#endif
  • trunk/WebCore/page/DOMWindow.h

    r54835 r55474  
    4646    class DOMSelection;
    4747    class Database;
     48    class DatabaseCallback;
    4849    class Document;
    4950    class Element;
     
    199200#if ENABLE(DATABASE)
    200201        // HTML 5 client-side database
    201         PassRefPtr<Database> openDatabase(const String& name, const String& version, const String& displayName, unsigned long estimatedSize, ExceptionCode&);
     202        PassRefPtr<Database> openDatabase(const String& name, const String& version, const String& displayName, unsigned long estimatedSize, PassRefPtr<DatabaseCallback> creationCallback, ExceptionCode&);
    202203#endif
    203204
  • trunk/WebCore/page/DOMWindow.idl

    r55419 r55474  
    161161#endif   
    162162#if defined(ENABLE_DATABASE) && ENABLE_DATABASE
    163         [EnabledAtRuntime] Database openDatabase(in DOMString name, in DOMString version, in DOMString displayName, in unsigned long estimatedSize)
     163        [EnabledAtRuntime, Custom] Database openDatabase(in DOMString name, in DOMString version, in DOMString displayName, in unsigned long estimatedSize, in DatabaseCallback creationCallback)
    164164            raises(DOMException);
    165165#endif
  • trunk/WebCore/storage/Database.cpp

    r55140 r55474  
    133133static int guidForOriginAndName(const String& origin, const String& name);
    134134
    135 PassRefPtr<Database> Database::openDatabase(ScriptExecutionContext* context, const String& name, const String& expectedVersion, const String& displayName, unsigned long estimatedSize, ExceptionCode& e)
     135class DatabaseCreationCallbackTask : public ScriptExecutionContext::Task {
     136public:
     137    static PassOwnPtr<DatabaseCreationCallbackTask> create(PassRefPtr<Database> database)
     138    {
     139        return new DatabaseCreationCallbackTask(database);
     140    }
     141
     142    virtual void performTask(ScriptExecutionContext*)
     143    {
     144        m_database->performCreationCallback();
     145    }
     146
     147private:
     148    DatabaseCreationCallbackTask(PassRefPtr<Database> database)
     149        : m_database(database)
     150    {
     151    }
     152
     153    RefPtr<Database> m_database;
     154};
     155
     156PassRefPtr<Database> Database::openDatabase(ScriptExecutionContext* context, const String& name,
     157                                            const String& expectedVersion, const String& displayName,
     158                                            unsigned long estimatedSize, PassRefPtr<DatabaseCallback> creationCallback,
     159                                            ExceptionCode& e)
    136160{
    137161    if (!DatabaseTracker::tracker().canEstablishDatabase(context, name, displayName, estimatedSize)) {
     
    141165    }
    142166
    143     RefPtr<Database> database = adoptRef(new Database(context, name, expectedVersion, displayName, estimatedSize));
     167    RefPtr<Database> database = adoptRef(new Database(context, name, expectedVersion, displayName, estimatedSize, creationCallback));
    144168
    145169    if (!database->openAndVerifyVersion(e)) {
     
    161185#endif
    162186
     187    // If it's a new database and a creation callback was provided, reset the expected
     188    // version to "" and schedule the creation callback. Because of some subtle String
     189    // implementation issues, we have to reset m_expectedVersion here instead of doing
     190    // it inside performOpenAndVerify() which is run on the DB thread.
     191    if (database->isNew() && database->m_creationCallback.get()) {
     192        database->m_expectedVersion = "";
     193        LOG(StorageAPI, "Scheduling DatabaseCreationCallbackTask for database %p\n", database.get());
     194        database->m_scriptExecutionContext->postTask(DatabaseCreationCallbackTask::create(database));
     195    }
     196
    163197    return database;
    164198}
    165199
    166 Database::Database(ScriptExecutionContext* context, const String& name, const String& expectedVersion, const String& displayName, unsigned long estimatedSize)
     200Database::Database(ScriptExecutionContext* context, const String& name, const String& expectedVersion, const String& displayName, unsigned long estimatedSize, PassRefPtr<DatabaseCallback> creationCallback)
    167201    : m_transactionInProgress(false)
    168202    , m_isTransactionQueueEnabled(true)
     
    176210    , m_stopped(false)
    177211    , m_opened(false)
     212    , m_new(false)
     213    , m_creationCallback(creationCallback)
    178214{
    179215    ASSERT(m_scriptExecutionContext.get());
     
    521557
    522558            if (!m_sqliteDatabase.tableExists(databaseInfoTableName())) {
     559                m_new = true;
     560
    523561                if (!m_sqliteDatabase.executeCommand("CREATE TABLE " + databaseInfoTableName() + " (key TEXT NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT REPLACE,value TEXT NOT NULL ON CONFLICT FAIL);")) {
    524562                    LOG_ERROR("Unable to create table %s in database %s", databaseInfoTableName().ascii().data(), databaseDebugName().ascii().data());
     
    539577            if (currentVersion.length()) {
    540578                LOG(StorageAPI, "Retrieved current version %s from database %s", currentVersion.ascii().data(), databaseDebugName().ascii().data());
    541             } else {
     579            } else if (!m_new || !m_creationCallback) {
    542580                LOG(StorageAPI, "Setting version %s in database %s that was just created", m_expectedVersion.ascii().data(), databaseDebugName().ascii().data());
    543581                if (!setVersionInDatabase(m_expectedVersion)) {
     
    562600    // If the expected version isn't the empty string, ensure that the current database version we have matches that version. Otherwise, set an exception.
    563601    // If the expected version is the empty string, then we always return with whatever version of the database we have.
    564     if (m_expectedVersion.length() && m_expectedVersion != currentVersion) {
     602    if ((!m_new || !m_creationCallback) && m_expectedVersion.length() && m_expectedVersion != currentVersion) {
    565603        LOG(StorageAPI, "page expects version %s from database %s, which actually has version name %s - openDatabase() call will fail", m_expectedVersion.ascii().data(),
    566604            databaseDebugName().ascii().data(), currentVersion.ascii().data());
     
    686724}
    687725
     726void Database::performCreationCallback()
     727{
     728    m_creationCallback->handleEvent(m_scriptExecutionContext.get(), this);
     729}
     730
    688731SQLTransactionClient* Database::transactionClient() const
    689732{
  • trunk/WebCore/storage/Database.h

    r53595 r55474  
    3131
    3232#if ENABLE(DATABASE)
     33#include "DatabaseCallback.h"
    3334#include "PlatformString.h"
    3435#include "SecurityOrigin.h"
     
    5253
    5354class DatabaseAuthorizer;
     55class DatabaseCallback;
    5456class DatabaseThread;
    5557class ScriptExecutionContext;
     
    7476
    7577// Direct support for the DOM API
    76     static PassRefPtr<Database> openDatabase(ScriptExecutionContext* context, const String& name, const String& expectedVersion, const String& displayName, unsigned long estimatedSize, ExceptionCode&);
     78    static PassRefPtr<Database> openDatabase(ScriptExecutionContext* context, const String& name,
     79                                             const String& expectedVersion, const String& displayName,
     80                                             unsigned long estimatedSize, PassRefPtr<DatabaseCallback> creationCallback,
     81                                             ExceptionCode&);
    7782    String version() const;
    7883    void changeVersion(const String& oldVersion, const String& newVersion,
     
    112117    bool stopped() const { return m_stopped; }
    113118
     119    bool isNew() const { return m_new; }
     120
    114121    unsigned long long databaseSize() const;
    115122    unsigned long long maximumSize() const;
     
    122129
    123130    Vector<String> performGetTableNames();
     131    void performCreationCallback();
    124132
    125133    SQLTransactionClient* transactionClient() const;
     
    129137    Database(ScriptExecutionContext* context, const String& name,
    130138             const String& expectedVersion, const String& displayName,
    131              unsigned long estimatedSize);
     139             unsigned long estimatedSize, PassRefPtr<DatabaseCallback> creationCallback);
    132140
    133141    bool openAndVerifyVersion(ExceptionCode&);
     
    160168    bool m_opened;
    161169
     170    bool m_new;
     171
    162172    SQLiteDatabase m_sqliteDatabase;
    163173    RefPtr<DatabaseAuthorizer> m_databaseAuthorizer;
     174
     175    RefPtr<DatabaseCallback> m_creationCallback;
    164176
    165177#ifndef NDEBUG
  • trunk/WebCore/workers/WorkerContext.cpp

    r53595 r55474  
    257257
    258258#if ENABLE(DATABASE)
    259 PassRefPtr<Database> WorkerContext::openDatabase(const String& name, const String& version, const String& displayName, unsigned long estimatedSize, ExceptionCode& ec)
     259PassRefPtr<Database> WorkerContext::openDatabase(const String& name, const String& version, const String& displayName, unsigned long estimatedSize, PassRefPtr<DatabaseCallback> creationCallback, ExceptionCode& ec)
    260260{
    261261    if (!securityOrigin()->canAccessDatabase()) {
     
    268268        return 0;
    269269
    270     return Database::openDatabase(this, name, version, displayName, estimatedSize, ec);
     270    return Database::openDatabase(this, name, version, displayName, estimatedSize, creationCallback, ec);
    271271}
    272272#endif
  • trunk/WebCore/workers/WorkerContext.h

    r53595 r55474  
    3232#include "AtomicStringHash.h"
    3333#include "Database.h"
     34#include "DatabaseCallback.h"
    3435#include "EventListener.h"
    3536#include "EventNames.h"
     
    107108#if ENABLE(DATABASE)
    108109        // HTML 5 client-side database
    109         PassRefPtr<Database> openDatabase(const String& name, const String& version, const String& displayName, unsigned long estimatedSize, ExceptionCode&);
     110        PassRefPtr<Database> openDatabase(const String& name, const String& version, const String& displayName, unsigned long estimatedSize, PassRefPtr<DatabaseCallback> creationCallback, ExceptionCode&);
    110111        // Not implemented yet.
    111112        virtual bool isDatabaseReadOnly() const { return false; }
Note: See TracChangeset for help on using the changeset viewer.