Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(213)

Side by Side Diff: Source/WebCore/storage/SQLTransactionSync.cpp

Issue 7563014: Merge 92155 - [Chromium] WebSQLDatabase version handling is broken in multi-process browsers. (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/835/
Patch Set: Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « Source/WebCore/storage/SQLTransactionSync.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2010 Google Inc. All rights reserved. 2 * Copyright (C) 2010 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 51
52 PassRefPtr<SQLTransactionSync> SQLTransactionSync::create(DatabaseSync* db, Pass RefPtr<SQLTransactionSyncCallback> callback, bool readOnly) 52 PassRefPtr<SQLTransactionSync> SQLTransactionSync::create(DatabaseSync* db, Pass RefPtr<SQLTransactionSyncCallback> callback, bool readOnly)
53 { 53 {
54 return adoptRef(new SQLTransactionSync(db, callback, readOnly)); 54 return adoptRef(new SQLTransactionSync(db, callback, readOnly));
55 } 55 }
56 56
57 SQLTransactionSync::SQLTransactionSync(DatabaseSync* db, PassRefPtr<SQLTransacti onSyncCallback> callback, bool readOnly) 57 SQLTransactionSync::SQLTransactionSync(DatabaseSync* db, PassRefPtr<SQLTransacti onSyncCallback> callback, bool readOnly)
58 : m_database(db) 58 : m_database(db)
59 , m_callback(callback) 59 , m_callback(callback)
60 , m_readOnly(readOnly) 60 , m_readOnly(readOnly)
61 , m_hasVersionMismatch(false)
61 , m_modifiedDatabase(false) 62 , m_modifiedDatabase(false)
62 , m_transactionClient(adoptPtr(new SQLTransactionClient())) 63 , m_transactionClient(adoptPtr(new SQLTransactionClient()))
63 { 64 {
64 ASSERT(m_database->scriptExecutionContext()->isContextThread()); 65 ASSERT(m_database->scriptExecutionContext()->isContextThread());
65 } 66 }
66 67
67 SQLTransactionSync::~SQLTransactionSync() 68 SQLTransactionSync::~SQLTransactionSync()
68 { 69 {
69 ASSERT(m_database->scriptExecutionContext()->isContextThread()); 70 ASSERT(m_database->scriptExecutionContext()->isContextThread());
70 if (m_sqliteTransaction && m_sqliteTransaction->inProgress()) 71 if (m_sqliteTransaction && m_sqliteTransaction->inProgress())
71 rollback(); 72 rollback();
72 } 73 }
73 74
74 PassRefPtr<SQLResultSet> SQLTransactionSync::executeSQL(const String& sqlStateme nt, const Vector<SQLValue>& arguments, ExceptionCode& ec) 75 PassRefPtr<SQLResultSet> SQLTransactionSync::executeSQL(const String& sqlStateme nt, const Vector<SQLValue>& arguments, ExceptionCode& ec)
75 { 76 {
76 ASSERT(m_database->scriptExecutionContext()->isContextThread()); 77 ASSERT(m_database->scriptExecutionContext()->isContextThread());
77 if (!m_database->opened()) { 78 if (!m_database->opened()) {
78 ec = SQLException::UNKNOWN_ERR; 79 ec = SQLException::UNKNOWN_ERR;
79 return 0; 80 return 0;
80 } 81 }
81 82
82 if (!m_database->versionMatchesExpected()) { 83 if (m_hasVersionMismatch) {
83 ec = SQLException::VERSION_ERR; 84 ec = SQLException::VERSION_ERR;
84 return 0; 85 return 0;
85 } 86 }
86 87
87 if (sqlStatement.isEmpty()) 88 if (sqlStatement.isEmpty())
88 return 0; 89 return 0;
89 90
90 int permissions = DatabaseAuthorizer::ReadWriteMask; 91 int permissions = DatabaseAuthorizer::ReadWriteMask;
91 if (!m_database->scriptExecutionContext()->allowDatabaseAccess()) 92 if (!m_database->scriptExecutionContext()->allowDatabaseAccess())
92 permissions |= DatabaseAuthorizer::NoAccessMask; 93 permissions |= DatabaseAuthorizer::NoAccessMask;
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
143 m_sqliteTransaction->begin(); 144 m_sqliteTransaction->begin();
144 m_database->enableAuthorizer(); 145 m_database->enableAuthorizer();
145 146
146 // Check if begin() succeeded. 147 // Check if begin() succeeded.
147 if (!m_sqliteTransaction->inProgress()) { 148 if (!m_sqliteTransaction->inProgress()) {
148 ASSERT(!m_database->sqliteDatabase().transactionInProgress()); 149 ASSERT(!m_database->sqliteDatabase().transactionInProgress());
149 m_sqliteTransaction.clear(); 150 m_sqliteTransaction.clear();
150 return SQLException::DATABASE_ERR; 151 return SQLException::DATABASE_ERR;
151 } 152 }
152 153
154 // Note: We intentionally retrieve the actual version even with an empty exp ected version.
155 // In multi-process browsers, we take this opportinutiy to update the cached value for
156 // the actual version. In single-process browsers, this is just a map lookup .
157 String actualVersion;
158 if (!m_database->getActualVersionForTransaction(actualVersion)) {
159 rollback();
160 return SQLException::DATABASE_ERR;
161 }
162 m_hasVersionMismatch = !m_database->expectedVersion().isEmpty()
163 && (m_database->expectedVersion() != actualVersion);
153 return 0; 164 return 0;
154 } 165 }
155 166
156 ExceptionCode SQLTransactionSync::execute() 167 ExceptionCode SQLTransactionSync::execute()
157 { 168 {
158 ASSERT(m_database->scriptExecutionContext()->isContextThread()); 169 ASSERT(m_database->scriptExecutionContext()->isContextThread());
159 if (!m_database->opened() || (m_callback && !m_callback->handleEvent(this))) { 170 if (!m_database->opened() || (m_callback && !m_callback->handleEvent(this))) {
160 m_callback = 0; 171 m_callback = 0;
161 return SQLException::UNKNOWN_ERR; 172 return SQLException::UNKNOWN_ERR;
162 } 173 }
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
203 m_sqliteTransaction.clear(); 214 m_sqliteTransaction.clear();
204 } 215 }
205 m_database->enableAuthorizer(); 216 m_database->enableAuthorizer();
206 217
207 ASSERT(!m_database->sqliteDatabase().transactionInProgress()); 218 ASSERT(!m_database->sqliteDatabase().transactionInProgress());
208 } 219 }
209 220
210 } // namespace WebCore 221 } // namespace WebCore
211 222
212 #endif // ENABLE(DATABASE) 223 #endif // ENABLE(DATABASE)
OLDNEW
« no previous file with comments | « Source/WebCore/storage/SQLTransactionSync.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698