Changeset 55593 in webkit
- Timestamp:
- Mar 5, 2010 2:17:23 PM (14 years ago)
- Location:
- trunk
- Files:
-
- 9 added
- 23 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r55591 r55593 1 2010-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 1 25 2010-03-05 Brian Weinstein <bweinstein@apple.com> 2 26 -
trunk/LayoutTests/fast/frames/resources/sandboxed-iframe-storage-allowed.html
r51577 r55593 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
r51577 r55593 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
r51577 r55593 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/LayoutTests/platform/qt/Skipped
r55580 r55593 5096 5096 # Core functionality is tested in plugins/private-browsing-mode-2.html 5097 5097 plugins/private-browsing-mode.html 5098 5099 # Qt's DRT doesn't not seem to support the layoutTestController.evaluateScriptInIsolatedWorld() call. 5100 storage/open-database-creation-callback-isolated-world.html -
trunk/WebCore/Android.jscbindings.mk
r55485 r55593 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
r55485 r55593 109 109 bindings/v8/custom/V8DOMWindowCustom.cpp \ 110 110 bindings/v8/custom/V8DataGridColumnListCustom.cpp \ 111 bindings/v8/custom/V8DatabaseCallback.cpp \ 111 112 bindings/v8/custom/V8DatabaseCustom.cpp \ 112 113 bindings/v8/custom/V8DedicatedWorkerContextCustom.cpp \ -
trunk/WebCore/ChangeLog
r55592 r55593 1 2010-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 1 55 2010-03-05 Chris Marrin <cmarrin@apple.com> 2 56 -
trunk/WebCore/GNUmakefile.am
r55543 r55593 2231 2231 WebCore/bindings/js/JSCustomSQLTransactionErrorCallback.cpp \ 2232 2232 WebCore/bindings/js/JSCustomSQLTransactionErrorCallback.h \ 2233 WebCore/bindings/js/JSDatabaseCallback.cpp \ 2234 WebCore/bindings/js/JSDatabaseCallback.h \ 2233 2235 WebCore/bindings/js/JSDatabaseCustom.cpp \ 2234 2236 WebCore/bindings/js/JSSQLResultSetRowListCustom.cpp \ … … 2251 2253 WebCore/storage/DatabaseAuthorizer.cpp \ 2252 2254 WebCore/storage/DatabaseAuthorizer.h \ 2255 WebCore/storage/DatabaseCallback.h \ 2253 2256 WebCore/storage/DatabaseDetails.h \ 2254 2257 WebCore/storage/DatabaseTask.cpp \ -
trunk/WebCore/WebCore.gypi
r55590 r55593 704 704 'bindings/v8/custom/V8CustomXPathNSResolver.cpp', 705 705 'bindings/v8/custom/V8CustomXPathNSResolver.h', 706 'bindings/v8/custom/V8DatabaseCallback.cpp', 707 'bindings/v8/custom/V8DatabaseCallback.h', 706 708 'bindings/v8/custom/V8DatabaseCustom.cpp', 707 709 'bindings/v8/custom/V8DataGridColumnListCustom.cpp', … … 3222 3224 'storage/DatabaseAuthorizer.cpp', 3223 3225 'storage/DatabaseAuthorizer.h', 3226 'storage/DatabaseCallback.h', 3224 3227 'storage/DatabaseDetails.h', 3225 3228 'storage/DatabaseTask.cpp', -
trunk/WebCore/WebCore.pro
r55567 r55593 1013 1013 bindings/js/JSCustomVoidCallback.h \ 1014 1014 bindings/js/JSCustomXPathNSResolver.h \ 1015 bindings/js/JSDatabaseCallback.h \ 1015 1016 bindings/js/JSDataGridDataSource.h \ 1016 1017 bindings/js/JSDOMBinding.h \ … … 2222 2223 bindings/js/JSCustomSQLTransactionCallback.cpp \ 2223 2224 bindings/js/JSCustomSQLTransactionErrorCallback.cpp \ 2225 bindings/js/JSDatabaseCallback.cpp \ 2224 2226 bindings/js/JSDatabaseCustom.cpp \ 2225 2227 bindings/js/JSSQLResultSetRowListCustom.cpp \ … … 2232 2234 storage/DatabaseAuthorizer.h \ 2233 2235 storage/Database.h \ 2236 storage/DatabaseCallback.h \ 2234 2237 storage/DatabaseTask.h \ 2235 2238 storage/DatabaseThread.h \ -
trunk/WebCore/WebCore.vcproj/WebCore.vcproj
r55584 r55593 35369 35369 </File> 35370 35370 <File 35371 RelativePath="..\bindings\js\JSDatabaseCallback.cpp" 35372 > 35373 </File> 35374 <File 35375 RelativePath="..\bindings\js\JSDatabaseCallback.h" 35376 > 35377 </File> 35378 <File 35371 35379 RelativePath="..\bindings\js\JSDatabaseCustom.cpp" 35372 35380 > … … 42290 42298 </File> 42291 42299 <File 42300 RelativePath="..\storage\DatabaseCallback.h" 42301 > 42302 </File> 42303 <File 42292 42304 RelativePath="..\storage\DatabaseTask.cpp" 42293 42305 > -
trunk/WebCore/WebCore.xcodeproj/project.pbxproj
r55560 r55593 4121 4121 B5C1123B102B6C4600096578 /* SQLTransactionCoordinator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5C11239102B6C4600096578 /* SQLTransactionCoordinator.cpp */; }; 4122 4122 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 */; }; 4123 4126 B71FE6DF11091CB300DAEF77 /* PrintContext.h in Headers */ = {isa = PBXBuildFile; fileRef = B776D43A1104525D00BEB0EC /* PrintContext.h */; settings = {ATTRIBUTES = (Private, ); }; }; 4124 4127 B776D43D1104527500BEB0EC /* PrintContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B776D43C1104527500BEB0EC /* PrintContext.cpp */; }; … … 9386 9389 B5C11239102B6C4600096578 /* SQLTransactionCoordinator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SQLTransactionCoordinator.cpp; sourceTree = "<group>"; }; 9387 9390 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>"; }; 9388 9394 B776D43A1104525D00BEB0EC /* PrintContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PrintContext.h; sourceTree = "<group>"; }; 9389 9395 B776D43C1104527500BEB0EC /* PrintContext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PrintContext.cpp; sourceTree = "<group>"; }; … … 10579 10585 51A45B550CAD7FD7000D2BE9 /* DatabaseAuthorizer.cpp */, 10580 10586 51A45B540CAD7FD7000D2BE9 /* DatabaseAuthorizer.h */, 10587 B5D36019112F8B560048DEA8 /* DatabaseCallback.h */, 10581 10588 5116D9750CF177BD00C2B84D /* DatabaseDetails.h */, 10582 10589 519611E90CAC749C0010A80C /* DatabaseTask.cpp */, … … 14668 14675 1432E8480C51493F00B1500F /* GCController.cpp */, 14669 14676 1432E8460C51493800B1500F /* GCController.h */, 14677 B5D3601E112F8BA80048DEA8 /* JSDatabaseCallback.cpp */, 14678 B5D3601C112F8BA00048DEA8 /* JSDatabaseCallback.h */, 14670 14679 93B70D4709EB0C7C009D8468 /* JSDOMBinding.cpp */, 14671 14680 93B70D4809EB0C7C009D8468 /* JSDOMBinding.h */, … … 18617 18626 7637C543112E7B7E003D6CDC /* WebSocketHandshakeRequest.h in Headers */, 18618 18627 626CDE0F1140424C001E5A68 /* SpatialNavigation.h in Headers */, 18628 B5D3601A112F8B560048DEA8 /* DatabaseCallback.h in Headers */, 18629 B5D3601D112F8BA00048DEA8 /* JSDatabaseCallback.h in Headers */, 18619 18630 ); 18620 18631 runOnlyForDeploymentPostprocessing = 0; … … 20808 20819 7637C541112E7B74003D6CDC /* WebSocketHandshakeRequest.cpp in Sources */, 20809 20820 626CDE0E1140424C001E5A68 /* SpatialNavigation.cpp in Sources */, 20821 B5D3601F112F8BA80048DEA8 /* JSDatabaseCallback.cpp in Sources */, 20810 20822 ); 20811 20823 runOnlyForDeploymentPostprocessing = 0; -
trunk/WebCore/bindings/js/JSDOMWindowCustom.cpp
r55485 r55593 24 24 #include "Base64.h" 25 25 #include "Chrome.h" 26 #include "Database.h" 26 27 #include "DOMWindow.h" 27 28 #include "Document.h" … … 37 38 #include "History.h" 38 39 #include "JSAudioConstructor.h" 40 #include "JSDatabase.h" 41 #include "JSDatabaseCallback.h" 39 42 #include "JSDOMWindowShell.h" 40 43 #include "JSEvent.h" … … 1018 1021 } 1019 1022 1023 JSValue 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 1020 1041 DOMWindow* toDOMWindow(JSValue value) 1021 1042 { -
trunk/WebCore/bindings/v8/custom/V8DOMWindowCustom.cpp
r55586 r55593 56 56 #include "V8BindingState.h" 57 57 #include "V8CustomEventListener.h" 58 #include "V8Database.h" 59 #include "V8DatabaseCallback.h" 58 60 #include "V8GCForContextDispose.h" 59 61 #include "V8HTMLCollection.h" … … 807 809 } 808 810 811 v8::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 809 835 bool V8DOMWindow::namedSecurityCheck(v8::Local<v8::Object> host, v8::Local<v8::Value> key, v8::AccessType type, v8::Local<v8::Value> data) 810 836 { -
trunk/WebCore/dom/Document.cpp
r55584 r55593 4731 4731 void Document::postTask(PassOwnPtr<Task> task) 4732 4732 { 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)); 4739 4734 } 4740 4735 -
trunk/WebCore/page/DOMWindow.cpp
r55485 r55593 36 36 #include "Console.h" 37 37 #include "Database.h" 38 #include "DatabaseCallback.h" 38 39 #include "DOMApplicationCache.h" 39 40 #include "DOMSelection.h" … … 1126 1127 1127 1128 #if ENABLE(DATABASE) 1128 PassRefPtr<Database> DOMWindow::openDatabase(const String& name, const String& version, const String& displayName, unsigned long estimatedSize, ExceptionCode& ec)1129 PassRefPtr<Database> DOMWindow::openDatabase(const String& name, const String& version, const String& displayName, unsigned long estimatedSize, PassRefPtr<DatabaseCallback> creationCallback, ExceptionCode& ec) 1129 1130 { 1130 1131 if (!m_frame) … … 1138 1139 return 0; 1139 1140 1140 return Database::openDatabase(document, name, version, displayName, estimatedSize, ec);1141 return Database::openDatabase(document, name, version, displayName, estimatedSize, creationCallback, ec); 1141 1142 } 1142 1143 #endif -
trunk/WebCore/page/DOMWindow.h
r55485 r55593 46 46 class DOMSelection; 47 47 class Database; 48 class DatabaseCallback; 48 49 class Document; 49 50 class Element; … … 199 200 #if ENABLE(DATABASE) 200 201 // 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&); 202 203 #endif 203 204 -
trunk/WebCore/page/DOMWindow.idl
r55485 r55593 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
r55485 r55593 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
r55485 r55593 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
r55485 r55593 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
r55485 r55593 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.