/**
* Any copyright is dedicated to the Public Domain .
* http : //creativecommons.org/publicdomain/zero/1.0/
*/
/* exported testGenerator */
var testGenerator = testSteps();
function * testSteps() {
/**
* High level description : This is a synthetic test whose main aim is to
* ensure that DeserializeUpgradeValueHelper is safe with the FileList type
* in its future use cases , and in the unlikely case that someone traverses
* this code path with an artificially constructed profile .
*
* The packaged profile of filelistUpgrade_profile . zip was manufactured in
* the following way :
*
* 1 . IDBFactory methods OpenForPrincipal was exposed by removing the
* ChromeOnly attribute from the IDBFactory . webidl file and making the
* corresponding changes to the header and source files .
* 1 . mochitest test_file_filelist . html was converted to an xpcshell - test
* which from here on is referred to as test_file_filelist . js
* 1 . test_file_filelist . js test was modified to create a principal for
* example . com the same way as dom / push / test / xpcshell / test_service_child . js
* 1 . test_file_filelist . js test was modified to open the databases using
* the openForPrincipal method , with the principal above
* 1 . test_file_filelist . js test was executed and the related
* xpcshell profile was saved
* 1 . this whole play with the principals is necessary to make sure that the
* resulting database is not encrypted , and can be queried with a normal
* sqlite3 client
* 1 . file dom / indexedDB / SchemaUpgrades . cpp was modified to expect the
* current database version to be 19 and stop the upgrades at this version
* 1 . additionally , the function UpgradeKeyFunction of
* UpgradeSchemaFrom17_0To18_0Helper was modified to copy the aSource value to
* aDestination , set aTagOffset to zero and return with NS_OK when the
* aSource value equals 48
* 1 . test_schema18upgrade . js was modified to stop after the database upgrade
* and executed . The related xpcshell profile with version 19 was saved .
* 1 . the version 19 database was opened with sqlite3 client and the other
* profile with a filelist was attached to it as " future "
* 1 . values ( 2 , 0 , " FileLists " , " key " ) and
* ( 3 , 0 , " Other FileLists " , " key " ) were inserted to table object_store
* 1 . the . schema command was executed to record the current schema
* 1 . object_data_insert_trigger was dropped ( temporarily )
* 1 . the following query was used to insert all data from the attached
* database to the old version :
* INSERT INTO object_data (
* object_store_id ,
* key ,
* index_data_values ,
* file_ids ,
* data )
* SELECT
* ( CASE WHEN ( ROW_NUMBER ( ) OVER ( ) < = 2 ) THEN 2 ELSE 3 END ) ,
* key ,
* NULL ,
* file_ids ,
* data
* FROM future . object_data ;
* 1 . everything from future . file is inserted to file
* 1 . the following query was used to update the database name :
* INSERT INTO database
* SELECT
* ' fileListUpgrade ' ,
* origin ,
* version ,
* last_vacuum_time ,
* last_analyze_time ,
* last_vacuum_size
* FROM database WHERE name = ' schema18upgrade ' ;
* 1 . the row with name ' schema18upgrade ' was deleted from database
* 1 . the sqlite3 client was closed
* 1 . the filename that is expected for this test was found out with the
* GetFileName method of dbFileUrl in the beginning of CreateStorageConnection
* function in dom / indexedDB / ActorsParent . cpp
* 1 . under the idb - directory under the profile / storage path , the
* . sqlite database file and the directory with a matching name having
* a . files extension were renamed to have the expected name with the same
* extensions
* 1 . the file ' 1 ' and the journal firectory from the other , filelist
* containing profile , for the example . com principal , were copied under the
* just renamed . files directory
* 1 . lastly , the storage / folder and storage . sqlite were recursively zipped
* into an archive ( note : zip - r on wsl did not produce a readable archive ,
* the artifact was created with the windows file manager compression tool )
*/
const testName = "fileListUpgrade" ;
clearAllDatabases(continueToNextStepSync);
yield undefined;
info("Installing profile" );
installPackagedProfile(testName + "_profile" );
info("Opening existing database with a filelist" );
let request = indexedDB.open(testName);
request.onerror = errorHandler;
request.onupgradeneeded = unexpectedSuccessHandler;
request.onsuccess = grabEventAndContinueHandler;
let event = yield undefined;
info("Database version " + event.target.result.version);
let db = event.target.result;
is(db.version, 3 , "Correct db version" );
let transaction = db.transaction(["FileLists" ]);
transaction.oncomplete = grabEventAndContinueHandler;
let objectStore = transaction.objectStore("FileLists" );
request = objectStore.openCursor();
request.onerror = errorHandler;
request.onupgradeneeded = unexpectedSuccessHandler;
var cursorItems = 0 ;
const expectedValues = new Set([
'{"key":"A","idx":0,"fileList":{"0":{},"1":{},"2":{}},"blob":{}}' ,
'{"key":"C","idx":2,"fileList":{"0":{},"1":{},"2":{}},"blob":{}}' ,
]);
request.onsuccess = event => {
let cursor = event.target.result;
if (cursor) {
cursorItems = cursorItems + 1 ;
const actualValue = JSON.stringify(cursor.value);
ok(expectedValues.has(actualValue), "Is value as expected?" );
cursor.continue ();
} else {
testGenerator.next();
}
};
yield undefined;
is(cursorItems, expectedValues.size, "Did we get expected number of items?" );
finishTest();
yield undefined;
}
Messung V0.5 in Prozent C=89 H=96 G=92
¤ Dauer der Verarbeitung: 0.18 Sekunden
(vorverarbeitet am 2026-08-25)
¤
*© Formatika GbR, Deutschland