Changeset 55593 in webkit


Ignore:
Timestamp:
Mar 5, 2010 2:17:23 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.

Also, fixing fast/frames/sandboxed-iframe-storage.html: calling
openDatabase() without at least 4 parameters should always fail,
because the database name, version, description and estimated size
are not optional according to the spec.

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

  • fast/frames/resources/sandboxed-iframe-storage-allowed.html:
  • fast/frames/resources/sandboxed-iframe-storage-disallowed.html:
  • fast/frames/sandboxed-iframe-storage-expected.txt:
  • platform/qt/Skipped:
  • 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
23 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r55591 r55593  
     12010-03-04  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        Also, fixing fast/frames/sandboxed-iframe-storage.html: calling
     10        openDatabase() without at least 4 parameters should always fail,
     11        because the database name, version, description and estimated size
     12        are not optional according to the spec.
     13
     14        https://bugs.webkit.org/show_bug.cgi?id=34726
     15
     16        * fast/frames/resources/sandboxed-iframe-storage-allowed.html:
     17        * fast/frames/resources/sandboxed-iframe-storage-disallowed.html:
     18        * fast/frames/sandboxed-iframe-storage-expected.txt:
     19        * platform/qt/Skipped:
     20        * storage/open-database-creation-callback-expected.txt: Added.
     21        * storage/open-database-creation-callback.html: Added.
     22        * storage/open-database-creation-callback-isolated-world-expected.txt: Added.
     23        * storage/open-database-creation-callback-isolated-world.html: Added.
     24
    1252010-03-05  Brian Weinstein  <bweinstein@apple.com>
    226
  • trunk/LayoutTests/fast/frames/resources/sandboxed-iframe-storage-allowed.html

    r51577 r55593  
    77
    88window.onload = function() {
    9     shouldBeTrue("window.openDatabase() != null");
     9    shouldBeTrue("window.openDatabase('SandboxedIframeStorageAllowed', '1.0', '', 1) != null");
    1010    shouldBeTrue("window.localStorage != null");
    1111    shouldBeTrue("window.sessionStorage != null");
  • trunk/LayoutTests/fast/frames/resources/sandboxed-iframe-storage-disallowed.html

    r51577 r55593  
    77
    88window.onload = function() {
    9     shouldBeTrue("window.openDatabase() == null");
     9    shouldBeTrue("window.openDatabase('SandboxedIframeStorageDisallowed', '1.0', '', 1) == null");
    1010    shouldBeTrue("window.localStorage == null");
    1111    shouldBeTrue("window.sessionStorage == null");
  • trunk/LayoutTests/fast/frames/sandboxed-iframe-storage-expected.txt

    r51577 r55593  
    1515Frame: '<!--framePath //<!--frame0-->-->'
    1616--------
    17 PASS window.openDatabase() == null is true
     17PASS window.openDatabase('SandboxedIframeStorageDisallowed', '1.0', '', 1) == null is true
    1818PASS window.localStorage == null is true
    1919PASS window.sessionStorage == null is true
     
    2323Frame: '<!--framePath //<!--frame1-->-->'
    2424--------
    25 PASS window.openDatabase() != null is true
     25PASS window.openDatabase('SandboxedIframeStorageAllowed', '1.0', '', 1) != null is true
    2626PASS window.localStorage != null is true
    2727PASS window.sessionStorage != null is true
  • trunk/LayoutTests/platform/qt/Skipped

    r55580 r55593  
    50965096# Core functionality is tested in plugins/private-browsing-mode-2.html
    50975097plugins/private-browsing-mode.html
     5098
     5099# Qt's DRT doesn't not seem to support the layoutTestController.evaluateScriptInIsolatedWorld() call.
     5100storage/open-database-creation-callback-isolated-world.html
  • trunk/WebCore/Android.jscbindings.mk

    r55485 r55593  
    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

    r55485 r55593  
    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

    r55592 r55593  
     12010-03-04  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-05  Chris Marrin  <cmarrin@apple.com>
    256
  • trunk/WebCore/GNUmakefile.am

    r55543 r55593  
    22312231        WebCore/bindings/js/JSCustomSQLTransactionErrorCallback.cpp \
    22322232        WebCore/bindings/js/JSCustomSQLTransactionErrorCallback.h \
     2233        WebCore/bindings/js/JSDatabaseCallback.cpp \
     2234        WebCore/bindings/js/JSDatabaseCallback.h \
    22332235        WebCore/bindings/js/JSDatabaseCustom.cpp \
    22342236        WebCore/bindings/js/JSSQLResultSetRowListCustom.cpp \
     
    22512253        WebCore/storage/DatabaseAuthorizer.cpp \
    22522254        WebCore/storage/DatabaseAuthorizer.h \
     2255        WebCore/storage/DatabaseCallback.h \
    22532256        WebCore/storage/DatabaseDetails.h \
    22542257        WebCore/storage/DatabaseTask.cpp \
  • trunk/WebCore/WebCore.gypi

    r55590 r55593  
    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',
     
    32223224            'storage/DatabaseAuthorizer.cpp',
    32233225            'storage/DatabaseAuthorizer.h',
     3226            'storage/DatabaseCallback.h',
    32243227            'storage/DatabaseDetails.h',
    32253228            'storage/DatabaseTask.cpp',
  • trunk/WebCore/WebCore.pro

    r55567 r55593  
    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 \
     
    22222223        bindings/js/JSCustomSQLTransactionCallback.cpp \
    22232224        bindings/js/JSCustomSQLTransactionErrorCallback.cpp \
     2225        bindings/js/JSDatabaseCallback.cpp \
    22242226        bindings/js/JSDatabaseCustom.cpp \
    22252227        bindings/js/JSSQLResultSetRowListCustom.cpp \
     
    22322234        storage/DatabaseAuthorizer.h \
    22332235        storage/Database.h \
     2236        storage/DatabaseCallback.h \
    22342237        storage/DatabaseTask.h \
    22352238        storage/DatabaseThread.h \
  • trunk/WebCore/WebCore.vcproj/WebCore.vcproj

    r55584 r55593  
    3536935369                                </File>
    3537035370                                <File
     35371                                        RelativePath="..\bindings\js\JSDatabaseCallback.cpp"
     35372                                        >
     35373                                </File>
     35374                                <File
     35375                                        RelativePath="..\bindings\js\JSDatabaseCallback.h"
     35376                                        >
     35377                                </File>
     35378                                <File
    3537135379                                        RelativePath="..\bindings\js\JSDatabaseCustom.cpp"
    3537235380                                        >
     
    4229042298                        </File>
    4229142299                        <File
     42300                                RelativePath="..\storage\DatabaseCallback.h"
     42301                                >
     42302                        </File>
     42303                        <File
    4229242304                                RelativePath="..\storage\DatabaseTask.cpp"
    4229342305                                >
  • trunk/WebCore/WebCore.xcodeproj/project.pbxproj

    r55560 r55593  
    41214121                B5C1123B102B6C4600096578 /* SQLTransactionCoordinator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5C11239102B6C4600096578 /* SQLTransactionCoordinator.cpp */; };
    41224122                B5C1123C102B6C4600096578 /* SQLTransactionCoordinator.h in Headers */ = {isa = PBXBuildFile; fileRef = B5C1123A102B6C4600096578 /* SQLTransactionCoordinator.h */; };
     4123                B5D3601A112F8B560048DEA8 /* DatabaseCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = B5D36019112F8B560048DEA8 /* DatabaseCallback.h */; };
     4124                B5D3601D112F8BA00048DEA8 /* JSDatabaseCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = B5D3601C112F8BA00048DEA8 /* JSDatabaseCallback.h */; };
     4125                B5D3601F112F8BA80048DEA8 /* JSDatabaseCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5D3601E112F8BA80048DEA8 /* JSDatabaseCallback.cpp */; };
    41234126                B71FE6DF11091CB300DAEF77 /* PrintContext.h in Headers */ = {isa = PBXBuildFile; fileRef = B776D43A1104525D00BEB0EC /* PrintContext.h */; settings = {ATTRIBUTES = (Private, ); }; };
    41244127                B776D43D1104527500BEB0EC /* PrintContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B776D43C1104527500BEB0EC /* PrintContext.cpp */; };
     
    93869389                B5C11239102B6C4600096578 /* SQLTransactionCoordinator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SQLTransactionCoordinator.cpp; sourceTree = "<group>"; };
    93879390                B5C1123A102B6C4600096578 /* SQLTransactionCoordinator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SQLTransactionCoordinator.h; sourceTree = "<group>"; };
     9391                B5D36019112F8B560048DEA8 /* DatabaseCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DatabaseCallback.h; sourceTree = "<group>"; };
     9392                B5D3601C112F8BA00048DEA8 /* JSDatabaseCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSDatabaseCallback.h; sourceTree = "<group>"; };
     9393                B5D3601E112F8BA80048DEA8 /* JSDatabaseCallback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSDatabaseCallback.cpp; sourceTree = "<group>"; };
    93889394                B776D43A1104525D00BEB0EC /* PrintContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PrintContext.h; sourceTree = "<group>"; };
    93899395                B776D43C1104527500BEB0EC /* PrintContext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PrintContext.cpp; sourceTree = "<group>"; };
     
    1057910585                                51A45B550CAD7FD7000D2BE9 /* DatabaseAuthorizer.cpp */,
    1058010586                                51A45B540CAD7FD7000D2BE9 /* DatabaseAuthorizer.h */,
     10587                                B5D36019112F8B560048DEA8 /* DatabaseCallback.h */,
    1058110588                                5116D9750CF177BD00C2B84D /* DatabaseDetails.h */,
    1058210589                                519611E90CAC749C0010A80C /* DatabaseTask.cpp */,
     
    1466814675                                1432E8480C51493F00B1500F /* GCController.cpp */,
    1466914676                                1432E8460C51493800B1500F /* GCController.h */,
     14677                                B5D3601E112F8BA80048DEA8 /* JSDatabaseCallback.cpp */,
     14678                                B5D3601C112F8BA00048DEA8 /* JSDatabaseCallback.h */,
    1467014679                                93B70D4709EB0C7C009D8468 /* JSDOMBinding.cpp */,
    1467114680                                93B70D4809EB0C7C009D8468 /* JSDOMBinding.h */,
     
    1861718626                                7637C543112E7B7E003D6CDC /* WebSocketHandshakeRequest.h in Headers */,
    1861818627                                626CDE0F1140424C001E5A68 /* SpatialNavigation.h in Headers */,
     18628                                B5D3601A112F8B560048DEA8 /* DatabaseCallback.h in Headers */,
     18629                                B5D3601D112F8BA00048DEA8 /* JSDatabaseCallback.h in Headers */,
    1861918630                        );
    1862018631                        runOnlyForDeploymentPostprocessing = 0;
     
    2080820819                                7637C541112E7B74003D6CDC /* WebSocketHandshakeRequest.cpp in Sources */,
    2080920820                                626CDE0E1140424C001E5A68 /* SpatialNavigation.cpp in Sources */,
     20821                                B5D3601F112F8BA80048DEA8 /* JSDatabaseCallback.cpp in Sources */,
    2081020822                        );
    2081120823                        runOnlyForDeploymentPostprocessing = 0;
  • trunk/WebCore/bindings/js/JSDOMWindowCustom.cpp

    r55485 r55593  
    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

    r55586 r55593  
    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

    r55584 r55593  
    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

    r55485 r55593  
    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

    r55485 r55593  
    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

    r55485 r55593  
    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

    r55485 r55593  
    3636#include "CString.h"
    3737#include "DatabaseAuthorizer.h"
     38#include "DatabaseCallback.h"
    3839#include "DatabaseTask.h"
    3940#include "DatabaseThread.h"
     
    133134static int guidForOriginAndName(const String& origin, const String& name);
    134135
    135 PassRefPtr<Database> Database::openDatabase(ScriptExecutionContext* context, const String& name, const String& expectedVersion, const String& displayName, unsigned long estimatedSize, ExceptionCode& e)
     136class DatabaseCreationCallbackTask : public ScriptExecutionContext::Task {
     137public:
     138    static PassOwnPtr<DatabaseCreationCallbackTask> create(PassRefPtr<Database> database)
     139    {
     140        return new DatabaseCreationCallbackTask(database);
     141    }
     142
     143    virtual void performTask(ScriptExecutionContext*)
     144    {
     145        m_database->performCreationCallback();
     146    }
     147
     148private:
     149    DatabaseCreationCallbackTask(PassRefPtr<Database> database)
     150        : m_database(database)
     151    {
     152    }
     153
     154    RefPtr<Database> m_database;
     155};
     156
     157PassRefPtr<Database> Database::openDatabase(ScriptExecutionContext* context, const String& name,
     158                                            const String& expectedVersion, const String& displayName,
     159                                            unsigned long estimatedSize, PassRefPtr<DatabaseCallback> creationCallback,
     160                                            ExceptionCode& e)
    136161{
    137162    if (!DatabaseTracker::tracker().canEstablishDatabase(context, name, displayName, estimatedSize)) {
     
    141166    }
    142167
    143     RefPtr<Database> database = adoptRef(new Database(context, name, expectedVersion, displayName, estimatedSize));
     168    RefPtr<Database> database = adoptRef(new Database(context, name, expectedVersion, displayName, estimatedSize, creationCallback));
    144169
    145170    if (!database->openAndVerifyVersion(e)) {
     
    161186#endif
    162187
     188    // If it's a new database and a creation callback was provided, reset the expected
     189    // version to "" and schedule the creation callback. Because of some subtle String
     190    // implementation issues, we have to reset m_expectedVersion here instead of doing
     191    // it inside performOpenAndVerify() which is run on the DB thread.
     192    if (database->isNew() && database->m_creationCallback.get()) {
     193        database->m_expectedVersion = "";
     194        LOG(StorageAPI, "Scheduling DatabaseCreationCallbackTask for database %p\n", database.get());
     195        database->m_scriptExecutionContext->postTask(DatabaseCreationCallbackTask::create(database));
     196    }
     197
    163198    return database;
    164199}
    165200
    166 Database::Database(ScriptExecutionContext* context, const String& name, const String& expectedVersion, const String& displayName, unsigned long estimatedSize)
     201Database::Database(ScriptExecutionContext* context, const String& name, const String& expectedVersion, const String& displayName, unsigned long estimatedSize, PassRefPtr<DatabaseCallback> creationCallback)
    167202    : m_transactionInProgress(false)
    168203    , m_isTransactionQueueEnabled(true)
     
    176211    , m_stopped(false)
    177212    , m_opened(false)
     213    , m_new(false)
     214    , m_creationCallback(creationCallback)
    178215{
    179216    ASSERT(m_scriptExecutionContext.get());
     
    521558
    522559            if (!m_sqliteDatabase.tableExists(databaseInfoTableName())) {
     560                m_new = true;
     561
    523562                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);")) {
    524563                    LOG_ERROR("Unable to create table %s in database %s", databaseInfoTableName().ascii().data(), databaseDebugName().ascii().data());
     
    539578            if (currentVersion.length()) {
    540579                LOG(StorageAPI, "Retrieved current version %s from database %s", currentVersion.ascii().data(), databaseDebugName().ascii().data());
    541             } else {
     580            } else if (!m_new || !m_creationCallback) {
    542581                LOG(StorageAPI, "Setting version %s in database %s that was just created", m_expectedVersion.ascii().data(), databaseDebugName().ascii().data());
    543582                if (!setVersionInDatabase(m_expectedVersion)) {
     
    562601    // If the expected version isn't the empty string, ensure that the current database version we have matches that version. Otherwise, set an exception.
    563602    // 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) {
     603    if ((!m_new || !m_creationCallback) && m_expectedVersion.length() && m_expectedVersion != currentVersion) {
    565604        LOG(StorageAPI, "page expects version %s from database %s, which actually has version name %s - openDatabase() call will fail", m_expectedVersion.ascii().data(),
    566605            databaseDebugName().ascii().data(), currentVersion.ascii().data());
     
    686725}
    687726
     727void Database::performCreationCallback()
     728{
     729    m_creationCallback->handleEvent(m_scriptExecutionContext.get(), this);
     730}
     731
    688732SQLTransactionClient* Database::transactionClient() const
    689733{
  • trunk/WebCore/storage/Database.h

    r55485 r55593  
    5252
    5353class DatabaseAuthorizer;
     54class DatabaseCallback;
    5455class DatabaseThread;
    5556class ScriptExecutionContext;
     
    7475
    7576// 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&);
     77    static PassRefPtr<Database> openDatabase(ScriptExecutionContext* context, const String& name,
     78                                             const String& expectedVersion, const String& displayName,
     79                                             unsigned long estimatedSize, PassRefPtr<DatabaseCallback> creationCallback,
     80                                             ExceptionCode&);
    7781    String version() const;
    7882    void changeVersion(const String& oldVersion, const String& newVersion,
     
    112116    bool stopped() const { return m_stopped; }
    113117
     118    bool isNew() const { return m_new; }
     119
    114120    unsigned long long databaseSize() const;
    115121    unsigned long long maximumSize() const;
     
    122128
    123129    Vector<String> performGetTableNames();
     130    void performCreationCallback();
    124131
    125132    SQLTransactionClient* transactionClient() const;
     
    129136    Database(ScriptExecutionContext* context, const String& name,
    130137             const String& expectedVersion, const String& displayName,
    131              unsigned long estimatedSize);
     138             unsigned long estimatedSize, PassRefPtr<DatabaseCallback> creationCallback);
    132139
    133140    bool openAndVerifyVersion(ExceptionCode&);
     
    160167    bool m_opened;
    161168
     169    bool m_new;
     170
    162171    SQLiteDatabase m_sqliteDatabase;
    163172    RefPtr<DatabaseAuthorizer> m_databaseAuthorizer;
     173
     174    RefPtr<DatabaseCallback> m_creationCallback;
    164175
    165176#ifndef NDEBUG
  • trunk/WebCore/workers/WorkerContext.cpp

    r55485 r55593  
    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

    r55485 r55593  
    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.