Changeset 55823 in webkit
- Timestamp:
- Mar 10, 2010 6:18:41 PM (14 years ago)
- Location:
- trunk
- Files:
-
- 9 added
- 21 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r55822 r55823 1 2010-03-08 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 1 25 2010-03-10 Justin Schuh <jschuh@chromium.org> 2 26 -
trunk/LayoutTests/fast/frames/resources/sandboxed-iframe-storage-allowed.html
r55635 r55823 7 7 8 8 window.onload = function() { 9 shouldBeTrue("window.openDatabase( ) != null");9 shouldBeTrue("window.openDatabase('SandboxedIframeStorageAllowed', '1.0', '', 1) != null"); 10 10 shouldBeTrue("window.localStorage != null"); 11 11 shouldBeTrue("window.sessionStorage != null"); -
trunk/LayoutTests/fast/frames/resources/sandboxed-iframe-storage-disallowed.html
r55635 r55823 7 7 8 8 window.onload = function() { 9 shouldBeTrue("window.openDatabase( ) == null");9 shouldBeTrue("window.openDatabase('SandboxedIframeStorageDisallowed', '1.0', '', 1) == null"); 10 10 shouldBeTrue("window.localStorage == null"); 11 11 shouldBeTrue("window.sessionStorage == null"); -
trunk/LayoutTests/fast/frames/sandboxed-iframe-storage-expected.txt
r55635 r55823 15 15 Frame: '<!--framePath //<!--frame0-->-->' 16 16 -------- 17 PASS window.openDatabase( ) == null is true17 PASS window.openDatabase('SandboxedIframeStorageDisallowed', '1.0', '', 1) == null is true 18 18 PASS window.localStorage == null is true 19 19 PASS window.sessionStorage == null is true … … 23 23 Frame: '<!--framePath //<!--frame1-->-->' 24 24 -------- 25 PASS window.openDatabase( ) != null is true25 PASS window.openDatabase('SandboxedIframeStorageAllowed', '1.0', '', 1) != null is true 26 26 PASS window.localStorage != null is true 27 27 PASS window.sessionStorage != null is true -
trunk/WebCore/Android.jscbindings.mk
r55635 r55823 81 81 bindings/js/JSCustomSQLTransactionErrorCallback.cpp \ 82 82 bindings/js/JSCustomVoidCallback.cpp \ 83 bindings/js/JSDatabaseCallback.cpp \ 83 84 bindings/js/JSDesktopNotificationsCustom.cpp \ 84 85 bindings/js/JSDOMApplicationCacheCustom.cpp \ -
trunk/WebCore/Android.v8bindings.mk
r55798 r55823 108 108 bindings/v8/custom/V8DOMWindowCustom.cpp \ 109 109 bindings/v8/custom/V8DataGridColumnListCustom.cpp \ 110 bindings/v8/custom/V8DatabaseCallback.cpp \ 110 111 bindings/v8/custom/V8DatabaseCustom.cpp \ 111 112 bindings/v8/custom/V8DedicatedWorkerContextCustom.cpp \ -
trunk/WebCore/ChangeLog
r55822 r55823 1 2010-03-08 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 Tests: storage/open-database-creation-callback.html 9 storage/open-database-creation-callback-isolated-world.html 10 11 https://bugs.webkit.org/show_bug.cgi?id=34726 12 13 * Android.jscbindings.mk 14 * Android.v8bindings.mk 15 * GNUmakefile.am: 16 * WebCore.gypi: 17 * WebCore.pro: 18 * WebCore.vcproj/WebCore.vcproj: 19 * WebCore.xcodeproj/project.pbxproj: 20 * bindings/js/JSDOMWindowCustom.cpp: 21 (WebCore::JSDOMWindow::openDatabase): 22 * bindings/js/JSDatabaseCallback.cpp: Added. 23 (WebCore::JSDatabaseCallback::JSDatabaseCallback): 24 (WebCore::JSDatabaseCallback::~JSDatabaseCallback): 25 (WebCore::JSDatabaseCallback::handleEvent): 26 * bindings/js/JSDatabaseCallback.h: Added. 27 (WebCore::JSDatabaseCallback::create): 28 * bindings/v8/custom/V8DOMWindowCustom.cpp: 29 (WebCore::V8DOMWindow::openDatabaseCallback): 30 * bindings/v8/custom/V8DatabaseCallback.cpp: Added. 31 (WebCore::V8DatabaseCallback::V8DatabaseCallback): 32 (WebCore::V8DatabaseCallback::~V8DatabaseCallback): 33 (WebCore::V8DatabaseCallback::handleEvent): 34 * bindings/v8/custom/V8DatabaseCallback.h: Added. 35 (WebCore::V8DatabaseCallback::create): 36 * page/DOMWindow.cpp: 37 (WebCore::DOMWindow::openDatabase): 38 * page/DOMWindow.h: 39 * page/DOMWindow.idl: 40 * storage/Database.cpp: 41 (WebCore::DatabaseCreationCallbackTask::create): 42 (WebCore::DatabaseCreationCallbackTask::performTask): 43 (WebCore::DatabaseCreationCallbackTask::DatabaseCreationCallbackTask): 44 (WebCore::Database::openDatabase): 45 (WebCore::Database::Database): 46 (WebCore::Database::performOpenAndVerify): 47 (WebCore::Database::performCreationCallback): 48 * storage/Database.h: 49 (WebCore::Database::isNew): 50 * storage/DatabaseCallback.h: Added. 51 (WebCore::DatabaseCallback::~DatabaseCallback): 52 * workers/WorkerContext.cpp: 53 (WebCore::WorkerContext::openDatabase): 54 * workers/WorkerContext.h: 55 1 56 2010-03-10 Justin Schuh <jschuh@chromium.org> 2 57 -
trunk/WebCore/GNUmakefile.am
r55821 r55823 2242 2242 WebCore/bindings/js/JSCustomSQLTransactionErrorCallback.cpp \ 2243 2243 WebCore/bindings/js/JSCustomSQLTransactionErrorCallback.h \ 2244 WebCore/bindings/js/JSDatabaseCallback.cpp \ 2245 WebCore/bindings/js/JSDatabaseCallback.h \ 2244 2246 WebCore/bindings/js/JSDatabaseCustom.cpp \ 2245 2247 WebCore/bindings/js/JSSQLResultSetRowListCustom.cpp \ … … 2262 2264 WebCore/storage/DatabaseAuthorizer.cpp \ 2263 2265 WebCore/storage/DatabaseAuthorizer.h \ 2266 WebCore/storage/DatabaseCallback.h \ 2264 2267 WebCore/storage/DatabaseDetails.h \ 2265 2268 WebCore/storage/DatabaseTask.cpp \ -
trunk/WebCore/WebCore.gypi
r55821 r55823 714 714 'bindings/v8/custom/V8CustomXPathNSResolver.cpp', 715 715 'bindings/v8/custom/V8CustomXPathNSResolver.h', 716 'bindings/v8/custom/V8DatabaseCallback.cpp', 717 'bindings/v8/custom/V8DatabaseCallback.h', 716 718 'bindings/v8/custom/V8DatabaseCustom.cpp', 717 719 'bindings/v8/custom/V8DataGridColumnListCustom.cpp', … … 3242 3244 'storage/DatabaseAuthorizer.cpp', 3243 3245 'storage/DatabaseAuthorizer.h', 3246 'storage/DatabaseCallback.h', 3244 3247 'storage/DatabaseDetails.h', 3245 3248 'storage/DatabaseTask.cpp', -
trunk/WebCore/WebCore.pro
r55821 r55823 1020 1020 bindings/js/JSCustomVoidCallback.h \ 1021 1021 bindings/js/JSCustomXPathNSResolver.h \ 1022 bindings/js/JSDatabaseCallback.h \ 1022 1023 bindings/js/JSDataGridDataSource.h \ 1023 1024 bindings/js/JSDebugWrapperSet.h \ … … 2232 2233 bindings/js/JSCustomSQLTransactionCallback.cpp \ 2233 2234 bindings/js/JSCustomSQLTransactionErrorCallback.cpp \ 2235 bindings/js/JSDatabaseCallback.cpp \ 2234 2236 bindings/js/JSDatabaseCustom.cpp \ 2235 2237 bindings/js/JSSQLResultSetRowListCustom.cpp \ … … 2242 2244 storage/DatabaseAuthorizer.h \ 2243 2245 storage/Database.h \ 2246 storage/DatabaseCallback.h \ 2244 2247 storage/DatabaseTask.h \ 2245 2248 storage/DatabaseThread.h \ -
trunk/WebCore/WebCore.vcproj/WebCore.vcproj
r55821 r55823 35393 35393 </File> 35394 35394 <File 35395 RelativePath="..\bindings\js\JSDatabaseCallback.cpp" 35396 > 35397 </File> 35398 <File 35399 RelativePath="..\bindings\js\JSDatabaseCallback.h" 35400 > 35401 </File> 35402 <File 35395 35403 RelativePath="..\bindings\js\JSDatabaseCustom.cpp" 35396 35404 > … … 42330 42338 </File> 42331 42339 <File 42340 RelativePath="..\storage\DatabaseCallback.h" 42341 > 42342 </File> 42343 <File 42332 42344 RelativePath="..\storage\DatabaseTask.cpp" 42333 42345 > -
trunk/WebCore/WebCore.xcodeproj/project.pbxproj
r55821 r55823 4124 4124 B5C1123B102B6C4600096578 /* SQLTransactionCoordinator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5C11239102B6C4600096578 /* SQLTransactionCoordinator.cpp */; }; 4125 4125 B5C1123C102B6C4600096578 /* SQLTransactionCoordinator.h in Headers */ = {isa = PBXBuildFile; fileRef = B5C1123A102B6C4600096578 /* SQLTransactionCoordinator.h */; }; 4126 B5D3601A112F8B560048DEA8 /* DatabaseCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = B5D36019112F8B560048DEA8 /* DatabaseCallback.h */; }; 4127 B5D3601D112F8BA00048DEA8 /* JSDatabaseCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = B5D3601C112F8BA00048DEA8 /* JSDatabaseCallback.h */; }; 4128 B5D3601F112F8BA80048DEA8 /* JSDatabaseCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5D3601E112F8BA80048DEA8 /* JSDatabaseCallback.cpp */; }; 4126 4129 B71FE6DF11091CB300DAEF77 /* PrintContext.h in Headers */ = {isa = PBXBuildFile; fileRef = B776D43A1104525D00BEB0EC /* PrintContext.h */; settings = {ATTRIBUTES = (Private, ); }; }; 4127 4130 B776D43D1104527500BEB0EC /* PrintContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B776D43C1104527500BEB0EC /* PrintContext.cpp */; }; … … 9406 9409 B5C11239102B6C4600096578 /* SQLTransactionCoordinator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SQLTransactionCoordinator.cpp; sourceTree = "<group>"; }; 9407 9410 B5C1123A102B6C4600096578 /* SQLTransactionCoordinator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SQLTransactionCoordinator.h; sourceTree = "<group>"; }; 9411 B5D36019112F8B560048DEA8 /* DatabaseCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DatabaseCallback.h; sourceTree = "<group>"; }; 9412 B5D3601C112F8BA00048DEA8 /* JSDatabaseCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSDatabaseCallback.h; sourceTree = "<group>"; }; 9413 B5D3601E112F8BA80048DEA8 /* JSDatabaseCallback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSDatabaseCallback.cpp; sourceTree = "<group>"; }; 9408 9414 B776D43A1104525D00BEB0EC /* PrintContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PrintContext.h; sourceTree = "<group>"; }; 9409 9415 B776D43C1104527500BEB0EC /* PrintContext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PrintContext.cpp; sourceTree = "<group>"; }; … … 10613 10619 51A45B550CAD7FD7000D2BE9 /* DatabaseAuthorizer.cpp */, 10614 10620 51A45B540CAD7FD7000D2BE9 /* DatabaseAuthorizer.h */, 10621 B5D36019112F8B560048DEA8 /* DatabaseCallback.h */, 10615 10622 5116D9750CF177BD00C2B84D /* DatabaseDetails.h */, 10616 10623 519611E90CAC749C0010A80C /* DatabaseTask.cpp */, … … 14706 14713 1432E8480C51493F00B1500F /* GCController.cpp */, 14707 14714 1432E8460C51493800B1500F /* GCController.h */, 14715 B5D3601E112F8BA80048DEA8 /* JSDatabaseCallback.cpp */, 14716 B5D3601C112F8BA00048DEA8 /* JSDatabaseCallback.h */, 14708 14717 BC53DAC411432FD9000D817E /* JSDebugWrapperSet.cpp */, 14709 14718 BC53DAC111432EEE000D817E /* JSDebugWrapperSet.h */, … … 18676 18685 BC53DAC211432EEE000D817E /* JSDebugWrapperSet.h in Headers */, 18677 18686 2ED609BD1145B07100C8684E /* DOMFormData.h in Headers */, 18687 B5D3601A112F8B560048DEA8 /* DatabaseCallback.h in Headers */, 18688 B5D3601D112F8BA00048DEA8 /* JSDatabaseCallback.h in Headers */, 18678 18689 ); 18679 18690 runOnlyForDeploymentPostprocessing = 0; … … 20876 20887 BC53DAC711433064000D817E /* JSDOMWrapper.cpp in Sources */, 20877 20888 2ED609BC1145B07100C8684E /* DOMFormData.cpp in Sources */, 20889 B5D3601F112F8BA80048DEA8 /* JSDatabaseCallback.cpp in Sources */, 20878 20890 ); 20879 20891 runOnlyForDeploymentPostprocessing = 0; -
trunk/WebCore/bindings/js/JSDOMWindowCustom.cpp
r55637 r55823 23 23 #include "AtomicString.h" 24 24 #include "Chrome.h" 25 #include "Database.h" 25 26 #include "DOMWindow.h" 26 27 #include "Document.h" … … 36 37 #include "History.h" 37 38 #include "JSAudioConstructor.h" 39 #include "JSDatabase.h" 40 #include "JSDatabaseCallback.h" 38 41 #include "JSDOMWindowShell.h" 39 42 #include "JSEvent.h" … … 966 969 } 967 970 971 JSValue JSDOMWindow::openDatabase(ExecState* exec, const ArgList& args) 972 { 973 if (!allowsAccessFrom(exec) || (args.size() < 4)) 974 return jsUndefined(); 975 ExceptionCode ec = 0; 976 const UString& name = args.at(0).toString(exec); 977 const UString& version = args.at(1).toString(exec); 978 const UString& displayName = args.at(2).toString(exec); 979 unsigned long estimatedSize = args.at(3).toInt32(exec); 980 RefPtr<DatabaseCallback> creationCallback; 981 if ((args.size() >= 5) && args.at(4).isObject()) 982 creationCallback = JSDatabaseCallback::create(asObject(args.at(4)), globalObject()); 983 984 JSValue result = toJS(exec, globalObject(), WTF::getPtr(impl()->openDatabase(name, version, displayName, estimatedSize, creationCallback.release(), ec))); 985 setDOMException(exec, ec); 986 return result; 987 } 988 968 989 DOMWindow* toDOMWindow(JSValue value) 969 990 { -
trunk/WebCore/bindings/v8/custom/V8DOMWindowCustom.cpp
r55798 r55823 55 55 #include "V8BindingState.h" 56 56 #include "V8CustomEventListener.h" 57 #include "V8Database.h" 58 #include "V8DatabaseCallback.h" 57 59 #include "V8GCForContextDispose.h" 58 60 #include "V8HTMLAudioElementConstructor.h" … … 774 776 } 775 777 778 v8::Handle<v8::Value> V8DOMWindow::openDatabaseCallback(const v8::Arguments& args) 779 { 780 INC_STATS("DOM.DOMWindow.openDatabase"); 781 if (args.Length() < 4) 782 return v8::Undefined(); 783 784 DOMWindow* imp = V8DOMWindow::toNative(args.Holder()); 785 if (!V8BindingSecurity::canAccessFrame(V8BindingState::Only(), imp->frame(), true)) 786 return v8::Undefined(); 787 788 ExceptionCode ec = 0; 789 String name = toWebCoreString(args[0]); 790 String version = toWebCoreString(args[1]); 791 String displayName = toWebCoreString(args[2]); 792 unsigned long estimatedSize = args[3]->IntegerValue(); 793 RefPtr<DatabaseCallback> creationCallback; 794 if ((args.Length() >= 5) && args[4]->IsObject()) 795 creationCallback = V8DatabaseCallback::create(args[4], imp->frame()); 796 797 v8::Handle<v8::Value> result = toV8(imp->openDatabase(name, version, displayName, estimatedSize, creationCallback.release(), ec)); 798 V8Proxy::setDOMException(ec); 799 return result; 800 } 801 776 802 bool V8DOMWindow::namedSecurityCheck(v8::Local<v8::Object> host, v8::Local<v8::Value> key, v8::AccessType type, v8::Local<v8::Value> data) 777 803 { -
trunk/WebCore/page/DOMWindow.cpp
r55637 r55823 37 37 #include "Console.h" 38 38 #include "Database.h" 39 #include "DatabaseCallback.h" 39 40 #include "DOMApplicationCache.h" 40 41 #include "DOMSelection.h" … … 1178 1179 1179 1180 #if ENABLE(DATABASE) 1180 PassRefPtr<Database> DOMWindow::openDatabase(const String& name, const String& version, const String& displayName, unsigned long estimatedSize, ExceptionCode& ec)1181 PassRefPtr<Database> DOMWindow::openDatabase(const String& name, const String& version, const String& displayName, unsigned long estimatedSize, PassRefPtr<DatabaseCallback> creationCallback, ExceptionCode& ec) 1181 1182 { 1182 1183 if (!m_frame) … … 1190 1191 return 0; 1191 1192 1192 return Database::openDatabase(document, name, version, displayName, estimatedSize, ec);1193 return Database::openDatabase(document, name, version, displayName, estimatedSize, creationCallback, ec); 1193 1194 } 1194 1195 #endif -
trunk/WebCore/page/DOMWindow.h
r55635 r55823 46 46 class DOMSelection; 47 47 class Database; 48 class DatabaseCallback; 48 49 class Document; 49 50 class Element; … … 201 202 #if ENABLE(DATABASE) 202 203 // HTML 5 client-side database 203 PassRefPtr<Database> openDatabase(const String& name, const String& version, const String& displayName, unsigned long estimatedSize, ExceptionCode&);204 PassRefPtr<Database> openDatabase(const String& name, const String& version, const String& displayName, unsigned long estimatedSize, PassRefPtr<DatabaseCallback> creationCallback, ExceptionCode&); 204 205 #endif 205 206 -
trunk/WebCore/page/DOMWindow.idl
r55637 r55823 161 161 #endif 162 162 #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) 164 164 raises(DOMException); 165 165 #endif -
trunk/WebCore/storage/Database.cpp
r55635 r55823 36 36 #include "CString.h" 37 37 #include "DatabaseAuthorizer.h" 38 #include "DatabaseCallback.h" 38 39 #include "DatabaseTask.h" 39 40 #include "DatabaseThread.h" … … 133 134 static int guidForOriginAndName(const String& origin, const String& name); 134 135 135 PassRefPtr<Database> Database::openDatabase(ScriptExecutionContext* context, const String& name, const String& expectedVersion, const String& displayName, unsigned long estimatedSize, ExceptionCode& e) 136 class DatabaseCreationCallbackTask : public ScriptExecutionContext::Task { 137 public: 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 148 private: 149 DatabaseCreationCallbackTask(PassRefPtr<Database> database) 150 : m_database(database) 151 { 152 } 153 154 RefPtr<Database> m_database; 155 }; 156 157 PassRefPtr<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) 136 161 { 137 162 if (!DatabaseTracker::tracker().canEstablishDatabase(context, name, displayName, estimatedSize)) { … … 141 166 } 142 167 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)); 144 169 145 170 if (!database->openAndVerifyVersion(e)) { … … 161 186 #endif 162 187 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 163 198 return database; 164 199 } 165 200 166 Database::Database(ScriptExecutionContext* context, const String& name, const String& expectedVersion, const String& displayName, unsigned long estimatedSize )201 Database::Database(ScriptExecutionContext* context, const String& name, const String& expectedVersion, const String& displayName, unsigned long estimatedSize, PassRefPtr<DatabaseCallback> creationCallback) 167 202 : m_transactionInProgress(false) 168 203 , m_isTransactionQueueEnabled(true) … … 176 211 , m_stopped(false) 177 212 , m_opened(false) 213 , m_new(false) 214 , m_creationCallback(creationCallback) 178 215 { 179 216 ASSERT(m_scriptExecutionContext.get()); … … 521 558 522 559 if (!m_sqliteDatabase.tableExists(databaseInfoTableName())) { 560 m_new = true; 561 523 562 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);")) { 524 563 LOG_ERROR("Unable to create table %s in database %s", databaseInfoTableName().ascii().data(), databaseDebugName().ascii().data()); … … 539 578 if (currentVersion.length()) { 540 579 LOG(StorageAPI, "Retrieved current version %s from database %s", currentVersion.ascii().data(), databaseDebugName().ascii().data()); 541 } else {580 } else if (!m_new || !m_creationCallback) { 542 581 LOG(StorageAPI, "Setting version %s in database %s that was just created", m_expectedVersion.ascii().data(), databaseDebugName().ascii().data()); 543 582 if (!setVersionInDatabase(m_expectedVersion)) { … … 562 601 // If the expected version isn't the empty string, ensure that the current database version we have matches that version. Otherwise, set an exception. 563 602 // 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) { 565 604 LOG(StorageAPI, "page expects version %s from database %s, which actually has version name %s - openDatabase() call will fail", m_expectedVersion.ascii().data(), 566 605 databaseDebugName().ascii().data(), currentVersion.ascii().data()); … … 686 725 } 687 726 727 void Database::performCreationCallback() 728 { 729 m_creationCallback->handleEvent(m_scriptExecutionContext.get(), this); 730 } 731 688 732 SQLTransactionClient* Database::transactionClient() const 689 733 { -
trunk/WebCore/storage/Database.h
r55635 r55823 52 52 53 53 class DatabaseAuthorizer; 54 class DatabaseCallback; 54 55 class DatabaseThread; 55 56 class ScriptExecutionContext; … … 74 75 75 76 // 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&); 77 81 String version() const; 78 82 void changeVersion(const String& oldVersion, const String& newVersion, … … 112 116 bool stopped() const { return m_stopped; } 113 117 118 bool isNew() const { return m_new; } 119 114 120 unsigned long long databaseSize() const; 115 121 unsigned long long maximumSize() const; … … 122 128 123 129 Vector<String> performGetTableNames(); 130 void performCreationCallback(); 124 131 125 132 SQLTransactionClient* transactionClient() const; … … 129 136 Database(ScriptExecutionContext* context, const String& name, 130 137 const String& expectedVersion, const String& displayName, 131 unsigned long estimatedSize );138 unsigned long estimatedSize, PassRefPtr<DatabaseCallback> creationCallback); 132 139 133 140 bool openAndVerifyVersion(ExceptionCode&); … … 160 167 bool m_opened; 161 168 169 bool m_new; 170 162 171 SQLiteDatabase m_sqliteDatabase; 163 172 RefPtr<DatabaseAuthorizer> m_databaseAuthorizer; 173 174 RefPtr<DatabaseCallback> m_creationCallback; 164 175 165 176 #ifndef NDEBUG -
trunk/WebCore/workers/WorkerContext.cpp
r55635 r55823 257 257 258 258 #if ENABLE(DATABASE) 259 PassRefPtr<Database> WorkerContext::openDatabase(const String& name, const String& version, const String& displayName, unsigned long estimatedSize, ExceptionCode& ec)259 PassRefPtr<Database> WorkerContext::openDatabase(const String& name, const String& version, const String& displayName, unsigned long estimatedSize, PassRefPtr<DatabaseCallback> creationCallback, ExceptionCode& ec) 260 260 { 261 261 if (!securityOrigin()->canAccessDatabase()) { … … 268 268 return 0; 269 269 270 return Database::openDatabase(this, name, version, displayName, estimatedSize, ec);270 return Database::openDatabase(this, name, version, displayName, estimatedSize, creationCallback, ec); 271 271 } 272 272 #endif -
trunk/WebCore/workers/WorkerContext.h
r55635 r55823 32 32 #include "AtomicStringHash.h" 33 33 #include "Database.h" 34 #include "DatabaseCallback.h" 34 35 #include "EventListener.h" 35 36 #include "EventNames.h" … … 107 108 #if ENABLE(DATABASE) 108 109 // 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&); 110 111 // Not implemented yet. 111 112 virtual bool isDatabaseReadOnly() const { return false; }
Note: See TracChangeset
for help on using the changeset viewer.