@breakside/jskit 2023.11.0 → 2023.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Frameworks/DOM.jsframework/Info.json +2 -2
- package/Frameworks/DOM.jsframework/io.breakside.JSKit.DOM-bundle.js +2 -2
- package/Frameworks/FontKit.jsframework/Info.json +2 -2
- package/Frameworks/FontKit.jsframework/io.breakside.JSKit.FontKit-bundle.js +2 -2
- package/Frameworks/Foundation.jsframework/Info.json +2 -2
- package/Frameworks/Foundation.jsframework/JS/JSFileManager+HTML.js +111 -48
- package/Frameworks/Foundation.jsframework/JS/JSFileManager+Node.js +8 -1
- package/Frameworks/Foundation.jsframework/JS/JSUserDefaults.js +0 -1
- package/Frameworks/Foundation.jsframework/io.breakside.JSKit.Foundation-bundle.js +2 -2
- package/Frameworks/SecurityKit.jsframework/Info.json +2 -2
- package/Frameworks/SecurityKit.jsframework/io.breakside.JSKit.SecurityKit-bundle.js +2 -2
- package/Info.json +2 -2
- package/Node/io.breakside.jskit-bundle.js +2 -2
- package/Root/Frameworks/APIKit/Info.yaml +1 -1
- package/Root/Frameworks/APIKitTesting/Info.yaml +1 -1
- package/Root/Frameworks/AuthKit/Info.yaml +1 -1
- package/Root/Frameworks/CSSOM/Info.yaml +1 -1
- package/Root/Frameworks/ChartKit/Info.yaml +1 -1
- package/Root/Frameworks/ConferenceKit/Info.yaml +1 -1
- package/Root/Frameworks/DBKit/Info.yaml +1 -1
- package/Root/Frameworks/DOM/Info.yaml +1 -1
- package/Root/Frameworks/Dispatch/Info.yaml +1 -1
- package/Root/Frameworks/FontKit/Info.yaml +1 -1
- package/Root/Frameworks/Foundation/Info.yaml +1 -1
- package/Root/Frameworks/Foundation/JSFileManager+HTML.js +111 -48
- package/Root/Frameworks/Foundation/JSFileManager+Node.js +8 -1
- package/Root/Frameworks/Foundation/JSUserDefaults.js +0 -1
- package/Root/Frameworks/ImageKit/Info.yaml +1 -1
- package/Root/Frameworks/MediaKit/Info.yaml +1 -1
- package/Root/Frameworks/MediaKitUI/Info.yaml +1 -1
- package/Root/Frameworks/NotificationKit/Info.yaml +1 -1
- package/Root/Frameworks/PDFKit/Info.yaml +1 -1
- package/Root/Frameworks/QRKit/Info.yaml +1 -1
- package/Root/Frameworks/SearchKit/Info.yaml +1 -1
- package/Root/Frameworks/SecurityKit/Info.yaml +1 -1
- package/Root/Frameworks/ServerKit/Info.yaml +1 -1
- package/Root/Frameworks/ServerKitTesting/Info.yaml +1 -1
- package/Root/Frameworks/TestKit/Info.yaml +1 -1
- package/Root/Frameworks/UIKit/Info.yaml +1 -1
- package/Root/Frameworks/UIKit/UIAccessibility.js +2 -1
- package/Root/Frameworks/UIKit/UIHTMLWindowServer.js +18 -2
- package/Root/Frameworks/UIKit/UITextLayer.js +1 -1
- package/Root/Frameworks/UIKit/UIView.js +1 -0
- package/Root/Frameworks/UIKit/UIWindow.js +2 -4
- package/Root/Frameworks/UIKitTesting/Info.yaml +1 -1
- package/package.json +1 -1
|
@@ -45,6 +45,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
|
|
|
45
45
|
_identifier: null,
|
|
46
46
|
|
|
47
47
|
_db: null,
|
|
48
|
+
_rootURL: null,
|
|
48
49
|
|
|
49
50
|
error: null,
|
|
50
51
|
|
|
@@ -57,7 +58,6 @@ JSClass("JSHTMLFileManager", JSFileManager, {
|
|
|
57
58
|
// MARK: - Opening the File System
|
|
58
59
|
|
|
59
60
|
open: function(completion, target){
|
|
60
|
-
logger.info("opening indexeddb file manager");
|
|
61
61
|
if (!completion){
|
|
62
62
|
completion = Promise.completion(function JSFileManager_open_promise_completion(status){
|
|
63
63
|
if (status != JSFileManager.State.success){
|
|
@@ -68,6 +68,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
|
|
|
68
68
|
}
|
|
69
69
|
var request = indexedDB.open(this._identifier, CURRENT_DATABASE_VERSION);
|
|
70
70
|
var manager = this;
|
|
71
|
+
var oldVersion = 0;
|
|
71
72
|
request.onblocked = function JSFileManager_open_onblocked(e){
|
|
72
73
|
logger.info("indexeddb file manager upgrade blocked by other windows");
|
|
73
74
|
completion.call(target, JSFileManager.State.conflictingVersions);
|
|
@@ -81,6 +82,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
|
|
|
81
82
|
request.onupgradeneeded = function JSFileManager_open_onupgradeneeded(e){
|
|
82
83
|
logger.info("indexeddb upgrade needed");
|
|
83
84
|
logger.info("indexeddb upgrading");
|
|
85
|
+
oldVersion = e.oldVersion;
|
|
84
86
|
try{
|
|
85
87
|
manager._db = e.target.result;
|
|
86
88
|
manager.upgrade(e.oldVersion, e.newVersion);
|
|
@@ -90,10 +92,24 @@ JSClass("JSHTMLFileManager", JSFileManager, {
|
|
|
90
92
|
}
|
|
91
93
|
};
|
|
92
94
|
request.onsuccess = function JSFileManager_open_onsuccess(e){
|
|
93
|
-
logger.info("indexeddb open");
|
|
94
95
|
manager._db = e.target.result;
|
|
95
|
-
|
|
96
|
+
if (oldVersion === 1){
|
|
97
|
+
var v1url = manager._rootURL.appendingPathComponents(["Containers", "io.breakside.JSKit.Foundation.JSFileManager"], true);
|
|
98
|
+
var v2url = manager.persistentContainerURL;
|
|
99
|
+
logger.info("moving persistentContainerURL from %{public} to %{public}", v1url.encodedString, v2url.encodedString);
|
|
100
|
+
manager.moveItemAtURL(v1url, v2url, function(success){
|
|
101
|
+
if (success){
|
|
102
|
+
completion.call(target, JSFileManager.State.success);
|
|
103
|
+
}else{
|
|
104
|
+
logger.error("failed to move persistentContainerURL");
|
|
105
|
+
completion.call(target, JSFileManager.State.genericFailure);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}else{
|
|
109
|
+
completion.call(target, JSFileManager.State.success);
|
|
110
|
+
}
|
|
96
111
|
};
|
|
112
|
+
this._rootURL = this.urlForPath("/");
|
|
97
113
|
return completion.promise;
|
|
98
114
|
},
|
|
99
115
|
|
|
@@ -108,7 +124,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
|
|
|
108
124
|
url.path = path;
|
|
109
125
|
if (path.startsWith("/")){
|
|
110
126
|
url.scheme = JSFileManager.Scheme.jskitfile;
|
|
111
|
-
url.
|
|
127
|
+
url._hasAuthority = true;
|
|
112
128
|
}
|
|
113
129
|
if (baseURL){
|
|
114
130
|
url.resolveToBaseURL(baseURL);
|
|
@@ -132,7 +148,10 @@ JSClass("JSHTMLFileManager", JSFileManager, {
|
|
|
132
148
|
},
|
|
133
149
|
|
|
134
150
|
_getPersistentContainerURL: function(){
|
|
135
|
-
|
|
151
|
+
if (JSBundle.mainBundleIdentifier){
|
|
152
|
+
return this._rootURL.appendingPathComponents(["Containers", JSBundle.mainBundleIdentifier], true);
|
|
153
|
+
}
|
|
154
|
+
return this._rootURL;
|
|
136
155
|
},
|
|
137
156
|
|
|
138
157
|
_getWorkingDirectoryURL: function(){
|
|
@@ -140,7 +159,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
|
|
|
140
159
|
},
|
|
141
160
|
|
|
142
161
|
begin: function(permission, stores){
|
|
143
|
-
return new
|
|
162
|
+
return new JSHTMLFileManagerTransaction(this._db, stores, permission);
|
|
144
163
|
},
|
|
145
164
|
|
|
146
165
|
// --------------------------------------------------------------------
|
|
@@ -158,7 +177,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
|
|
|
158
177
|
throw new Error("JSFileManager.itemExistsAtURL unsupported scheme: %s".sprintf(url.scheme));
|
|
159
178
|
}
|
|
160
179
|
var exists = false;
|
|
161
|
-
var transaction = this.begin(
|
|
180
|
+
var transaction = this.begin(JSHTMLFileManager.Permission.read, JSHTMLFileManager.Tables.metadata);
|
|
162
181
|
transaction.addCompletion(function JSFileManager_itemExists_completion(success){
|
|
163
182
|
completion.call(target, success && exists);
|
|
164
183
|
});
|
|
@@ -183,7 +202,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
|
|
|
183
202
|
throw new Error("JSFileManager.attributesOfItemAtURL unsupported scheme: %s".sprintf(url.scheme));
|
|
184
203
|
}
|
|
185
204
|
var metadata = null;
|
|
186
|
-
var transaction = this.begin(
|
|
205
|
+
var transaction = this.begin(JSHTMLFileManager.Permission.read, JSHTMLFileManager.Tables.metadata);
|
|
187
206
|
transaction.addCompletion(function JSFileManager_attributesOfItem_completion(success){
|
|
188
207
|
completion.call(target, metadata);
|
|
189
208
|
});
|
|
@@ -196,12 +215,11 @@ JSClass("JSHTMLFileManager", JSFileManager, {
|
|
|
196
215
|
_metadataInTransactionAtURL: function(transaction, url, completion){
|
|
197
216
|
var parent = url.removingLastPathComponent();
|
|
198
217
|
try {
|
|
199
|
-
var index = transaction.metadata.index(
|
|
218
|
+
var index = transaction.metadata.index(JSHTMLFileManager.Indexes.metadataPath);
|
|
200
219
|
var lookup = [parent.path || '', url.lastPathComponent];
|
|
201
220
|
var request = index.get(lookup);
|
|
202
221
|
var metadata;
|
|
203
222
|
request.onsuccess = function JSFileManager_metadata_onsuccess(e){
|
|
204
|
-
logger.debug("metadata query success; exists: %b", !!e.target.result);
|
|
205
223
|
completion(e.target.result || null);
|
|
206
224
|
// FIXME: url could include a symlink folder, in which case we won't
|
|
207
225
|
// get a result here even if the url is valid after resolving the symlink.
|
|
@@ -219,7 +237,6 @@ JSClass("JSHTMLFileManager", JSFileManager, {
|
|
|
219
237
|
logger.error("Error querying metadata: %{error}", request.error);
|
|
220
238
|
completion(null);
|
|
221
239
|
};
|
|
222
|
-
logger.debug("looking up metadata");
|
|
223
240
|
}catch(e){
|
|
224
241
|
logger.error("Exception thrown querying metadata: %{error}", e);
|
|
225
242
|
}
|
|
@@ -242,7 +259,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
|
|
|
242
259
|
if (url.pathComponents.length === 1){
|
|
243
260
|
throw new Error("JSFileManager.createDirectoryAtURL cannot create root path");
|
|
244
261
|
}
|
|
245
|
-
var transaction = this.begin(
|
|
262
|
+
var transaction = this.begin(JSHTMLFileManager.Permission.readwrite, JSHTMLFileManager.Tables.metadata);
|
|
246
263
|
transaction.addCompletion(completion, target);
|
|
247
264
|
this._createDirectoryInTransactionAtURL(transaction, url, function JSFileManager_createDirectory_completion(success){
|
|
248
265
|
if (!success){
|
|
@@ -309,8 +326,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
|
|
|
309
326
|
if (url.pathComponents.length === 1){
|
|
310
327
|
throw new Error("JSFileManager.createFileAtURL cannot create root path");
|
|
311
328
|
}
|
|
312
|
-
|
|
313
|
-
var transaction = this.begin(JSFileManager.Permission.readwrite, [JSFileManager.Tables.metadata, JSFileManager.Tables.data]);
|
|
329
|
+
var transaction = this.begin(JSHTMLFileManager.Permission.readwrite, [JSHTMLFileManager.Tables.metadata, JSHTMLFileManager.Tables.data]);
|
|
314
330
|
transaction.addCompletion(completion, target);
|
|
315
331
|
var parent = url.removingLastPathComponent();
|
|
316
332
|
var manager = this;
|
|
@@ -318,7 +334,6 @@ JSClass("JSHTMLFileManager", JSFileManager, {
|
|
|
318
334
|
var metadata = null;
|
|
319
335
|
var create = function JSFileManager_createFile_create(parentExists){
|
|
320
336
|
if (parentExists){
|
|
321
|
-
logger.debug("writing file data");
|
|
322
337
|
var dataRequest;
|
|
323
338
|
if (metadata === null){
|
|
324
339
|
dataRequest = transaction.data.add(data);
|
|
@@ -354,16 +369,13 @@ JSClass("JSHTMLFileManager", JSFileManager, {
|
|
|
354
369
|
};
|
|
355
370
|
manager._metadataInTransactionAtURL(transaction, url, function JSFileManager_createFile_metadata(existingMetadata){
|
|
356
371
|
if (existingMetadata !== null){
|
|
357
|
-
logger.debug("overwriting file");
|
|
358
372
|
metadata = existingMetadata;
|
|
359
373
|
create(true);
|
|
360
374
|
}else{
|
|
361
|
-
logger.debug("new file, checking for parent");
|
|
362
375
|
manager._metadataInTransactionAtURL(transaction, parent, function JSFileManager_createFile_parent_metadata(parentMetadata){
|
|
363
376
|
if (parentMetadata !== null){
|
|
364
377
|
create(parentMetadata.itemType == JSFileManager.ItemType.directory);
|
|
365
378
|
}else{
|
|
366
|
-
logger.debug("creating parent");
|
|
367
379
|
manager._createDirectoryInTransactionAtURL(transaction, parent, create);
|
|
368
380
|
}
|
|
369
381
|
});
|
|
@@ -402,7 +414,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
|
|
|
402
414
|
if (url.path == toURL.path){
|
|
403
415
|
throw new Error("JSFileManager.moveItemAtURL target and destination are the same");
|
|
404
416
|
}
|
|
405
|
-
var transaction = this.begin(
|
|
417
|
+
var transaction = this.begin(JSHTMLFileManager.Permission.readwrite, JSHTMLFileManager.Tables.metadata);
|
|
406
418
|
transaction.addCompletion(completion, target);
|
|
407
419
|
var parent = url.removingLastPathComponent();
|
|
408
420
|
var toParent = toURL.removingLastPathComponent();
|
|
@@ -414,18 +426,15 @@ JSClass("JSHTMLFileManager", JSFileManager, {
|
|
|
414
426
|
}else{
|
|
415
427
|
var move = function JSFileManager_moveItem_move(toParentExists){
|
|
416
428
|
if (toParentExists){
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
toMetadata.name = toURL.lastPathComponent;
|
|
420
|
-
var request = transaction.metadata.put(toMetadata);
|
|
421
|
-
request.onsuccess = function JSFileManager_moveItem_onsuccess(){
|
|
429
|
+
manager._moveItemInTransactionAtURL(transaction, url, toURL, toParent, metadata);
|
|
430
|
+
transaction.indexedDBTransaction.addEventListener("complete", function(){
|
|
422
431
|
try{
|
|
423
432
|
manager.postNotificationForURL(parent, JSFileManager.Notification.directoryDidRemoveItem, {url: url, name: metadata.name, itemType: metadata.itemType});
|
|
424
|
-
manager.postNotificationForURL(toParent, JSFileManager.Notification.directoryDidAddItem, {url: toURL, name:
|
|
433
|
+
manager.postNotificationForURL(toParent, JSFileManager.Notification.directoryDidAddItem, {url: toURL, name: toURL.lastPathComponent, itemType: metadata.itemType});
|
|
425
434
|
}catch (e){
|
|
426
435
|
logger.error("Error posting notification: %{error}", e);
|
|
427
436
|
}
|
|
428
|
-
};
|
|
437
|
+
});
|
|
429
438
|
}else{
|
|
430
439
|
logger.info("could not create parent directory, aborting move transaction");
|
|
431
440
|
transaction.abort();
|
|
@@ -443,6 +452,59 @@ JSClass("JSHTMLFileManager", JSFileManager, {
|
|
|
443
452
|
return completion.promise;
|
|
444
453
|
},
|
|
445
454
|
|
|
455
|
+
_moveItemInTransactionAtURL: function(transaction, url, toURL, toParent, metadata){
|
|
456
|
+
switch (metadata.itemType){
|
|
457
|
+
case JSFileManager.ItemType.directory:
|
|
458
|
+
this._moveDirectoryInTransactionAtURL(transaction, url, toURL, toParent, metadata);
|
|
459
|
+
break;
|
|
460
|
+
case JSFileManager.ItemType.file:
|
|
461
|
+
this._moveMetadataInTransactionAtURL(transaction, url, toURL, toParent, metadata);
|
|
462
|
+
break;
|
|
463
|
+
case JSFileManager.ItemType.symbolicLink:
|
|
464
|
+
this._moveMetadataInTransactionAtURL(transaction, url, toURL, toParent, metadata);
|
|
465
|
+
break;
|
|
466
|
+
}
|
|
467
|
+
},
|
|
468
|
+
|
|
469
|
+
_moveMetadataInTransactionAtURL: function(transaction, url, toURL, toParent, metadata){
|
|
470
|
+
var manager = this;
|
|
471
|
+
var copiedMetadata = JSCopy(metadata);
|
|
472
|
+
copiedMetadata.parent = toParent.path;
|
|
473
|
+
copiedMetadata.name = toURL.lastPathComponent;
|
|
474
|
+
transaction.metadata.put(copiedMetadata);
|
|
475
|
+
var lookup = [url.removingLastPathComponent().path, url.lastPathComponent];
|
|
476
|
+
var index = transaction.metadata.index(JSHTMLFileManager.Indexes.metadataPath);
|
|
477
|
+
var keyRequest = index.getKey(lookup);
|
|
478
|
+
keyRequest.onsuccess = function JSFileManager_removeMetadata_onsuccess(e){
|
|
479
|
+
var key = e.target.result;
|
|
480
|
+
if (key !== undefined){
|
|
481
|
+
transaction.metadata.delete(key);
|
|
482
|
+
}
|
|
483
|
+
};
|
|
484
|
+
},
|
|
485
|
+
|
|
486
|
+
_moveDirectoryInTransactionAtURL: function(transaction, url, toURL, toParent, metadata){
|
|
487
|
+
this._moveMetadataInTransactionAtURL(transaction, url, toURL, toParent, metadata);
|
|
488
|
+
var index = transaction.metadata.index(JSHTMLFileManager.Indexes.metadataParent);
|
|
489
|
+
var lookup = url.path;
|
|
490
|
+
var request = index.getAll(lookup);
|
|
491
|
+
var manager = this;
|
|
492
|
+
request.onsuccess = function JSFileManager_removeDirectory_onsuccess(e){
|
|
493
|
+
var results = e.target.result;
|
|
494
|
+
if (results){
|
|
495
|
+
var child;
|
|
496
|
+
var childURL;
|
|
497
|
+
var childToURL;
|
|
498
|
+
for (var i = 0, l = results.length; i < l; ++i){
|
|
499
|
+
child = results[i];
|
|
500
|
+
childURL = url.appendingPathComponent(child.name, child.itemType == JSFileManager.ItemType.directory);
|
|
501
|
+
childToURL = toURL.appendingPathComponent(child.name, child.itemType == JSFileManager.ItemType.directory);
|
|
502
|
+
manager._moveItemInTransactionAtURL(transaction, childURL, childToURL, toURL, child);
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
};
|
|
506
|
+
},
|
|
507
|
+
|
|
446
508
|
copyItemAtURL: function(url, toURL, completion, target){
|
|
447
509
|
if (!completion){
|
|
448
510
|
completion = Promise.completion(Promise.resolveTrue);
|
|
@@ -470,7 +532,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
|
|
|
470
532
|
if (url.path == toURL.path){
|
|
471
533
|
throw new Error("JSFileManager.copyItemAtURL target and destination are the same");
|
|
472
534
|
}
|
|
473
|
-
var transaction = this.begin(
|
|
535
|
+
var transaction = this.begin(JSHTMLFileManager.Permission.readwrite, [JSHTMLFileManager.Tables.metadata, JSHTMLFileManager.Tables.data]);
|
|
474
536
|
transaction.addCompletion(completion, target);
|
|
475
537
|
var toParent = toURL.removingLastPathComponent();
|
|
476
538
|
var manager = this;
|
|
@@ -539,6 +601,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
|
|
|
539
601
|
var manager = this;
|
|
540
602
|
var copiedMetadata = JSCopy(metadata);
|
|
541
603
|
copiedMetadata.parent = toParent.path;
|
|
604
|
+
copiedMetadata.name = toURL.lastPathComponent;
|
|
542
605
|
var request = transaction.metadata.put(copiedMetadata);
|
|
543
606
|
request.onsuccess = function JSFileManager_copyMetadata_onsuccess(){
|
|
544
607
|
try{
|
|
@@ -551,7 +614,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
|
|
|
551
614
|
|
|
552
615
|
_copyDirectoryInTransactionAtURL: function(transaction, url, toURL, toParent, metadata){
|
|
553
616
|
this._copyMetadataInTransactionAtURL(transaction, url, toURL, toParent, metadata);
|
|
554
|
-
var index = transaction.metadata.index(
|
|
617
|
+
var index = transaction.metadata.index(JSHTMLFileManager.Indexes.metadataParent);
|
|
555
618
|
var lookup = url.path;
|
|
556
619
|
var request = index.getAll(lookup);
|
|
557
620
|
var manager = this;
|
|
@@ -589,9 +652,9 @@ JSClass("JSHTMLFileManager", JSFileManager, {
|
|
|
589
652
|
throw new Error("JSFileManager.removeItemAtURL cannot remove root path");
|
|
590
653
|
}
|
|
591
654
|
var parent = url.removingLastPathComponent();
|
|
592
|
-
var transaction = this.begin(
|
|
655
|
+
var transaction = this.begin(JSHTMLFileManager.Permission.readwrite, [JSHTMLFileManager.Tables.metadata, JSHTMLFileManager.Tables.data]);
|
|
593
656
|
transaction.addCompletion(completion, target);
|
|
594
|
-
var index = transaction.metadata.index(
|
|
657
|
+
var index = transaction.metadata.index(JSHTMLFileManager.Indexes.metadataPath);
|
|
595
658
|
var manager = this;
|
|
596
659
|
this._metadataInTransactionAtURL(transaction, url, function JSFileManager_removeItem_metadata(metadata){
|
|
597
660
|
if (metadata !== null){
|
|
@@ -626,7 +689,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
|
|
|
626
689
|
_removeMetadataInTransactionAtURL: function(transaction, url, parent, metadata){
|
|
627
690
|
var manager = this;
|
|
628
691
|
var lookup = [parent.path, url.lastPathComponent];
|
|
629
|
-
var index = transaction.metadata.index(
|
|
692
|
+
var index = transaction.metadata.index(JSHTMLFileManager.Indexes.metadataPath);
|
|
630
693
|
var keyRequest = index.getKey(lookup);
|
|
631
694
|
keyRequest.onsuccess = function JSFileManager_removeMetadata_onsuccess(e){
|
|
632
695
|
var key = e.target.result;
|
|
@@ -645,7 +708,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
|
|
|
645
708
|
|
|
646
709
|
_removeDirectoryInTransactionAtURL: function(transaction, url, parent, metadata){
|
|
647
710
|
this._removeMetadataInTransactionAtURL(transaction, url, parent, metadata);
|
|
648
|
-
var index = transaction.metadata.index(
|
|
711
|
+
var index = transaction.metadata.index(JSHTMLFileManager.Indexes.metadataParent);
|
|
649
712
|
var lookup = url.path;
|
|
650
713
|
var request = index.getAll(lookup);
|
|
651
714
|
var manager = this;
|
|
@@ -677,7 +740,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
|
|
|
677
740
|
if (url.scheme != JSFileManager.Scheme.jskitfile){
|
|
678
741
|
throw new Error("JSFileManager.contentsAtURL unsupported scheme: %s".sprintf(url.scheme));
|
|
679
742
|
}
|
|
680
|
-
var transaction = this.begin(
|
|
743
|
+
var transaction = this.begin(JSHTMLFileManager.Permission.readonly, [JSHTMLFileManager.Tables.metadata, JSHTMLFileManager.Tables.data]);
|
|
681
744
|
var contents = null;
|
|
682
745
|
var visitedURLSet = {};
|
|
683
746
|
transaction.addCompletion(function JSFileManager_contents_completion(success){
|
|
@@ -737,9 +800,9 @@ JSClass("JSHTMLFileManager", JSFileManager, {
|
|
|
737
800
|
if (url.scheme != JSFileManager.Scheme.jskitfile){
|
|
738
801
|
throw new Error("JSFileManager.removeItemAtURL unsupported scheme: %s".sprintf(url.scheme));
|
|
739
802
|
}
|
|
740
|
-
var transaction = this.begin(
|
|
803
|
+
var transaction = this.begin(JSHTMLFileManager.Permission.readwrite, [JSHTMLFileManager.Tables.metadata]);
|
|
741
804
|
transaction.addCompletion(completion, target);
|
|
742
|
-
var index = transaction.metadata.index(
|
|
805
|
+
var index = transaction.metadata.index(JSHTMLFileManager.Indexes.metadataParent);
|
|
743
806
|
var lookup = url.path;
|
|
744
807
|
var request = index.getAll(lookup);
|
|
745
808
|
var manager = this;
|
|
@@ -792,7 +855,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
|
|
|
792
855
|
if (url.isEqual(absoluteToURL)){
|
|
793
856
|
throw new Error("JSFileManager.createSymbolicLinkAtURL target and destination are the same");
|
|
794
857
|
}
|
|
795
|
-
var transaction = this.begin(
|
|
858
|
+
var transaction = this.begin(JSHTMLFileManager.Permission.readwrite, JSHTMLFileManager.Tables.metadata);
|
|
796
859
|
transaction.addCompletion(completion, target);
|
|
797
860
|
var parent = url.removingLastPathComponent();
|
|
798
861
|
var manager = this;
|
|
@@ -836,7 +899,7 @@ JSClass("JSHTMLFileManager", JSFileManager, {
|
|
|
836
899
|
throw new Error("JSFileManager.attributesOfItemAtURL unsupported scheme: %s".sprintf(url.scheme));
|
|
837
900
|
}
|
|
838
901
|
var link = null;
|
|
839
|
-
var transaction = this.begin(
|
|
902
|
+
var transaction = this.begin(JSHTMLFileManager.Permission.read, JSHTMLFileManager.Tables.metadata);
|
|
840
903
|
transaction.addCompletion(function JSFileManager_destinationOfSymbolicLink_completion(success){
|
|
841
904
|
completion.call(target, link);
|
|
842
905
|
});
|
|
@@ -895,11 +958,11 @@ JSClass("JSHTMLFileManager", JSFileManager, {
|
|
|
895
958
|
},
|
|
896
959
|
|
|
897
960
|
_createCurrentVersion: function(){
|
|
898
|
-
var metadata = this._db.createObjectStore(
|
|
961
|
+
var metadata = this._db.createObjectStore(JSHTMLFileManager.Tables.metadata, {autoIncrement: true, keyPath: "id"});
|
|
899
962
|
var transaction = metadata.transaction;
|
|
900
|
-
var pathIndex = metadata.createIndex(
|
|
901
|
-
var parentIndex = metadata.createIndex(
|
|
902
|
-
var data = this._db.createObjectStore(
|
|
963
|
+
var pathIndex = metadata.createIndex(JSHTMLFileManager.Indexes.metadataPath, ["parent", "name"], {unique: true});
|
|
964
|
+
var parentIndex = metadata.createIndex(JSHTMLFileManager.Indexes.metadataParent, "parent", {unique: false});
|
|
965
|
+
var data = this._db.createObjectStore(JSHTMLFileManager.Tables.data, {autoIncrement: true});
|
|
903
966
|
var t = this.timestamp;
|
|
904
967
|
var root = {parent: '', name: '/', itemType: JSFileManager.ItemType.directory, created: t, updated: t, added: t, size: 0};
|
|
905
968
|
metadata.add(root);
|
|
@@ -911,9 +974,9 @@ JSClass("JSHTMLFileManager", JSFileManager, {
|
|
|
911
974
|
});
|
|
912
975
|
|
|
913
976
|
|
|
914
|
-
var
|
|
977
|
+
var JSHTMLFileManagerTransaction = function(db, storeName, permission){
|
|
915
978
|
if (this === undefined){
|
|
916
|
-
return new
|
|
979
|
+
return new JSHTMLFileManagerTransaction(db, storeName, permission);
|
|
917
980
|
}
|
|
918
981
|
this.indexedDBTransaction = db.transaction(storeName, permission);
|
|
919
982
|
this.indexedDBTransaction.addEventListener('abort', this);
|
|
@@ -929,7 +992,7 @@ var JSFileManagerTransaction = function(db, storeName, permission){
|
|
|
929
992
|
}
|
|
930
993
|
};
|
|
931
994
|
|
|
932
|
-
|
|
995
|
+
JSHTMLFileManagerTransaction.prototype = {
|
|
933
996
|
|
|
934
997
|
addCompletion: function(completion, target){
|
|
935
998
|
this.completion = completion;
|
|
@@ -991,21 +1054,21 @@ if (self){
|
|
|
991
1054
|
indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
|
|
992
1055
|
}
|
|
993
1056
|
|
|
994
|
-
var CURRENT_DATABASE_VERSION =
|
|
1057
|
+
var CURRENT_DATABASE_VERSION = 2;
|
|
995
1058
|
|
|
996
|
-
|
|
1059
|
+
JSHTMLFileManager.Tables = {
|
|
997
1060
|
// {parent: "/some/path", name: "filename.txt", itemType: 1, created: 1234, modified: 1234, added: 1234, dataKey: 1234}
|
|
998
1061
|
metadata: "metadata",
|
|
999
1062
|
// Blob
|
|
1000
1063
|
data: "data"
|
|
1001
1064
|
};
|
|
1002
1065
|
|
|
1003
|
-
|
|
1066
|
+
JSHTMLFileManager.Indexes = {
|
|
1004
1067
|
metadataPath: "path",
|
|
1005
1068
|
metadataParent: "parent"
|
|
1006
1069
|
};
|
|
1007
1070
|
|
|
1008
|
-
|
|
1071
|
+
JSHTMLFileManager.Permission = {
|
|
1009
1072
|
readonly: "readonly",
|
|
1010
1073
|
readwrite: "readwrite"
|
|
1011
1074
|
};
|
|
@@ -60,6 +60,13 @@ JSClass("JSNodeFileManager", JSFileManager, {
|
|
|
60
60
|
});
|
|
61
61
|
}
|
|
62
62
|
this._rootURL = this.urlForPath(pathLib.join(process.cwd(), this._identifier), true);
|
|
63
|
+
var v1Path = this.pathForURL(this._rootURL.appendingPathComponent(this._identifier, true));
|
|
64
|
+
var v1Exists = fs.existsSync();
|
|
65
|
+
if (v1Exists){
|
|
66
|
+
var v2Path = this.pathForURL(this.persistentContainerURL);
|
|
67
|
+
logger.info("Moving persistentContainerURL from %{public} to %{public}", v1Path, v2Path);
|
|
68
|
+
fs.renameSync(v1Path, v2Path);
|
|
69
|
+
}
|
|
63
70
|
completion.call(target, JSFileManager.State.success);
|
|
64
71
|
return completion.promise;
|
|
65
72
|
},
|
|
@@ -115,7 +122,7 @@ JSClass("JSNodeFileManager", JSFileManager, {
|
|
|
115
122
|
},
|
|
116
123
|
|
|
117
124
|
_getPersistentContainerURL: function(){
|
|
118
|
-
return this._rootURL.
|
|
125
|
+
return this._rootURL.appendingPathComponents(["Containers", JSBundle.mainBundleIdentifier], true);
|
|
119
126
|
},
|
|
120
127
|
|
|
121
128
|
// --------------------------------------------------------------------
|
|
@@ -194,7 +194,6 @@ JSClass("JSUserDefaults", JSObject, {
|
|
|
194
194
|
}
|
|
195
195
|
}else{
|
|
196
196
|
var data = JSON.stringify(this._values).utf8();
|
|
197
|
-
logger.info("saving user defaults");
|
|
198
197
|
this._fileManager.createFileAtURL(this._url, data, function JSUserDefaults_persist_createFile(success){
|
|
199
198
|
if (!success){
|
|
200
199
|
logger.error("failed to write user defaults");
|
|
@@ -234,7 +234,8 @@ UIAccessibility.Notification = {
|
|
|
234
234
|
rowCollapsed: "UIAccessibility.Notification.rowCollapsed",
|
|
235
235
|
selectedChildrenChanged: "UIAccessibility.Notification.selectedChildrenChanged",
|
|
236
236
|
selectedTextChanged: "UIAccessibility.Notification.selectedTextChanged",
|
|
237
|
-
|
|
237
|
+
labelChanged: "UIAccessibility.Notification.labelChanged",
|
|
238
|
+
titleChanged: "UIAccessibility.Notification.labelChanged",
|
|
238
239
|
valueChanged: "UIAccessibility.Notification.valueChanged",
|
|
239
240
|
visibilityChanged: "UIAccessibility.Notification.visibilityChanged",
|
|
240
241
|
enabledChanged: "UIAccessibility.Notification.enabledChanged",
|