Changeset 70522 in webkit
- Timestamp:
- Oct 26, 2010 8:21:32 AM (14 years ago)
- Location:
- trunk
- Files:
-
- 4 added
- 1 deleted
- 17 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r70521 r70522 1 2010-10-26 Jeremy Orlow <jorlow@chromium.org> 2 3 Reviewed by Steve Block. 4 5 Quota for IndexedDB should be per origin not per database 6 https://bugs.webkit.org/show_bug.cgi?id=48064 7 8 Verify our backing database can handle multiple indexes, objectStores, 9 items in the index/object stores, etc within databases of different 10 names. 11 12 Also adjust the quota test so it doesn't fail with subtle differences 13 in the backing db (which can change the size a bit). 14 15 * storage/indexeddb/database-quota-expected.txt: 16 * storage/indexeddb/database-quota.html: 17 * storage/indexeddb/duplicates-expected.txt: Added. 18 * storage/indexeddb/duplicates.html: Added. 19 1 20 2010-10-26 Jeremy Orlow <jorlow@chromium.org> 2 21 -
trunk/LayoutTests/storage/indexeddb/database-quota-expected.txt
r69612 r70522 69 69 PASS data.length is 65536 70 70 store = trans.objectStore('test123') 71 store.add({x: data}, dataAdded)72 Success event fired:73 PASS 'result' in event is true74 PASS 'code' in event is false75 PASS 'message' in event is false76 PASS 'source' in event is true77 PASS event.source != null is true78 PASS 'onsuccess' in event.target is true79 PASS 'onerror' in event.target is true80 PASS 'readyState' in event.target is true81 PASS event.target.readyState is event.target.DONE82 83 store = event.source84 store.add({x: data}, dataAdded)85 Success event fired:86 PASS 'result' in event is true87 PASS 'code' in event is false88 PASS 'message' in event is false89 PASS 'source' in event is true90 PASS event.source != null is true91 PASS 'onsuccess' in event.target is true92 PASS 'onerror' in event.target is true93 PASS 'readyState' in event.target is true94 PASS event.target.readyState is event.target.DONE95 96 store = event.source97 store.add({x: data}, dataAdded)98 Success event fired:99 PASS 'result' in event is true100 PASS 'code' in event is false101 PASS 'message' in event is false102 PASS 'source' in event is true103 PASS event.source != null is true104 PASS 'onsuccess' in event.target is true105 PASS 'onerror' in event.target is true106 PASS 'readyState' in event.target is true107 PASS event.target.readyState is event.target.DONE108 109 store = event.source110 store.add({x: data}, dataAdded)111 Success event fired:112 PASS 'result' in event is true113 PASS 'code' in event is false114 PASS 'message' in event is false115 PASS 'source' in event is true116 PASS event.source != null is true117 PASS 'onsuccess' in event.target is true118 PASS 'onerror' in event.target is true119 PASS 'readyState' in event.target is true120 PASS event.target.readyState is event.target.DONE121 122 store = event.source123 store.add({x: data}, dataAdded)124 Success event fired:125 PASS 'result' in event is true126 PASS 'code' in event is false127 PASS 'message' in event is false128 PASS 'source' in event is true129 PASS event.source != null is true130 PASS 'onsuccess' in event.target is true131 PASS 'onerror' in event.target is true132 PASS 'readyState' in event.target is true133 PASS event.target.readyState is event.target.DONE134 135 store = event.source136 store.add({x: data}, dataAdded)137 Success event fired:138 PASS 'result' in event is true139 PASS 'code' in event is false140 PASS 'message' in event is false141 PASS 'source' in event is true142 PASS event.source != null is true143 PASS 'onsuccess' in event.target is true144 PASS 'onerror' in event.target is true145 PASS 'readyState' in event.target is true146 PASS event.target.readyState is event.target.DONE147 148 store = event.source149 store.add({x: data}, dataAdded)150 Success event fired:151 PASS 'result' in event is true152 PASS 'code' in event is false153 PASS 'message' in event is false154 PASS 'source' in event is true155 PASS event.source != null is true156 PASS 'onsuccess' in event.target is true157 PASS 'onerror' in event.target is true158 PASS 'readyState' in event.target is true159 PASS event.target.readyState is event.target.DONE160 161 store = event.source162 store.add({x: data}, dataAdded)163 Success event fired:164 PASS 'result' in event is true165 PASS 'code' in event is false166 PASS 'message' in event is false167 PASS 'source' in event is true168 PASS event.source != null is true169 PASS 'onsuccess' in event.target is true170 PASS 'onerror' in event.target is true171 PASS 'readyState' in event.target is true172 PASS event.target.readyState is event.target.DONE173 174 store = event.source175 store.add({x: data}, dataAdded)176 Success event fired:177 PASS 'result' in event is true178 PASS 'code' in event is false179 PASS 'message' in event is false180 PASS 'source' in event is true181 PASS event.source != null is true182 PASS 'onsuccess' in event.target is true183 PASS 'onerror' in event.target is true184 PASS 'readyState' in event.target is true185 PASS event.target.readyState is event.target.DONE186 187 store = event.source188 store.add({x: data}, dataAdded)189 Success event fired:190 PASS 'result' in event is true191 PASS 'code' in event is false192 PASS 'message' in event is false193 PASS 'source' in event is true194 PASS event.source != null is true195 PASS 'onsuccess' in event.target is true196 PASS 'onerror' in event.target is true197 PASS 'readyState' in event.target is true198 PASS event.target.readyState is event.target.DONE199 200 store = event.source201 store.add({x: data}, dataAdded)202 Success event fired:203 PASS 'result' in event is true204 PASS 'code' in event is false205 PASS 'message' in event is false206 PASS 'source' in event is true207 PASS event.source != null is true208 PASS 'onsuccess' in event.target is true209 PASS 'onerror' in event.target is true210 PASS 'readyState' in event.target is true211 PASS event.target.readyState is event.target.DONE212 213 store = event.source214 store.add({x: data}, dataAdded)215 Success event fired:216 PASS 'result' in event is true217 PASS 'code' in event is false218 PASS 'message' in event is false219 PASS 'source' in event is true220 PASS event.source != null is true221 PASS 'onsuccess' in event.target is true222 PASS 'onerror' in event.target is true223 PASS 'readyState' in event.target is true224 PASS event.target.readyState is event.target.DONE225 226 store = event.source227 store.add({x: data}, dataAdded)228 Success event fired:229 PASS 'result' in event is true230 PASS 'code' in event is false231 PASS 'message' in event is false232 PASS 'source' in event is true233 PASS event.source != null is true234 PASS 'onsuccess' in event.target is true235 PASS 'onerror' in event.target is true236 PASS 'readyState' in event.target is true237 PASS event.target.readyState is event.target.DONE238 239 store = event.source240 store.add({x: data}, dataAdded)241 Success event fired:242 PASS 'result' in event is true243 PASS 'code' in event is false244 PASS 'message' in event is false245 PASS 'source' in event is true246 PASS event.source != null is true247 PASS 'onsuccess' in event.target is true248 PASS 'onerror' in event.target is true249 PASS 'readyState' in event.target is true250 PASS event.target.readyState is event.target.DONE251 252 store = event.source253 store.add({x: data}, dataAdded)254 Success event fired:255 PASS 'result' in event is true256 PASS 'code' in event is false257 PASS 'message' in event is false258 PASS 'source' in event is true259 PASS event.source != null is true260 PASS 'onsuccess' in event.target is true261 PASS 'onerror' in event.target is true262 PASS 'readyState' in event.target is true263 PASS event.target.readyState is event.target.DONE264 265 store = event.source266 store.add({x: data}, dataAdded)267 Success event fired:268 PASS 'result' in event is true269 PASS 'code' in event is false270 PASS 'message' in event is false271 PASS 'source' in event is true272 PASS event.source != null is true273 PASS 'onsuccess' in event.target is true274 PASS 'onerror' in event.target is true275 PASS 'readyState' in event.target is true276 PASS event.target.readyState is event.target.DONE277 278 store = event.source279 store.add({x: data}, dataAdded)280 Success event fired:281 PASS 'result' in event is true282 PASS 'code' in event is false283 PASS 'message' in event is false284 PASS 'source' in event is true285 PASS event.source != null is true286 PASS 'onsuccess' in event.target is true287 PASS 'onerror' in event.target is true288 PASS 'readyState' in event.target is true289 PASS event.target.readyState is event.target.DONE290 291 store = event.source292 store.add({x: data}, dataAdded)293 Success event fired:294 PASS 'result' in event is true295 PASS 'code' in event is false296 PASS 'message' in event is false297 PASS 'source' in event is true298 PASS event.source != null is true299 PASS 'onsuccess' in event.target is true300 PASS 'onerror' in event.target is true301 PASS 'readyState' in event.target is true302 PASS event.target.readyState is event.target.DONE303 304 store = event.source305 store.add({x: data}, dataAdded)306 Success event fired:307 PASS 'result' in event is true308 PASS 'code' in event is false309 PASS 'message' in event is false310 PASS 'source' in event is true311 PASS event.source != null is true312 PASS 'onsuccess' in event.target is true313 PASS 'onerror' in event.target is true314 PASS 'readyState' in event.target is true315 PASS event.target.readyState is event.target.DONE316 317 store = event.source318 store.add({x: data}, dataAdded)319 Success event fired:320 PASS 'result' in event is true321 PASS 'code' in event is false322 PASS 'message' in event is false323 PASS 'source' in event is true324 PASS event.source != null is true325 PASS 'onsuccess' in event.target is true326 PASS 'onerror' in event.target is true327 PASS 'readyState' in event.target is true328 PASS event.target.readyState is event.target.DONE329 330 store = event.source331 store.add({x: data}, dataAdded)332 Success event fired:333 PASS 'result' in event is true334 PASS 'code' in event is false335 PASS 'message' in event is false336 PASS 'source' in event is true337 PASS event.source != null is true338 PASS 'onsuccess' in event.target is true339 PASS 'onerror' in event.target is true340 PASS 'readyState' in event.target is true341 PASS event.target.readyState is event.target.DONE342 343 store = event.source344 store.add({x: data}, dataAdded)345 Success event fired:346 PASS 'result' in event is true347 PASS 'code' in event is false348 PASS 'message' in event is false349 PASS 'source' in event is true350 PASS event.source != null is true351 PASS 'onsuccess' in event.target is true352 PASS 'onerror' in event.target is true353 PASS 'readyState' in event.target is true354 PASS event.target.readyState is event.target.DONE355 356 store = event.source357 store.add({x: data}, dataAdded)358 Success event fired:359 PASS 'result' in event is true360 PASS 'code' in event is false361 PASS 'message' in event is false362 PASS 'source' in event is true363 PASS event.source != null is true364 PASS 'onsuccess' in event.target is true365 PASS 'onerror' in event.target is true366 PASS 'readyState' in event.target is true367 PASS event.target.readyState is event.target.DONE368 369 store = event.source370 store.add({x: data}, dataAdded)371 Success event fired:372 PASS 'result' in event is true373 PASS 'code' in event is false374 PASS 'message' in event is false375 PASS 'source' in event is true376 PASS event.source != null is true377 PASS 'onsuccess' in event.target is true378 PASS 'onerror' in event.target is true379 PASS 'readyState' in event.target is true380 PASS event.target.readyState is event.target.DONE381 382 store = event.source383 store.add({x: data}, dataAdded)384 Success event fired:385 PASS 'result' in event is true386 PASS 'code' in event is false387 PASS 'message' in event is false388 PASS 'source' in event is true389 PASS event.source != null is true390 PASS 'onsuccess' in event.target is true391 PASS 'onerror' in event.target is true392 PASS 'readyState' in event.target is true393 PASS event.target.readyState is event.target.DONE394 395 store = event.source396 store.add({x: data}, dataAdded)397 Success event fired:398 PASS 'result' in event is true399 PASS 'code' in event is false400 PASS 'message' in event is false401 PASS 'source' in event is true402 PASS event.source != null is true403 PASS 'onsuccess' in event.target is true404 PASS 'onerror' in event.target is true405 PASS 'readyState' in event.target is true406 PASS event.target.readyState is event.target.DONE407 408 store = event.source409 store.add({x: data}, dataAdded)410 Success event fired:411 PASS 'result' in event is true412 PASS 'code' in event is false413 PASS 'message' in event is false414 PASS 'source' in event is true415 PASS event.source != null is true416 PASS 'onsuccess' in event.target is true417 PASS 'onerror' in event.target is true418 PASS 'readyState' in event.target is true419 PASS event.target.readyState is event.target.DONE420 421 store = event.source422 store.add({x: data}, dataAdded)423 Success event fired:424 PASS 'result' in event is true425 PASS 'code' in event is false426 PASS 'message' in event is false427 PASS 'source' in event is true428 PASS event.source != null is true429 PASS 'onsuccess' in event.target is true430 PASS 'onerror' in event.target is true431 PASS 'readyState' in event.target is true432 PASS event.target.readyState is event.target.DONE433 434 store = event.source435 store.add({x: data}, dataAdded)436 Success event fired:437 PASS 'result' in event is true438 PASS 'code' in event is false439 PASS 'message' in event is false440 PASS 'source' in event is true441 PASS event.source != null is true442 PASS 'onsuccess' in event.target is true443 PASS 'onerror' in event.target is true444 PASS 'readyState' in event.target is true445 PASS event.target.readyState is event.target.DONE446 447 store = event.source448 store.add({x: data}, dataAdded)449 Success event fired:450 PASS 'result' in event is true451 PASS 'code' in event is false452 PASS 'message' in event is false453 PASS 'source' in event is true454 PASS event.source != null is true455 PASS 'onsuccess' in event.target is true456 PASS 'onerror' in event.target is true457 PASS 'readyState' in event.target is true458 PASS event.target.readyState is event.target.DONE459 460 store = event.source461 store.add({x: data}, dataAdded)462 Success event fired:463 PASS 'result' in event is true464 PASS 'code' in event is false465 PASS 'message' in event is false466 PASS 'source' in event is true467 PASS event.source != null is true468 PASS 'onsuccess' in event.target is true469 PASS 'onerror' in event.target is true470 PASS 'readyState' in event.target is true471 PASS event.target.readyState is event.target.DONE472 473 store = event.source474 store.add({x: data}, dataAdded)475 Success event fired:476 PASS 'result' in event is true477 PASS 'code' in event is false478 PASS 'message' in event is false479 PASS 'source' in event is true480 PASS event.source != null is true481 PASS 'onsuccess' in event.target is true482 PASS 'onerror' in event.target is true483 PASS 'readyState' in event.target is true484 PASS event.target.readyState is event.target.DONE485 486 store = event.source487 store.add({x: data}, dataAdded)488 Success event fired:489 PASS 'result' in event is true490 PASS 'code' in event is false491 PASS 'message' in event is false492 PASS 'source' in event is true493 PASS event.source != null is true494 PASS 'onsuccess' in event.target is true495 PASS 'onerror' in event.target is true496 PASS 'readyState' in event.target is true497 PASS event.target.readyState is event.target.DONE498 499 store = event.source500 store.add({x: data}, dataAdded)501 Success event fired:502 PASS 'result' in event is true503 PASS 'code' in event is false504 PASS 'message' in event is false505 PASS 'source' in event is true506 PASS event.source != null is true507 PASS 'onsuccess' in event.target is true508 PASS 'onerror' in event.target is true509 PASS 'readyState' in event.target is true510 PASS event.target.readyState is event.target.DONE511 512 store = event.source513 store.add({x: data}, dataAdded)514 Success event fired:515 PASS 'result' in event is true516 PASS 'code' in event is false517 PASS 'message' in event is false518 PASS 'source' in event is true519 PASS event.source != null is true520 PASS 'onsuccess' in event.target is true521 PASS 'onerror' in event.target is true522 PASS 'readyState' in event.target is true523 PASS event.target.readyState is event.target.DONE524 525 store = event.source526 store.add({x: data}, dataAdded)527 Success event fired:528 PASS 'result' in event is true529 PASS 'code' in event is false530 PASS 'message' in event is false531 PASS 'source' in event is true532 PASS event.source != null is true533 PASS 'onsuccess' in event.target is true534 PASS 'onerror' in event.target is true535 PASS 'readyState' in event.target is true536 PASS event.target.readyState is event.target.DONE537 538 store = event.source539 store.add({x: data}, dataAdded)540 Success event fired:541 PASS 'result' in event is true542 PASS 'code' in event is false543 PASS 'message' in event is false544 PASS 'source' in event is true545 PASS event.source != null is true546 PASS 'onsuccess' in event.target is true547 PASS 'onerror' in event.target is true548 PASS 'readyState' in event.target is true549 PASS event.target.readyState is event.target.DONE550 551 store = event.source552 store.add({x: data}, dataAdded)553 Success event fired:554 PASS 'result' in event is true555 PASS 'code' in event is false556 PASS 'message' in event is false557 PASS 'source' in event is true558 PASS event.source != null is true559 PASS 'onsuccess' in event.target is true560 PASS 'onerror' in event.target is true561 PASS 'readyState' in event.target is true562 PASS event.target.readyState is event.target.DONE563 564 store = event.source565 store.add({x: data}, dataAdded)566 Success event fired:567 PASS 'result' in event is true568 PASS 'code' in event is false569 PASS 'message' in event is false570 PASS 'source' in event is true571 PASS event.source != null is true572 PASS 'onsuccess' in event.target is true573 PASS 'onerror' in event.target is true574 PASS 'readyState' in event.target is true575 PASS event.target.readyState is event.target.DONE576 577 store = event.source578 store.add({x: data}, dataAdded)579 Success event fired:580 PASS 'result' in event is true581 PASS 'code' in event is false582 PASS 'message' in event is false583 PASS 'source' in event is true584 PASS event.source != null is true585 PASS 'onsuccess' in event.target is true586 PASS 'onerror' in event.target is true587 PASS 'readyState' in event.target is true588 PASS event.target.readyState is event.target.DONE589 590 store = event.source591 store.add({x: data}, dataAdded)592 Success event fired:593 PASS 'result' in event is true594 PASS 'code' in event is false595 PASS 'message' in event is false596 PASS 'source' in event is true597 PASS event.source != null is true598 PASS 'onsuccess' in event.target is true599 PASS 'onerror' in event.target is true600 PASS 'readyState' in event.target is true601 PASS event.target.readyState is event.target.DONE602 603 store = event.source604 store.add({x: data}, dataAdded)605 Success event fired:606 PASS 'result' in event is true607 PASS 'code' in event is false608 PASS 'message' in event is false609 PASS 'source' in event is true610 PASS event.source != null is true611 PASS 'onsuccess' in event.target is true612 PASS 'onerror' in event.target is true613 PASS 'readyState' in event.target is true614 PASS event.target.readyState is event.target.DONE615 616 store = event.source617 store.add({x: data}, dataAdded)618 Success event fired:619 PASS 'result' in event is true620 PASS 'code' in event is false621 PASS 'message' in event is false622 PASS 'source' in event is true623 PASS event.source != null is true624 PASS 'onsuccess' in event.target is true625 PASS 'onerror' in event.target is true626 PASS 'readyState' in event.target is true627 PASS event.target.readyState is event.target.DONE628 629 store = event.source630 store.add({x: data}, dataAdded)631 Success event fired:632 PASS 'result' in event is true633 PASS 'code' in event is false634 PASS 'message' in event is false635 PASS 'source' in event is true636 PASS event.source != null is true637 PASS 'onsuccess' in event.target is true638 PASS 'onerror' in event.target is true639 PASS 'readyState' in event.target is true640 PASS event.target.readyState is event.target.DONE641 642 store = event.source643 store.add({x: data}, dataAdded)644 Success event fired:645 PASS 'result' in event is true646 PASS 'code' in event is false647 PASS 'message' in event is false648 PASS 'source' in event is true649 PASS event.source != null is true650 PASS 'onsuccess' in event.target is true651 PASS 'onerror' in event.target is true652 PASS 'readyState' in event.target is true653 PASS event.target.readyState is event.target.DONE654 655 store = event.source656 store.add({x: data}, dataAdded)657 Success event fired:658 PASS 'result' in event is true659 PASS 'code' in event is false660 PASS 'message' in event is false661 PASS 'source' in event is true662 PASS event.source != null is true663 PASS 'onsuccess' in event.target is true664 PASS 'onerror' in event.target is true665 PASS 'readyState' in event.target is true666 PASS event.target.readyState is event.target.DONE667 668 store = event.source669 store.add({x: data}, dataAdded)670 Success event fired:671 PASS 'result' in event is true672 PASS 'code' in event is false673 PASS 'message' in event is false674 PASS 'source' in event is true675 PASS event.source != null is true676 PASS 'onsuccess' in event.target is true677 PASS 'onerror' in event.target is true678 PASS 'readyState' in event.target is true679 PASS event.target.readyState is event.target.DONE680 681 store = event.source682 store.add({x: data}, dataAdded)683 Success event fired:684 PASS 'result' in event is true685 PASS 'code' in event is false686 PASS 'message' in event is false687 PASS 'source' in event is true688 PASS event.source != null is true689 PASS 'onsuccess' in event.target is true690 PASS 'onerror' in event.target is true691 PASS 'readyState' in event.target is true692 PASS event.target.readyState is event.target.DONE693 694 store = event.source695 store.add({x: data}, dataAdded)696 Success event fired:697 PASS 'result' in event is true698 PASS 'code' in event is false699 PASS 'message' in event is false700 PASS 'source' in event is true701 PASS event.source != null is true702 PASS 'onsuccess' in event.target is true703 PASS 'onerror' in event.target is true704 PASS 'readyState' in event.target is true705 PASS event.target.readyState is event.target.DONE706 707 store = event.source708 store.add({x: data}, dataAdded)709 Success event fired:710 PASS 'result' in event is true711 PASS 'code' in event is false712 PASS 'message' in event is false713 PASS 'source' in event is true714 PASS event.source != null is true715 PASS 'onsuccess' in event.target is true716 PASS 'onerror' in event.target is true717 PASS 'readyState' in event.target is true718 PASS event.target.readyState is event.target.DONE719 720 store = event.source721 store.add({x: data}, dataAdded)722 Success event fired:723 PASS 'result' in event is true724 PASS 'code' in event is false725 PASS 'message' in event is false726 PASS 'source' in event is true727 PASS event.source != null is true728 PASS 'onsuccess' in event.target is true729 PASS 'onerror' in event.target is true730 PASS 'readyState' in event.target is true731 PASS event.target.readyState is event.target.DONE732 733 store = event.source734 store.add({x: data}, dataAdded)735 Success event fired:736 PASS 'result' in event is true737 PASS 'code' in event is false738 PASS 'message' in event is false739 PASS 'source' in event is true740 PASS event.source != null is true741 PASS 'onsuccess' in event.target is true742 PASS 'onerror' in event.target is true743 PASS 'readyState' in event.target is true744 PASS event.target.readyState is event.target.DONE745 746 store = event.source747 store.add({x: data}, dataAdded)748 Success event fired:749 PASS 'result' in event is true750 PASS 'code' in event is false751 PASS 'message' in event is false752 PASS 'source' in event is true753 PASS event.source != null is true754 PASS 'onsuccess' in event.target is true755 PASS 'onerror' in event.target is true756 PASS 'readyState' in event.target is true757 PASS event.target.readyState is event.target.DONE758 759 store = event.source760 store.add({x: data}, dataAdded)761 Success event fired:762 PASS 'result' in event is true763 PASS 'code' in event is false764 PASS 'message' in event is false765 PASS 'source' in event is true766 PASS event.source != null is true767 PASS 'onsuccess' in event.target is true768 PASS 'onerror' in event.target is true769 PASS 'readyState' in event.target is true770 PASS event.target.readyState is event.target.DONE771 772 store = event.source773 store.add({x: data}, dataAdded)774 Success event fired:775 PASS 'result' in event is true776 PASS 'code' in event is false777 PASS 'message' in event is false778 PASS 'source' in event is true779 PASS event.source != null is true780 PASS 'onsuccess' in event.target is true781 PASS 'onerror' in event.target is true782 PASS 'readyState' in event.target is true783 PASS event.target.readyState is event.target.DONE784 785 store = event.source786 store.add({x: data}, dataAdded)787 Success event fired:788 PASS 'result' in event is true789 PASS 'code' in event is false790 PASS 'message' in event is false791 PASS 'source' in event is true792 PASS event.source != null is true793 PASS 'onsuccess' in event.target is true794 PASS 'onerror' in event.target is true795 PASS 'readyState' in event.target is true796 PASS event.target.readyState is event.target.DONE797 798 store = event.source799 store.add({x: data}, dataAdded)800 Success event fired:801 PASS 'result' in event is true802 PASS 'code' in event is false803 PASS 'message' in event is false804 PASS 'source' in event is true805 PASS event.source != null is true806 PASS 'onsuccess' in event.target is true807 PASS 'onerror' in event.target is true808 PASS 'readyState' in event.target is true809 PASS event.target.readyState is event.target.DONE810 811 store = event.source812 store.add({x: data}, dataAdded)813 Success event fired:814 PASS 'result' in event is true815 PASS 'code' in event is false816 PASS 'message' in event is false817 PASS 'source' in event is true818 PASS event.source != null is true819 PASS 'onsuccess' in event.target is true820 PASS 'onerror' in event.target is true821 PASS 'readyState' in event.target is true822 PASS event.target.readyState is event.target.DONE823 824 store = event.source825 store.add({x: data}, dataAdded)826 Success event fired:827 PASS 'result' in event is true828 PASS 'code' in event is false829 PASS 'message' in event is false830 PASS 'source' in event is true831 PASS event.source != null is true832 PASS 'onsuccess' in event.target is true833 PASS 'onerror' in event.target is true834 PASS 'readyState' in event.target is true835 PASS event.target.readyState is event.target.DONE836 837 store = event.source838 store.add({x: data}, dataAdded)839 Success event fired:840 PASS 'result' in event is true841 PASS 'code' in event is false842 PASS 'message' in event is false843 PASS 'source' in event is true844 PASS event.source != null is true845 PASS 'onsuccess' in event.target is true846 PASS 'onerror' in event.target is true847 PASS 'readyState' in event.target is true848 PASS event.target.readyState is event.target.DONE849 850 store = event.source851 store.add({x: data}, dataAdded)852 Success event fired:853 PASS 'result' in event is true854 PASS 'code' in event is false855 PASS 'message' in event is false856 PASS 'source' in event is true857 PASS event.source != null is true858 PASS 'onsuccess' in event.target is true859 PASS 'onerror' in event.target is true860 PASS 'readyState' in event.target is true861 PASS event.target.readyState is event.target.DONE862 863 store = event.source864 store.add({x: data}, dataAdded)865 Success event fired:866 PASS 'result' in event is true867 PASS 'code' in event is false868 PASS 'message' in event is false869 PASS 'source' in event is true870 PASS event.source != null is true871 PASS 'onsuccess' in event.target is true872 PASS 'onerror' in event.target is true873 PASS 'readyState' in event.target is true874 PASS event.target.readyState is event.target.DONE875 876 store = event.source877 store.add({x: data}, dataAdded)878 Success event fired:879 PASS 'result' in event is true880 PASS 'code' in event is false881 PASS 'message' in event is false882 PASS 'source' in event is true883 PASS event.source != null is true884 PASS 'onsuccess' in event.target is true885 PASS 'onerror' in event.target is true886 PASS 'readyState' in event.target is true887 PASS event.target.readyState is event.target.DONE888 889 store = event.source890 store.add({x: data}, dataAdded)891 Success event fired:892 PASS 'result' in event is true893 PASS 'code' in event is false894 PASS 'message' in event is false895 PASS 'source' in event is true896 PASS event.source != null is true897 PASS 'onsuccess' in event.target is true898 PASS 'onerror' in event.target is true899 PASS 'readyState' in event.target is true900 PASS event.target.readyState is event.target.DONE901 902 store = event.source903 store.add({x: data}, dataAdded)904 Success event fired:905 PASS 'result' in event is true906 PASS 'code' in event is false907 PASS 'message' in event is false908 PASS 'source' in event is true909 PASS event.source != null is true910 PASS 'onsuccess' in event.target is true911 PASS 'onerror' in event.target is true912 PASS 'readyState' in event.target is true913 PASS event.target.readyState is event.target.DONE914 915 store = event.source916 store.add({x: data}, dataAdded)917 Success event fired:918 PASS 'result' in event is true919 PASS 'code' in event is false920 PASS 'message' in event is false921 PASS 'source' in event is true922 PASS event.source != null is true923 PASS 'onsuccess' in event.target is true924 PASS 'onerror' in event.target is true925 PASS 'readyState' in event.target is true926 PASS event.target.readyState is event.target.DONE927 928 store = event.source929 store.add({x: data}, dataAdded)930 Success event fired:931 PASS 'result' in event is true932 PASS 'code' in event is false933 PASS 'message' in event is false934 PASS 'source' in event is true935 PASS event.source != null is true936 PASS 'onsuccess' in event.target is true937 PASS 'onerror' in event.target is true938 PASS 'readyState' in event.target is true939 PASS event.target.readyState is event.target.DONE940 941 store = event.source942 store.add({x: data}, dataAdded)943 Success event fired:944 PASS 'result' in event is true945 PASS 'code' in event is false946 PASS 'message' in event is false947 PASS 'source' in event is true948 PASS event.source != null is true949 PASS 'onsuccess' in event.target is true950 PASS 'onerror' in event.target is true951 PASS 'readyState' in event.target is true952 PASS event.target.readyState is event.target.DONE953 954 store = event.source955 store.add({x: data}, dataAdded)956 Success event fired:957 PASS 'result' in event is true958 PASS 'code' in event is false959 PASS 'message' in event is false960 PASS 'source' in event is true961 PASS event.source != null is true962 PASS 'onsuccess' in event.target is true963 PASS 'onerror' in event.target is true964 PASS 'readyState' in event.target is true965 PASS event.target.readyState is event.target.DONE966 967 store = event.source968 store.add({x: data}, dataAdded)969 Success event fired:970 PASS 'result' in event is true971 PASS 'code' in event is false972 PASS 'message' in event is false973 PASS 'source' in event is true974 PASS event.source != null is true975 PASS 'onsuccess' in event.target is true976 PASS 'onerror' in event.target is true977 PASS 'readyState' in event.target is true978 PASS event.target.readyState is event.target.DONE979 980 store = event.source981 store.add({x: data}, dataAdded)982 Success event fired:983 PASS 'result' in event is true984 PASS 'code' in event is false985 PASS 'message' in event is false986 PASS 'source' in event is true987 PASS event.source != null is true988 PASS 'onsuccess' in event.target is true989 PASS 'onerror' in event.target is true990 PASS 'readyState' in event.target is true991 PASS event.target.readyState is event.target.DONE992 993 store = event.source994 store.add({x: data}, dataAdded)995 Success event fired:996 PASS 'result' in event is true997 PASS 'code' in event is false998 PASS 'message' in event is false999 PASS 'source' in event is true1000 PASS event.source != null is true1001 PASS 'onsuccess' in event.target is true1002 PASS 'onerror' in event.target is true1003 PASS 'readyState' in event.target is true1004 PASS event.target.readyState is event.target.DONE1005 1006 store = event.source1007 store.add({x: data}, dataAdded)1008 Success event fired:1009 PASS 'result' in event is true1010 PASS 'code' in event is false1011 PASS 'message' in event is false1012 PASS 'source' in event is true1013 PASS event.source != null is true1014 PASS 'onsuccess' in event.target is true1015 PASS 'onerror' in event.target is true1016 PASS 'readyState' in event.target is true1017 PASS event.target.readyState is event.target.DONE1018 1019 store = event.source1020 store.add({x: data}, dataAdded)1021 Success event fired:1022 PASS 'result' in event is true1023 PASS 'code' in event is false1024 PASS 'message' in event is false1025 PASS 'source' in event is true1026 PASS event.source != null is true1027 PASS 'onsuccess' in event.target is true1028 PASS 'onerror' in event.target is true1029 PASS 'readyState' in event.target is true1030 PASS event.target.readyState is event.target.DONE1031 1032 store = event.source1033 store.add({x: data}, dataAdded)1034 Success event fired:1035 PASS 'result' in event is true1036 PASS 'code' in event is false1037 PASS 'message' in event is false1038 PASS 'source' in event is true1039 PASS event.source != null is true1040 PASS 'onsuccess' in event.target is true1041 PASS 'onerror' in event.target is true1042 PASS 'readyState' in event.target is true1043 PASS event.target.readyState is event.target.DONE1044 1045 store = event.source1046 store.add({x: data}, dataAdded)1047 Success event fired:1048 PASS 'result' in event is true1049 PASS 'code' in event is false1050 PASS 'message' in event is false1051 PASS 'source' in event is true1052 PASS event.source != null is true1053 PASS 'onsuccess' in event.target is true1054 PASS 'onerror' in event.target is true1055 PASS 'readyState' in event.target is true1056 PASS event.target.readyState is event.target.DONE1057 1058 store = event.source1059 store.add({x: data}, dataAdded)1060 Success event fired:1061 PASS 'result' in event is true1062 PASS 'code' in event is false1063 PASS 'message' in event is false1064 PASS 'source' in event is true1065 PASS event.source != null is true1066 PASS 'onsuccess' in event.target is true1067 PASS 'onerror' in event.target is true1068 PASS 'readyState' in event.target is true1069 PASS event.target.readyState is event.target.DONE1070 1071 store = event.source1072 store.add({x: data}, dataAdded)1073 Success event fired:1074 PASS 'result' in event is true1075 PASS 'code' in event is false1076 PASS 'message' in event is false1077 PASS 'source' in event is true1078 PASS event.source != null is true1079 PASS 'onsuccess' in event.target is true1080 PASS 'onerror' in event.target is true1081 PASS 'readyState' in event.target is true1082 PASS event.target.readyState is event.target.DONE1083 1084 store = event.source1085 store.add({x: data}, dataAdded)1086 Success event fired:1087 PASS 'result' in event is true1088 PASS 'code' in event is false1089 PASS 'message' in event is false1090 PASS 'source' in event is true1091 PASS event.source != null is true1092 PASS 'onsuccess' in event.target is true1093 PASS 'onerror' in event.target is true1094 PASS 'readyState' in event.target is true1095 PASS event.target.readyState is event.target.DONE1096 1097 store = event.source1098 store.add({x: data}, dataAdded)1099 71 Error function called: (0) Error writing data to stable storage. 1100 72 Error event fired: … … 1109 81 PASS event.target.readyState is event.target.DONE 1110 82 1111 PASS Adding data failed due to quota error. Data added was : 5120 KB83 PASS Adding data failed due to quota error. Data added was about 5 MB 1112 84 PASS successfullyParsed is true 1113 85 -
trunk/LayoutTests/storage/indexeddb/database-quota.html
r69612 r70522 91 91 { 92 92 if (dataAdded < 5 * 1024 * 1024) { 93 if (dataAdded > 0) { 94 verifySuccessEvent(event); 95 store = evalAndLog("store = event.source"); 96 } 93 if (dataAdded > 0) 94 store = event.source; 97 95 } else { 98 96 testFailed("added more than quota"); … … 101 99 } 102 100 dataAdded += 65536; 103 result = evalAndLog("store.add({x: data}, dataAdded)");101 result = store.add({x: data}, dataAdded); 104 102 result.onsuccess = addData; 105 103 result.onerror = logError; … … 114 112 function testComplete() 115 113 { 116 testPassed("Adding data failed due to quota error. Data added was : " + dataAdded / 1024 + " KB");114 testPassed("Adding data failed due to quota error. Data added was about " + Math.round(dataAdded / 1024 / 1024) + " MB"); 117 115 done(); 118 116 } -
trunk/WebCore/ChangeLog
r70519 r70522 1 2010-10-26 Jeremy Orlow <jorlow@chromium.org> 2 3 Reviewed by Steve Block. 4 5 Quota for IndexedDB should be per origin not per database 6 https://bugs.webkit.org/show_bug.cgi?id=48064 7 8 Merge all databases for each origin into a single SQLiteDatabase. 9 10 Replace the awkward metaData table with a Database table. 11 12 Create a new IDBSQLiteDatabase class that wraps SQLiteDatabase 13 and implements weak pointer semantics for IDBFactory. It's ref 14 counted so multiple IDBDatabaseBackendImpls can share one. 15 16 Fix uniqueness constraints that were overly conservitive. 17 18 Get rid of the code that blows away existing data every time 19 the database is opened. 20 21 Get rid of the fairly useless indexedDB manual test and replace 22 it with one that verifies data persists. 23 24 Use name+origin (not just name) in our cache of IDBDatabaseBackend 25 objects (so one origin can't access anothers' data). 26 27 Test: storage/indexeddb/duplicates.html 28 29 * WebCore.gypi: 30 * manual-tests/indexed-database.html: Removed. 31 * manual-tests/indexeddb-persists.html: Added. 32 * storage/IDBDatabaseBackendImpl.cpp: 33 (WebCore::extractMetaData): 34 (WebCore::setMetaData): 35 (WebCore::IDBDatabaseBackendImpl::IDBDatabaseBackendImpl): 36 (WebCore::IDBDatabaseBackendImpl::setDescription): 37 (WebCore::IDBDatabaseBackendImpl::sqliteDatabase): 38 (WebCore::IDBDatabaseBackendImpl::createObjectStoreInternal): 39 (WebCore::IDBDatabaseBackendImpl::setVersionInternal): 40 (WebCore::IDBDatabaseBackendImpl::loadObjectStores): 41 * storage/IDBDatabaseBackendImpl.h: 42 (WebCore::IDBDatabaseBackendImpl::create): 43 (WebCore::IDBDatabaseBackendImpl::id): 44 * storage/IDBFactoryBackendImpl.cpp: 45 (WebCore::IDBFactoryBackendImpl::removeSQLiteDatabase): 46 (WebCore::openSQLiteDatabase): 47 (WebCore::createTables): 48 (WebCore::IDBFactoryBackendImpl::open): 49 (WebCore::IDBFactoryBackendImpl::databaseFileName): 50 * storage/IDBFactoryBackendImpl.h: 51 * storage/IDBObjectStoreBackendImpl.cpp: 52 (WebCore::putObjectStoreData): 53 (WebCore::IDBObjectStoreBackendImpl::putInternal): 54 * storage/IDBSQLiteDatabase.cpp: Added. 55 (WebCore::IDBSQLiteDatabase::IDBSQLiteDatabase): 56 (WebCore::IDBSQLiteDatabase::~IDBSQLiteDatabase): 57 * storage/IDBSQLiteDatabase.h: Added. 58 (WebCore::IDBSQLiteDatabase::create): 59 (WebCore::IDBSQLiteDatabase::db): 60 1 61 2010-10-20 Andrey Kosyakov <caseq@chromium.org> 2 62 -
trunk/WebCore/WebCore.gypi
r70511 r70522 3853 3853 'storage/IDBRequest.cpp', 3854 3854 'storage/IDBRequest.h', 3855 'storage/IDBSQLiteDatabase.cpp', 3856 'storage/IDBSQLiteDatabase.h', 3855 3857 'storage/IDBSuccessEvent.cpp', 3856 3858 'storage/IDBSuccessEvent.h', -
trunk/WebCore/storage/IDBDatabaseBackendImpl.cpp
r69974 r70522 33 33 #include "IDBDatabaseException.h" 34 34 #include "IDBObjectStoreBackendImpl.h" 35 #include "IDBSQLiteDatabase.h" 35 36 #include "IDBTransactionBackendInterface.h" 36 37 #include "IDBTransactionCoordinator.h" 37 #include "SQLiteDatabase.h"38 38 #include "SQLiteStatement.h" 39 39 #include "SQLiteTransaction.h" … … 41 41 namespace WebCore { 42 42 43 static bool extractMetaData(SQLiteDatabase* sqliteDatabase, const String& expectedName, String& foundVersion) 44 { 45 SQLiteStatement metaDataQuery(*sqliteDatabase, "SELECT name, version FROM MetaData"); 46 if (metaDataQuery.prepare() != SQLResultOk || metaDataQuery.step() != SQLResultRow) 47 return false; 48 49 if (metaDataQuery.getColumnText(0) != expectedName) { 50 LOG_ERROR("Name in MetaData (%s) doesn't match expected (%s) for IndexedDB", metaDataQuery.getColumnText(0).utf8().data(), expectedName.utf8().data()); 43 static bool extractMetaData(SQLiteDatabase& sqliteDatabase, const String& name, String& foundVersion, int64& foundId) 44 { 45 SQLiteStatement databaseQuery(sqliteDatabase, "SELECT id, version FROM Databases WHERE name = ?"); 46 if (databaseQuery.prepare() != SQLResultOk) { 51 47 ASSERT_NOT_REACHED(); 52 } 53 foundVersion = metaDataQuery.getColumnText(1); 54 55 if (metaDataQuery.step() == SQLResultRow) { 56 LOG_ERROR("More than one row found in MetaData table"); 48 return false; 49 } 50 databaseQuery.bindText(1, name); 51 if (databaseQuery.step() != SQLResultRow) 52 return false; 53 54 foundId = databaseQuery.getColumnInt64(0); 55 foundVersion = databaseQuery.getColumnText(1); 56 57 if (databaseQuery.step() == SQLResultRow) 57 58 ASSERT_NOT_REACHED(); 58 }59 60 59 return true; 61 60 } 62 61 63 static bool setMetaData(SQLiteDatabase* sqliteDatabase, const String& name, const String& description, const String& version) 64 { 65 ASSERT(!name.isNull() && !description.isNull() && !version.isNull()); 66 67 sqliteDatabase->executeCommand("DELETE FROM MetaData"); 68 69 SQLiteStatement insert(*sqliteDatabase, "INSERT INTO MetaData (name, description, version) VALUES (?, ?, ?)"); 70 if (insert.prepare() != SQLResultOk) { 71 LOG_ERROR("Failed to prepare MetaData insert statement for IndexedDB"); 72 return false; 73 } 74 75 insert.bindText(1, name); 76 insert.bindText(2, description); 77 insert.bindText(3, version); 78 79 if (insert.step() != SQLResultDone) { 80 LOG_ERROR("Failed to insert row into MetaData for IndexedDB"); 81 return false; 82 } 62 static bool setMetaData(SQLiteDatabase& sqliteDatabase, const String& name, const String& description, const String& version, int64_t& rowId) 63 { 64 ASSERT(!name.isNull()); 65 ASSERT(!description.isNull()); 66 ASSERT(!version.isNull()); 67 68 String sql = rowId != IDBDatabaseBackendImpl::InvalidId ? "UPDATE Databases SET name = ?, description = ?, version = ? WHERE id = ?" 69 : "INSERT INTO Databases (name, description, version) VALUES (?, ?, ?)"; 70 SQLiteStatement query(sqliteDatabase, sql); 71 if (query.prepare() != SQLResultOk) { 72 ASSERT_NOT_REACHED(); 73 return false; 74 } 75 76 query.bindText(1, name); 77 query.bindText(2, description); 78 query.bindText(3, version); 79 if (rowId != IDBDatabaseBackendImpl::InvalidId) 80 query.bindInt64(4, rowId); 81 82 if (query.step() != SQLResultDone) 83 return false; 84 85 if (rowId == IDBDatabaseBackendImpl::InvalidId) 86 rowId = sqliteDatabase.lastInsertRowID(); 83 87 84 88 return true; 85 89 } 86 90 87 IDBDatabaseBackendImpl::IDBDatabaseBackendImpl(const String& name, const String& description, PassOwnPtr<SQLiteDatabase>sqliteDatabase, IDBTransactionCoordinator* coordinator)91 IDBDatabaseBackendImpl::IDBDatabaseBackendImpl(const String& name, const String& description, IDBSQLiteDatabase* sqliteDatabase, IDBTransactionCoordinator* coordinator) 88 92 : m_sqliteDatabase(sqliteDatabase) 93 , m_id(InvalidId) 89 94 , m_name(name) 90 95 , m_description(description) … … 95 100 ASSERT(!m_description.isNull()); 96 101 97 extractMetaData(m_sqliteDatabase.get(), m_name, m_version); 98 setMetaData(m_sqliteDatabase.get(), m_name, m_description, m_version); 99 102 bool success = extractMetaData(m_sqliteDatabase->db(), m_name, m_version, m_id); 103 ASSERT_UNUSED(success, success == (m_id != InvalidId)); 104 if (!setMetaData(m_sqliteDatabase->db(), m_name, m_description, m_version, m_id)) 105 ASSERT_NOT_REACHED(); // FIXME: Need better error handling. 100 106 loadObjectStores(); 101 107 } … … 111 117 112 118 m_description = description; 113 setMetaData(m_sqliteDatabase.get(), m_name, m_description, m_version); 119 setMetaData(m_sqliteDatabase->db(), m_name, m_description, m_version, m_id); 120 } 121 122 SQLiteDatabase& IDBDatabaseBackendImpl::sqliteDatabase() const 123 { 124 return m_sqliteDatabase->db(); 114 125 } 115 126 … … 145 156 void IDBDatabaseBackendImpl::createObjectStoreInternal(ScriptExecutionContext*, PassRefPtr<IDBDatabaseBackendImpl> database, PassRefPtr<IDBObjectStoreBackendImpl> objectStore, PassRefPtr<IDBTransactionBackendInterface> transaction) 146 157 { 147 SQLiteStatement insert(database->sqliteDatabase(), "INSERT INTO ObjectStores (name, keyPath, doAutoIncrement ) VALUES (?, ?, ?)");158 SQLiteStatement insert(database->sqliteDatabase(), "INSERT INTO ObjectStores (name, keyPath, doAutoIncrement, databaseId) VALUES (?, ?, ?, ?)"); 148 159 if (insert.prepare() != SQLResultOk) { 149 160 transaction->abort(); … … 153 164 insert.bindText(2, objectStore->keyPath()); 154 165 insert.bindInt(3, static_cast<int>(objectStore->autoIncrement())); 166 insert.bindInt64(4, database->id()); 155 167 if (insert.step() != SQLResultDone) { 156 168 transaction->abort(); … … 218 230 void IDBDatabaseBackendImpl::setVersionInternal(ScriptExecutionContext*, PassRefPtr<IDBDatabaseBackendImpl> database, const String& version, PassRefPtr<IDBCallbacks> callbacks, PassRefPtr<IDBTransactionBackendInterface> transaction) 219 231 { 232 int64_t databaseId = database->id(); 220 233 database->m_version = version; 221 if (!setMetaData(database->m_sqliteDatabase .get(), database->m_name, database->m_description, database->m_version)) {234 if (!setMetaData(database->m_sqliteDatabase->db(), database->m_name, database->m_description, database->m_version, databaseId)) { 222 235 // FIXME: The Indexed Database specification does not have an error code dedicated to I/O errors. 223 236 callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UNKNOWN_ERR, "Error writing data to stable storage.")); … … 241 254 void IDBDatabaseBackendImpl::loadObjectStores() 242 255 { 243 SQLiteStatement objectStoresQuery(sqliteDatabase(), "SELECT id, name, keyPath, doAutoIncrement FROM ObjectStores ");256 SQLiteStatement objectStoresQuery(sqliteDatabase(), "SELECT id, name, keyPath, doAutoIncrement FROM ObjectStores WHERE databaseId = ?"); 244 257 bool ok = objectStoresQuery.prepare() == SQLResultOk; 245 258 ASSERT_UNUSED(ok, ok); // FIXME: Better error handling? 259 260 objectStoresQuery.bindInt64(1, m_id); 246 261 247 262 while (objectStoresQuery.step() == SQLResultRow) { -
trunk/WebCore/storage/IDBDatabaseBackendImpl.h
r69721 r70522 37 37 38 38 class IDBObjectStoreBackendImpl; 39 class IDBSQLiteDatabase; 39 40 class IDBTransactionCoordinator; 40 41 class SQLiteDatabase; … … 42 43 class IDBDatabaseBackendImpl : public IDBDatabaseBackendInterface { 43 44 public: 44 static PassRefPtr<IDBDatabaseBackendImpl> create(const String& name, const String& description, PassOwnPtr<SQLiteDatabase>database, IDBTransactionCoordinator* coordinator)45 static PassRefPtr<IDBDatabaseBackendImpl> create(const String& name, const String& description, IDBSQLiteDatabase* database, IDBTransactionCoordinator* coordinator) 45 46 { 46 47 return adoptRef(new IDBDatabaseBackendImpl(name, description, database, coordinator)); … … 49 50 50 51 void setDescription(const String& description); 51 SQLiteDatabase& sqliteDatabase() const { return *m_sqliteDatabase.get(); } 52 SQLiteDatabase& sqliteDatabase() const; 53 54 static const int64_t InvalidId = 0; 55 int64_t id() const { return m_id; } 52 56 53 57 virtual String name() const { return m_name; } … … 66 70 67 71 private: 68 IDBDatabaseBackendImpl(const String& name, const String& description, PassOwnPtr<SQLiteDatabase>database, IDBTransactionCoordinator*);72 IDBDatabaseBackendImpl(const String& name, const String& description, IDBSQLiteDatabase* database, IDBTransactionCoordinator*); 69 73 70 74 void loadObjectStores(); … … 79 83 static void resetVersion(ScriptExecutionContext*, PassRefPtr<IDBDatabaseBackendImpl>, const String& version); 80 84 81 OwnPtr<SQLiteDatabase> m_sqliteDatabase; 85 RefPtr<IDBSQLiteDatabase> m_sqliteDatabase; 86 int64 m_id; 82 87 String m_name; 83 88 String m_description; -
trunk/WebCore/storage/IDBFactoryBackendImpl.cpp
r70093 r70522 34 34 #include "IDBDatabaseBackendImpl.h" 35 35 #include "IDBDatabaseException.h" 36 #include "IDBSQLiteDatabase.h" 36 37 #include "IDBTransactionCoordinator.h" 37 #include "SQLiteDatabase.h"38 38 #include "SecurityOrigin.h" 39 39 #include <wtf/Threading.h> … … 53 53 } 54 54 55 static PassOwnPtr<SQLiteDatabase> openSQLiteDatabase(SecurityOrigin* securityOrigin, String name, const String& pathBase, int64_t maximumSize) 55 void IDBFactoryBackendImpl::removeSQLiteDatabase(const String& filePath) 56 { 57 ASSERT(m_sqliteDatabaseMap.contains(filePath)); 58 m_sqliteDatabaseMap.remove(filePath); 59 } 60 61 static PassRefPtr<IDBSQLiteDatabase> openSQLiteDatabase(SecurityOrigin* securityOrigin, const String& pathBase, int64_t maximumSize, const String& fileIdentifier, IDBFactoryBackendImpl* factory) 56 62 { 57 63 String path = ":memory:"; … … 63 69 } 64 70 65 path = pathByAppendingComponent(pathBase, IDBFactoryBackendImpl::databaseFileName( name,securityOrigin));71 path = pathByAppendingComponent(pathBase, IDBFactoryBackendImpl::databaseFileName(securityOrigin)); 66 72 } 67 73 68 OwnPtr<SQLiteDatabase> sqliteDatabase = adoptPtr(new SQLiteDatabase());69 if (!sqliteDatabase-> open(path)) {74 RefPtr<IDBSQLiteDatabase> sqliteDatabase = IDBSQLiteDatabase::create(fileIdentifier, factory); 75 if (!sqliteDatabase->db().open(path)) { 70 76 // FIXME: Is there any other thing we could possibly do to recover at this point? If so, do it rather than just erroring out. 71 77 LOG_ERROR("Failed to open database file %s for IndexedDB", path.utf8().data()); … … 73 79 } 74 80 75 sqliteDatabase->setMaximumSize(maximumSize); 81 // FIXME: Error checking? 82 sqliteDatabase->db().setMaximumSize(maximumSize); 83 sqliteDatabase->db().turnOnIncrementalAutoVacuum(); 84 76 85 return sqliteDatabase.release(); 77 86 } 78 87 79 static bool createTables(SQLiteDatabase *sqliteDatabase)88 static bool createTables(SQLiteDatabase& sqliteDatabase) 80 89 { 81 // FIXME: Remove all the drop table commands once the on disk structure stabilizes.82 90 static const char* commands[] = { 83 " DROP TABLE IF EXISTS MetaData",84 "CREATE TABLE IF NOT EXISTS MetaData (id INTEGER PRIMARY KEY, name TEXT NOT NULL, description TEXT NOT NULL, version TEXT NOT NULL)",91 "CREATE TABLE IF NOT EXISTS Databases (id INTEGER PRIMARY KEY, name TEXT NOT NULL, description TEXT NOT NULL, version TEXT NOT NULL)", 92 "CREATE UNIQUE INDEX IF NOT EXISTS Databases_name ON Databases(name)", 85 93 86 "DROP TABLE IF EXISTS ObjectStores", 87 "CREATE TABLE IF NOT EXISTS ObjectStores (id INTEGER PRIMARY KEY, name TEXT NOT NULL UNIQUE, keyPath TEXT, doAutoIncrement INTEGER NOT NULL)", 88 "DROP INDEX IF EXISTS ObjectStores_name", 89 "CREATE UNIQUE INDEX IF NOT EXISTS ObjectStores_name ON ObjectStores(name)", 94 "CREATE TABLE IF NOT EXISTS ObjectStores (id INTEGER PRIMARY KEY, name TEXT NOT NULL, keyPath TEXT, doAutoIncrement INTEGER NOT NULL, databaseId INTEGER NOT NULL REFERENCES Databases(id))", 95 "CREATE UNIQUE INDEX IF NOT EXISTS ObjectStores_composit ON ObjectStores(databaseId, name)", 90 96 91 "DROP TABLE IF EXISTS Indexes", 92 "CREATE TABLE IF NOT EXISTS Indexes (id INTEGER PRIMARY KEY, objectStoreId INTEGER NOT NULL REFERENCES ObjectStore(id), name TEXT NOT NULL UNIQUE, keyPath TEXT, isUnique INTEGER NOT NULL)", 93 "DROP INDEX IF EXISTS Indexes_composit", 97 "CREATE TABLE IF NOT EXISTS Indexes (id INTEGER PRIMARY KEY, objectStoreId INTEGER NOT NULL REFERENCES ObjectStore(id), name TEXT NOT NULL, keyPath TEXT, isUnique INTEGER NOT NULL)", 94 98 "CREATE UNIQUE INDEX IF NOT EXISTS Indexes_composit ON Indexes(objectStoreId, name)", 95 99 96 "DROP TABLE IF EXISTS ObjectStoreData", 97 "CREATE TABLE IF NOT EXISTS ObjectStoreData (id INTEGER PRIMARY KEY, objectStoreId INTEGER NOT NULL REFERENCES ObjectStore(id), keyString TEXT UNIQUE, keyDate INTEGER UNIQUE, keyNumber INTEGER UNIQUE, value TEXT NOT NULL)", 98 "DROP INDEX IF EXISTS ObjectStoreData_composit", 100 "CREATE TABLE IF NOT EXISTS ObjectStoreData (id INTEGER PRIMARY KEY, objectStoreId INTEGER NOT NULL REFERENCES ObjectStore(id), keyString TEXT, keyDate INTEGER, keyNumber INTEGER, value TEXT NOT NULL)", 99 101 "CREATE UNIQUE INDEX IF NOT EXISTS ObjectStoreData_composit ON ObjectStoreData(keyString, keyDate, keyNumber, objectStoreId)", 100 102 101 "DROP TABLE IF EXISTS IndexData",102 103 "CREATE TABLE IF NOT EXISTS IndexData (id INTEGER PRIMARY KEY, indexId INTEGER NOT NULL REFERENCES Indexes(id), keyString TEXT, keyDate INTEGER, keyNumber INTEGER, objectStoreDataId INTEGER NOT NULL REFERENCES ObjectStoreData(id))", 103 "DROP INDEX IF EXISTS IndexData_composit",104 104 "CREATE INDEX IF NOT EXISTS IndexData_composit ON IndexData(keyString, keyDate, keyNumber, indexId)", 105 "DROP INDEX IF EXISTS IndexData_objectStoreDataId",106 105 "CREATE INDEX IF NOT EXISTS IndexData_objectStoreDataId ON IndexData(objectStoreDataId)", 107 "DROP INDEX IF EXISTS IndexData_indexId",108 106 "CREATE INDEX IF NOT EXISTS IndexData_indexId ON IndexData(indexId)" 109 107 }; 110 108 111 109 for (size_t i = 0; i < arraysize(commands); ++i) { 112 if (!sqliteDatabase ->executeCommand(commands[i])) {110 if (!sqliteDatabase.executeCommand(commands[i])) { 113 111 // FIXME: We should try to recover from this situation. Maybe nuke the database and start over? 114 112 LOG_ERROR("Failed to run the following command for IndexedDB: %s", commands[i]); … … 121 119 void IDBFactoryBackendImpl::open(const String& name, const String& description, PassRefPtr<IDBCallbacks> callbacks, PassRefPtr<SecurityOrigin> securityOrigin, Frame*, const String& dataDir, int64_t maximumSize) 122 120 { 123 IDBDatabaseBackendMap::iterator it = m_databaseBackendMap.find(name); 121 String fileIdentifier = securityOrigin->databaseIdentifier(); 122 String uniqueIdentifier = fileIdentifier + "@" + name; 123 IDBDatabaseBackendMap::iterator it = m_databaseBackendMap.find(uniqueIdentifier); 124 124 if (it != m_databaseBackendMap.end()) { 125 125 if (!description.isNull()) … … 131 131 // FIXME: Everything from now on should be done on another thread. 132 132 133 OwnPtr<SQLiteDatabase> sqliteDatabase = openSQLiteDatabase(securityOrigin.get(), name, dataDir, maximumSize); 134 if (!sqliteDatabase || !createTables(sqliteDatabase.get())) { 135 callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UNKNOWN_ERR, "Internal error.")); 136 return; 133 RefPtr<IDBSQLiteDatabase> sqliteDatabase; 134 SQLiteDatabaseMap::iterator it2 = m_sqliteDatabaseMap.find(fileIdentifier); 135 if (it2 != m_sqliteDatabaseMap.end()) 136 sqliteDatabase = it2->second; 137 else { 138 sqliteDatabase = openSQLiteDatabase(securityOrigin.get(), dataDir, maximumSize, fileIdentifier, this); 139 140 if (!sqliteDatabase || !createTables(sqliteDatabase->db())) { 141 callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UNKNOWN_ERR, "Internal error.")); 142 return; 143 } 144 m_sqliteDatabaseMap.set(fileIdentifier, sqliteDatabase.get()); 137 145 } 138 146 139 RefPtr<IDBDatabaseBackendImpl> databaseBackend = IDBDatabaseBackendImpl::create(name, description, sqliteDatabase. release(), m_transactionCoordinator.get());147 RefPtr<IDBDatabaseBackendImpl> databaseBackend = IDBDatabaseBackendImpl::create(name, description, sqliteDatabase.get(), m_transactionCoordinator.get()); 140 148 callbacks->onSuccess(databaseBackend.get()); 141 m_databaseBackendMap.set( name, databaseBackend.release());149 m_databaseBackendMap.set(uniqueIdentifier, databaseBackend.release()); 142 150 } 143 151 144 String IDBFactoryBackendImpl::databaseFileName( const String& name,SecurityOrigin* securityOrigin)152 String IDBFactoryBackendImpl::databaseFileName(SecurityOrigin* securityOrigin) 145 153 { 146 154 String databaseIdentifier = securityOrigin->databaseIdentifier(); 147 String santizedName = encodeForFileName(name); 148 return databaseIdentifier + "@" + santizedName + ".indexeddb"; 155 return databaseIdentifier + ".indexeddb"; 149 156 } 150 157 -
trunk/WebCore/storage/IDBFactoryBackendImpl.h
r69421 r70522 40 40 41 41 class IDBDatabaseBackendImpl; 42 class IDBSQLiteDatabase; 42 43 class IDBTransactionCoordinator; 43 44 … … 50 51 virtual ~IDBFactoryBackendImpl(); 51 52 53 // IDBSQLiteDatabase's lifetime may be shorter than ours, so we need notification when it dies. 54 void removeSQLiteDatabase(const String& filePath); 55 52 56 virtual void open(const String& name, const String& description, PassRefPtr<IDBCallbacks>, PassRefPtr<SecurityOrigin>, Frame*, const String& dataDir, int64_t maximumSize); 53 57 54 static String databaseFileName( const String& name,SecurityOrigin*);58 static String databaseFileName(SecurityOrigin*); 55 59 56 60 private: 57 61 IDBFactoryBackendImpl(); 58 62 63 // FIXME: Just hold a weak pointer. 59 64 typedef HashMap<String, RefPtr<IDBDatabaseBackendImpl> > IDBDatabaseBackendMap; 60 65 IDBDatabaseBackendMap m_databaseBackendMap; 66 67 typedef HashMap<String, IDBSQLiteDatabase*> SQLiteDatabaseMap; 68 SQLiteDatabaseMap m_sqliteDatabaseMap; 69 61 70 RefPtr<IDBTransactionCoordinator> m_transactionCoordinator; 62 71 63 // We only create one instance of this class at atime.72 // Only one instance of the factory should exist at any given time. 64 73 static IDBFactoryBackendImpl* idbFactoryBackendImpl; 65 74 }; -
trunk/WebCore/storage/IDBObjectStoreBackendImpl.cpp
r70093 r70522 132 132 } 133 133 134 static bool putObjectStoreData(SQLiteDatabase& db, IDBKey* key, SerializedScriptValue* value, int64_t objectStoreId, int64_t *dataRowId)135 { 136 String sql = *dataRowId != -1? "UPDATE ObjectStoreData SET keyString = ?, keyDate = ?, keyNumber = ?, value = ? WHERE id = ?"137 : "INSERT INTO ObjectStoreData (keyString, keyDate, keyNumber, value, objectStoreId) VALUES (?, ?, ?, ?, ?)";134 static bool putObjectStoreData(SQLiteDatabase& db, IDBKey* key, SerializedScriptValue* value, int64_t objectStoreId, int64_t& dataRowId) 135 { 136 String sql = dataRowId != IDBObjectStoreBackendImpl::InvalidId ? "UPDATE ObjectStoreData SET keyString = ?, keyDate = ?, keyNumber = ?, value = ? WHERE id = ?" 137 : "INSERT INTO ObjectStoreData (keyString, keyDate, keyNumber, value, objectStoreId) VALUES (?, ?, ?, ?, ?)"; 138 138 SQLiteStatement query(db, sql); 139 139 if (query.prepare() != SQLResultOk) … … 141 141 key->bindWithNulls(query, 1); 142 142 query.bindText(4, value->toWireString()); 143 if ( *dataRowId != -1)144 query.bindInt (5, *dataRowId);143 if (dataRowId != IDBDatabaseBackendImpl::InvalidId) 144 query.bindInt64(5, dataRowId); 145 145 else 146 146 query.bindInt64(5, objectStoreId); … … 149 149 return false; 150 150 151 if ( *dataRowId == -1)152 *dataRowId = db.lastInsertRowID();151 if (dataRowId == IDBDatabaseBackendImpl::InvalidId) 152 dataRowId = db.lastInsertRowID(); 153 153 154 154 return true; … … 239 239 // Before this point, don't do any mutation. After this point, rollback the transaction in case of error. 240 240 241 int64_t dataRowId = isExistingValue ? getQuery.getColumnInt(0) : -1;242 if (!putObjectStoreData(objectStore->sqliteDatabase(), key.get(), value.get(), objectStore->id(), &dataRowId)) {241 int64_t dataRowId = isExistingValue ? getQuery.getColumnInt(0) : InvalidId; 242 if (!putObjectStoreData(objectStore->sqliteDatabase(), key.get(), value.get(), objectStore->id(), dataRowId)) { 243 243 // FIXME: The Indexed Database specification does not have an error code dedicated to I/O errors. 244 244 callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UNKNOWN_ERR, "Error writing data to stable storage.")); -
trunk/WebCore/storage/IDBObjectStoreBackendImpl.h
r69721 r70522 53 53 virtual ~IDBObjectStoreBackendImpl(); 54 54 55 static const int64_t InvalidId = 0; 55 56 int64_t id() const 56 57 { … … 95 96 static void addIndexToMap(ScriptExecutionContext*, PassRefPtr<IDBObjectStoreBackendImpl>, PassRefPtr<IDBIndexBackendImpl>); 96 97 97 static const int64_t InvalidId = 0;98 99 98 RefPtr<IDBDatabaseBackendImpl> m_database; 100 99 -
trunk/WebCore/storage/IDBSQLiteDatabase.h
r70521 r70522 11 11 * notice, this list of conditions and the following disclaimer in the 12 12 * documentation and/or other materials provided with the distribution. 13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of14 * its contributors may be used to endorse or promote products derived15 * from this software without specific prior written permission.16 13 * 17 14 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY … … 26 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 24 */ 28 #ifndef IDBFactoryBackendImpl_h29 #define IDBFactoryBackendImpl_h30 25 31 #include "IDBFactoryBackendInterface.h" 32 #include <wtf/HashMap.h> 33 #include <wtf/text/StringHash.h> 26 #ifndef IDBSQLiteDatabase_h 27 #define IDBSQLiteDatabase_h 34 28 35 29 #if ENABLE(INDEXED_DATABASE) 36 30 31 #include "SQLiteDatabase.h" 32 #include <wtf/PassRefPtr.h> 33 #include <wtf/RefCounted.h> 34 #include <wtf/RefPtr.h> 35 37 36 namespace WebCore { 38 37 39 class DOMStringList;38 class IDBFactoryBackendImpl; 40 39 41 class IDBDatabaseBackendImpl; 42 class IDBTransactionCoordinator; 40 class IDBSQLiteDatabase : public RefCounted<IDBSQLiteDatabase> { 41 public: 42 static PassRefPtr<IDBSQLiteDatabase> create(String identifier, IDBFactoryBackendImpl* factory) 43 { 44 return adoptRef(new IDBSQLiteDatabase(identifier, factory)); 45 } 46 ~IDBSQLiteDatabase(); 43 47 44 class IDBFactoryBackendImpl : public IDBFactoryBackendInterface { 45 public: 46 static PassRefPtr<IDBFactoryBackendImpl> create() 47 { 48 return adoptRef(new IDBFactoryBackendImpl()); 49 } 50 virtual ~IDBFactoryBackendImpl(); 51 52 virtual void open(const String& name, const String& description, PassRefPtr<IDBCallbacks>, PassRefPtr<SecurityOrigin>, Frame*, const String& dataDir, int64_t maximumSize); 53 54 static String databaseFileName(const String& name, SecurityOrigin*); 48 SQLiteDatabase& db() { return m_db; } 55 49 56 50 private: 57 IDB FactoryBackendImpl();51 IDBSQLiteDatabase(String identifier, IDBFactoryBackendImpl* factory); 58 52 59 typedef HashMap<String, RefPtr<IDBDatabaseBackendImpl> > IDBDatabaseBackendMap; 60 IDBDatabaseBackendMap m_databaseBackendMap; 61 RefPtr<IDBTransactionCoordinator> m_transactionCoordinator; 62 63 // We only create one instance of this class at a time. 64 static IDBFactoryBackendImpl* idbFactoryBackendImpl; 53 SQLiteDatabase m_db; 54 String m_identifier; 55 RefPtr<IDBFactoryBackendImpl> m_factory; 65 56 }; 66 57 … … 69 60 #endif 70 61 71 #endif // IDBFactoryBackendImpl_h 72 62 #endif // IDBSQLiteDatabase_h -
trunk/WebKit/chromium/ChangeLog
r70513 r70522 1 2010-10-26 Jeremy Orlow <jorlow@chromium.org> 2 3 Reviewed by Steve Block. 4 5 Quota for IndexedDB should be per origin not per database 6 https://bugs.webkit.org/show_bug.cgi?id=48064 7 8 * public/WebIDBFactory.h: 9 * public/WebSecurityOrigin.h: 10 * src/WebIDBFactory.cpp: 11 (WebKit::WebIDBFactory::databaseFileName): 12 * src/WebSecurityOrigin.cpp: 13 (WebKit::WebSecurityOrigin::get): 14 1 15 2010-10-26 Sheriff Bot <webkit.review.bot@gmail.com> 2 16 -
trunk/WebKit/chromium/public/WebIDBFactory.h
r69670 r70522 59 59 60 60 // The file name that would be used for persisting a given indexed database on the file system. 61 WEBKIT_API static WebString databaseFileName(const WebSecurityOrigin&); 62 // FIXME: Remove after roll. 61 63 WEBKIT_API static WebString databaseFileName(const WebString& name, const WebSecurityOrigin&); 62 64 }; -
trunk/WebKit/chromium/public/WebIDBKey.h
r67600 r70522 83 83 84 84 private: 85 86 85 WebPrivatePtr<WebCore::IDBKey> m_private; 87 86 }; -
trunk/WebKit/chromium/public/WebSecurityOrigin.h
r59870 r70522 101 101 WebSecurityOrigin& operator=(const WTF::PassRefPtr<WebCore::SecurityOrigin>&); 102 102 operator WTF::PassRefPtr<WebCore::SecurityOrigin>() const; 103 WebCore::SecurityOrigin* get() const; 103 104 #endif 104 105 -
trunk/WebKit/chromium/src/WebIDBFactory.cpp
r67941 r70522 32 32 #include "WebIDBFactory.h" 33 33 34 #if ENABLE(INDEXED_DATABASE)35 36 34 #include "IDBFactoryBackendImpl.h" 37 #include "SecurityOrigin.h" 35 #include "WebSecurityOrigin.h" 36 #include <wtf/UnusedParam.h> 38 37 39 38 using namespace WebCore; … … 41 40 namespace WebKit { 42 41 42 WebString WebIDBFactory::databaseFileName(const WebSecurityOrigin& origin) 43 { 44 return IDBFactoryBackendImpl::databaseFileName(origin.get()); 45 } 46 43 47 WebString WebIDBFactory::databaseFileName(const WebString& name, const WebSecurityOrigin& origin) 44 48 { 45 RefPtr<SecurityOrigin> securityOrigin; 46 securityOrigin = origin; 47 return IDBFactoryBackendImpl::databaseFileName(name, securityOrigin.get()); 49 UNUSED_PARAM(name); 50 return databaseFileName(origin); 48 51 } 49 52 50 53 } 51 52 #endif // ENABLE(INDEXED_DATABASE) -
trunk/WebKit/chromium/src/WebSecurityOrigin.cpp
r59870 r70522 144 144 } 145 145 146 SecurityOrigin* WebSecurityOrigin::get() const 147 { 148 return m_private; 149 } 150 146 151 void WebSecurityOrigin::assign(WebSecurityOriginPrivate* p) 147 152 {
Note: See TracChangeset
for help on using the changeset viewer.