@breakside/jskit 2026.2.2 → 2026.4.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.
Files changed (49) hide show
  1. package/Frameworks/DOM.jsframework/Info.json +2 -2
  2. package/Frameworks/DOM.jsframework/io.breakside.JSKit.DOM-bundle.js +2 -2
  3. package/Frameworks/FontKit.jsframework/Info.json +2 -2
  4. package/Frameworks/FontKit.jsframework/io.breakside.JSKit.FontKit-bundle.js +2 -2
  5. package/Frameworks/Foundation.jsframework/Info.json +2 -2
  6. package/Frameworks/Foundation.jsframework/io.breakside.JSKit.Foundation-bundle.js +2 -2
  7. package/Frameworks/SecurityKit.jsframework/Info.json +2 -2
  8. package/Frameworks/SecurityKit.jsframework/io.breakside.JSKit.SecurityKit-bundle.js +2 -2
  9. package/Info.json +2 -2
  10. package/Node/io.breakside.jskit-bundle.js +2 -2
  11. package/Root/Frameworks/APIKit/Info.yaml +1 -1
  12. package/Root/Frameworks/APIKitTesting/Info.yaml +1 -1
  13. package/Root/Frameworks/AuthKit/Info.yaml +1 -1
  14. package/Root/Frameworks/CSSOM/Info.yaml +1 -1
  15. package/Root/Frameworks/ChartKit/Info.yaml +1 -1
  16. package/Root/Frameworks/ConferenceKit/Info.yaml +1 -1
  17. package/Root/Frameworks/DBKit/Info.yaml +1 -1
  18. package/Root/Frameworks/DOM/Info.yaml +1 -1
  19. package/Root/Frameworks/Dispatch/Info.yaml +1 -1
  20. package/Root/Frameworks/FontKit/Info.yaml +1 -1
  21. package/Root/Frameworks/Foundation/Info.yaml +1 -1
  22. package/Root/Frameworks/ImageKit/Info.yaml +1 -1
  23. package/Root/Frameworks/MediaKit/Info.yaml +1 -1
  24. package/Root/Frameworks/MediaKit/QuickTime/MKQuickTime.js +7 -0
  25. package/Root/Frameworks/MediaKit/QuickTime/MKQuickTimeAtom.js +13 -7
  26. package/Root/Frameworks/MediaKit/QuickTime/MKQuickTimeEditList.js +33 -3
  27. package/Root/Frameworks/MediaKit/QuickTime/MKQuickTimeFileType.js +1 -1
  28. package/Root/Frameworks/MediaKit/QuickTime/MKQuickTimeMedia.js +19 -3
  29. package/Root/Frameworks/MediaKit/QuickTime/MKQuickTimeMediaHandler.js +4 -1
  30. package/Root/Frameworks/MediaKit/QuickTime/MKQuickTimeMediaHeader.js +20 -1
  31. package/Root/Frameworks/MediaKit/QuickTime/MKQuickTimeMovieHeader.js +28 -1
  32. package/Root/Frameworks/MediaKit/QuickTime/MKQuickTimeSampleDescription.js +5 -1
  33. package/Root/Frameworks/MediaKit/QuickTime/MKQuickTimeSampleSize.js +4 -1
  34. package/Root/Frameworks/MediaKit/QuickTime/MKQuickTimeTimeToSample.js +3 -0
  35. package/Root/Frameworks/MediaKit/QuickTime/MKQuickTimeTrackHeader.js +28 -1
  36. package/Root/Frameworks/MediaKit/QuickTime/MKQuickTimeVideoMediaInformationHeader.js +3 -0
  37. package/Root/Frameworks/MediaKitUI/Info.yaml +1 -1
  38. package/Root/Frameworks/NotificationKit/Info.yaml +1 -1
  39. package/Root/Frameworks/PDFKit/Info.yaml +1 -1
  40. package/Root/Frameworks/QRKit/Info.yaml +1 -1
  41. package/Root/Frameworks/SearchKit/Info.yaml +1 -1
  42. package/Root/Frameworks/SecurityKit/Info.yaml +1 -1
  43. package/Root/Frameworks/ServerKit/Info.yaml +1 -1
  44. package/Root/Frameworks/ServerKitTesting/Info.yaml +1 -1
  45. package/Root/Frameworks/TestKit/Info.yaml +1 -1
  46. package/Root/Frameworks/UIKit/Info.yaml +1 -1
  47. package/Root/Frameworks/UIKit/UIWindowServer.js +3 -0
  48. package/Root/Frameworks/UIKitTesting/Info.yaml +1 -1
  49. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "JSBundleType": "framework",
3
3
  "JSBundleIdentifier": "io.breakside.JSKit.DOM",
4
- "JSBundleVersion": "2026.2.2",
4
+ "JSBundleVersion": "2026.4.1",
5
5
  "JSDevelopmentLanguage": "en",
6
6
  "JSCopyright": "Copyright © 2020 Breakside Inc.",
7
7
  "JSBundleEnvironments": {
@@ -9,5 +9,5 @@
9
9
  "node": "DOM+Node.js"
10
10
  },
11
11
  "JSLicenseNotice": "Licensed under the Breakside Public License, Version 1.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nIf a copy of the License was not distributed with this file, you may\nobtain a copy at\n\n http://breakside.io/licenses/LICENSE-1.0.txt\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n",
12
- "GitRevision": "243c2bc0a9cca7be568b91320f8348fa215ed5b4"
12
+ "GitRevision": "81476f101c402411441be784d6beeee4a31239a4"
13
13
  }
@@ -3,7 +3,7 @@ JSBundle.bundles['io.breakside.JSKit.DOM'] = {
3
3
  "Info": {
4
4
  "JSBundleType": "framework",
5
5
  "JSBundleIdentifier": "io.breakside.JSKit.DOM",
6
- "JSBundleVersion": "2026.2.2",
6
+ "JSBundleVersion": "2026.4.1",
7
7
  "JSDevelopmentLanguage": "en",
8
8
  "JSCopyright": "Copyright © 2020 Breakside Inc.",
9
9
  "JSBundleEnvironments": {
@@ -11,7 +11,7 @@ JSBundle.bundles['io.breakside.JSKit.DOM'] = {
11
11
  "node": "DOM+Node.js"
12
12
  },
13
13
  "JSLicenseNotice": "Licensed under the Breakside Public License, Version 1.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nIf a copy of the License was not distributed with this file, you may\nobtain a copy at\n\n http://breakside.io/licenses/LICENSE-1.0.txt\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n",
14
- "GitRevision": "243c2bc0a9cca7be568b91320f8348fa215ed5b4"
14
+ "GitRevision": "81476f101c402411441be784d6beeee4a31239a4"
15
15
  },
16
16
  "Resources": [],
17
17
  "ResourceLookup": {
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "JSBundleType": "framework",
3
3
  "JSBundleIdentifier": "io.breakside.JSKit.FontKit",
4
- "JSBundleVersion": "2026.2.2",
4
+ "JSBundleVersion": "2026.4.1",
5
5
  "JSDevelopmentLanguage": "en",
6
6
  "JSCopyright": "Copyright © 2020 Breakside Inc.",
7
7
  "JSBundleEnvironments": {
8
8
  "html": "FontKit+HTML.js"
9
9
  },
10
10
  "JSLicenseNotice": "Licensed under the Breakside Public License, Version 1.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nIf a copy of the License was not distributed with this file, you may\nobtain a copy at\n\n http://breakside.io/licenses/LICENSE-1.0.txt\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n",
11
- "GitRevision": "243c2bc0a9cca7be568b91320f8348fa215ed5b4"
11
+ "GitRevision": "81476f101c402411441be784d6beeee4a31239a4"
12
12
  }
@@ -3,14 +3,14 @@ JSBundle.bundles['io.breakside.JSKit.FontKit'] = {
3
3
  "Info": {
4
4
  "JSBundleType": "framework",
5
5
  "JSBundleIdentifier": "io.breakside.JSKit.FontKit",
6
- "JSBundleVersion": "2026.2.2",
6
+ "JSBundleVersion": "2026.4.1",
7
7
  "JSDevelopmentLanguage": "en",
8
8
  "JSCopyright": "Copyright © 2020 Breakside Inc.",
9
9
  "JSBundleEnvironments": {
10
10
  "html": "FontKit+HTML.js"
11
11
  },
12
12
  "JSLicenseNotice": "Licensed under the Breakside Public License, Version 1.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nIf a copy of the License was not distributed with this file, you may\nobtain a copy at\n\n http://breakside.io/licenses/LICENSE-1.0.txt\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n",
13
- "GitRevision": "243c2bc0a9cca7be568b91320f8348fa215ed5b4"
13
+ "GitRevision": "81476f101c402411441be784d6beeee4a31239a4"
14
14
  },
15
15
  "Resources": [],
16
16
  "ResourceLookup": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "JSBundleType": "framework",
3
3
  "JSBundleIdentifier": "io.breakside.JSKit.Foundation",
4
- "JSBundleVersion": "2026.2.2",
4
+ "JSBundleVersion": "2026.4.1",
5
5
  "JSDevelopmentLanguage": "en",
6
6
  "JSCopyright": "Copyright © 2020 Breakside Inc.",
7
7
  "JSBundleEnvironments": {
@@ -9,5 +9,5 @@
9
9
  "node": "Foundation+Node.js"
10
10
  },
11
11
  "JSLicenseNotice": "Licensed under the Breakside Public License, Version 1.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nIf a copy of the License was not distributed with this file, you may\nobtain a copy at\n\n http://breakside.io/licenses/LICENSE-1.0.txt\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n",
12
- "GitRevision": "243c2bc0a9cca7be568b91320f8348fa215ed5b4"
12
+ "GitRevision": "81476f101c402411441be784d6beeee4a31239a4"
13
13
  }
@@ -3,7 +3,7 @@ JSBundle.bundles['io.breakside.JSKit.Foundation'] = {
3
3
  "Info": {
4
4
  "JSBundleType": "framework",
5
5
  "JSBundleIdentifier": "io.breakside.JSKit.Foundation",
6
- "JSBundleVersion": "2026.2.2",
6
+ "JSBundleVersion": "2026.4.1",
7
7
  "JSDevelopmentLanguage": "en",
8
8
  "JSCopyright": "Copyright © 2020 Breakside Inc.",
9
9
  "JSBundleEnvironments": {
@@ -11,7 +11,7 @@ JSBundle.bundles['io.breakside.JSKit.Foundation'] = {
11
11
  "node": "Foundation+Node.js"
12
12
  },
13
13
  "JSLicenseNotice": "Licensed under the Breakside Public License, Version 1.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nIf a copy of the License was not distributed with this file, you may\nobtain a copy at\n\n http://breakside.io/licenses/LICENSE-1.0.txt\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n",
14
- "GitRevision": "243c2bc0a9cca7be568b91320f8348fa215ed5b4"
14
+ "GitRevision": "81476f101c402411441be784d6beeee4a31239a4"
15
15
  },
16
16
  "Resources": [
17
17
  {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "JSBundleType": "framework",
3
3
  "JSBundleIdentifier": "io.breakside.JSKit.SecurityKit",
4
- "JSBundleVersion": "2026.2.2",
4
+ "JSBundleVersion": "2026.4.1",
5
5
  "JSDevelopmentLanguage": "en",
6
6
  "JSCopyright": "Copyright © 2020 Breakside Inc.",
7
7
  "JSBundleEnvironments": {
@@ -9,5 +9,5 @@
9
9
  "node": "SecurityKit+Node.js"
10
10
  },
11
11
  "JSLicenseNotice": "Licensed under the Breakside Public License, Version 1.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nIf a copy of the License was not distributed with this file, you may\nobtain a copy at\n\n http://breakside.io/licenses/LICENSE-1.0.txt\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n",
12
- "GitRevision": "243c2bc0a9cca7be568b91320f8348fa215ed5b4"
12
+ "GitRevision": "81476f101c402411441be784d6beeee4a31239a4"
13
13
  }
@@ -3,7 +3,7 @@ JSBundle.bundles['io.breakside.JSKit.SecurityKit'] = {
3
3
  "Info": {
4
4
  "JSBundleType": "framework",
5
5
  "JSBundleIdentifier": "io.breakside.JSKit.SecurityKit",
6
- "JSBundleVersion": "2026.2.2",
6
+ "JSBundleVersion": "2026.4.1",
7
7
  "JSDevelopmentLanguage": "en",
8
8
  "JSCopyright": "Copyright © 2020 Breakside Inc.",
9
9
  "JSBundleEnvironments": {
@@ -11,7 +11,7 @@ JSBundle.bundles['io.breakside.JSKit.SecurityKit'] = {
11
11
  "node": "SecurityKit+Node.js"
12
12
  },
13
13
  "JSLicenseNotice": "Licensed under the Breakside Public License, Version 1.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nIf a copy of the License was not distributed with this file, you may\nobtain a copy at\n\n http://breakside.io/licenses/LICENSE-1.0.txt\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n",
14
- "GitRevision": "243c2bc0a9cca7be568b91320f8348fa215ed5b4"
14
+ "GitRevision": "81476f101c402411441be784d6beeee4a31239a4"
15
15
  },
16
16
  "Resources": [],
17
17
  "ResourceLookup": {
package/Info.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "JSBundleType": "node",
3
3
  "JSBundleIdentifier": "io.breakside.jskit",
4
- "JSBundleVersion": "2026.2.2",
4
+ "JSBundleVersion": "2026.4.1",
5
5
  "JSExecutableName": "jskit",
6
6
  "NPMOrganization": "breakside",
7
7
  "JSResources": [
8
8
  "Tests/HTMLTestRunner.js",
9
9
  "Tests/NodeTestRunner.js"
10
10
  ],
11
- "GitRevision": "243c2bc0a9cca7be568b91320f8348fa215ed5b4"
11
+ "GitRevision": "81476f101c402411441be784d6beeee4a31239a4"
12
12
  }
@@ -3,14 +3,14 @@ JSBundle.bundles['io.breakside.jskit'] = {
3
3
  "Info": {
4
4
  "JSBundleType": "node",
5
5
  "JSBundleIdentifier": "io.breakside.jskit",
6
- "JSBundleVersion": "2026.2.2",
6
+ "JSBundleVersion": "2026.4.1",
7
7
  "JSExecutableName": "jskit",
8
8
  "NPMOrganization": "breakside",
9
9
  "JSResources": [
10
10
  "Tests/HTMLTestRunner.js",
11
11
  "Tests/NodeTestRunner.js"
12
12
  ],
13
- "GitRevision": "243c2bc0a9cca7be568b91320f8348fa215ed5b4"
13
+ "GitRevision": "81476f101c402411441be784d6beeee4a31239a4"
14
14
  },
15
15
  "Resources": [
16
16
  {
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.APIKit
3
- JSBundleVersion: 2026.2.2
3
+ JSBundleVersion: 2026.4.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSIncludeDirectories:
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.APIKitTesting
3
- JSBundleVersion: 2026.2.2
3
+ JSBundleVersion: 2026.4.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSLicenseNotice: |
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.AuthKit
3
- JSBundleVersion: 2026.2.2
3
+ JSBundleVersion: 2026.4.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSLicenseNotice: |
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.CSSOM
3
- JSBundleVersion: 2026.2.2
3
+ JSBundleVersion: 2026.4.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSBundleEnvironments:
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.ChartKit
3
- JSBundleVersion: 2026.2.2
3
+ JSBundleVersion: 2026.4.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2021 Breakside Inc.
6
6
  # JSBundleEnvironments:
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.ConferenceKit
3
- JSBundleVersion: 2026.2.2
3
+ JSBundleVersion: 2026.4.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSBundleEnvironments:
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.DBKit
3
- JSBundleVersion: 2026.2.2
3
+ JSBundleVersion: 2026.4.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSBundleEnvironments:
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.DOM
3
- JSBundleVersion: 2026.2.2
3
+ JSBundleVersion: 2026.4.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSBundleEnvironments:
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.Dispatch
3
- JSBundleVersion: 2026.2.2
3
+ JSBundleVersion: 2026.4.1
4
4
  JSCopyright: Copyright © 2020 Breakside Inc.
5
5
  JSBundleEnvironments:
6
6
  html: Dispatch+HTML.js
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.FontKit
3
- JSBundleVersion: 2026.2.2
3
+ JSBundleVersion: 2026.4.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSBundleEnvironments:
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.Foundation
3
- JSBundleVersion: 2026.2.2
3
+ JSBundleVersion: 2026.4.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSBundleEnvironments:
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.ImageKit
3
- JSBundleVersion: 2026.2.2
3
+ JSBundleVersion: 2026.4.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSBundleEnvironments:
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.MediaKit
3
- JSBundleVersion: 2026.2.2
3
+ JSBundleVersion: 2026.4.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSBundleEnvironments:
@@ -29,6 +29,10 @@ JSClass("MKQuickTime", MKQuickTimeAtom, {
29
29
  if (header === null){
30
30
  return -1;
31
31
  }
32
+ if (header.timeScale === 0){
33
+ logger.warn("mvhd timeScale = 0");
34
+ return -1;
35
+ }
32
36
  return header.duration / header.timeScale;
33
37
  },
34
38
 
@@ -43,6 +47,9 @@ JSClass("MKQuickTime", MKQuickTimeAtom, {
43
47
  if (header === null){
44
48
  return 0;
45
49
  }
50
+ if (header.timeScale === 0){
51
+ return 0;
52
+ }
46
53
  return header.posterTime / header.timeScale;
47
54
  },
48
55
 
@@ -30,19 +30,15 @@ JSClass("MKQuickTimeAtom", JSObject, {
30
30
  var l = this.data.length;
31
31
  var size;
32
32
  var type;
33
- var a, b;
34
33
  var atomClass, atom;
35
34
  while (i < l - 8){
36
35
  size = this.dataView.getUint32(i);
37
36
  type = this.dataView.getUint32(i + 4);
38
37
  if (size === 0x00000001){
39
38
  if (i < l - 16){
40
- a = this.dataView.getUint32(i + 8);
41
- b = this.dataView.getUint32(i + 12);
42
- size = Math.pow(2, 32) * a + b;
43
- if (size > Number.MAX_SAFE_INTEGER){
44
- throw new Error("cannot retain full precision of 64 bit integer for atom at byte %d".sprintf(i));
45
- }
39
+ size = this._getUint64(i + 8);
40
+ }else{
41
+ throw new Error("not enough bytes at %d for a 64bit size".sprintf(i));
46
42
  }
47
43
  }else{
48
44
  if (size === 0x00000000){
@@ -113,6 +109,16 @@ JSClass("MKQuickTimeAtom", JSObject, {
113
109
  }
114
110
  }
115
111
  return dictionary;
112
+ },
113
+
114
+ _getUint64: function(offset){
115
+ var a = this.dataView.getUint32(offset);
116
+ var b = this.dataView.getUint32(offset + 4);
117
+ var size = Math.pow(2, 32) * a + b;
118
+ if (size > Number.MAX_SAFE_INTEGER){
119
+ throw new Error("cannot retain full precision of 64 bit integer for atom at byte %d".sprintf(offset));
120
+ }
121
+ return size;
116
122
  }
117
123
 
118
124
  });
@@ -25,6 +25,9 @@ JSClass("MKQuickTimeEditList", MKQuickTimeAtom, {
25
25
  if (data.length < 16){
26
26
  throw new Error("expecting at least 16 bytes for elst atom");
27
27
  }
28
+ if (this.version > 1){
29
+ throw new Error("Unsupported elst version: %d".sprintf(this.version));
30
+ }
28
31
  },
29
32
 
30
33
  getNumberOfEntries: function(){
@@ -32,7 +35,16 @@ JSClass("MKQuickTimeEditList", MKQuickTimeAtom, {
32
35
  },
33
36
 
34
37
  durationAtIndex: function(index){
35
- var i = 16 + index * 12;
38
+ var i;
39
+ if (this.version === 1){
40
+ i = 16 + index * 20;
41
+ if (i >= 16 && i < this.data.length){
42
+ return this._getUint64(i);
43
+ }
44
+ return null;
45
+ }
46
+ // version 0
47
+ i = 16 + index * 12;
36
48
  if (i >= 16 && i < this.data.length){
37
49
  return this.dataView.getUint32(i);
38
50
  }
@@ -40,7 +52,16 @@ JSClass("MKQuickTimeEditList", MKQuickTimeAtom, {
40
52
  },
41
53
 
42
54
  mediaTimeAtIndex: function(index){
43
- var i = 16 + index * 12;
55
+ var i;
56
+ if (this.version === 1){
57
+ i = 16 + index * 20;
58
+ if (i >= 16 && i < this.data.length){
59
+ return this._getUint64(i + 8);
60
+ }
61
+ return null;
62
+ }
63
+ // version 0
64
+ i = 16 + index * 12;
44
65
  if (i >= 16 && i < this.data.length){
45
66
  return this.dataView.getUint32(i + 4);
46
67
  }
@@ -48,7 +69,16 @@ JSClass("MKQuickTimeEditList", MKQuickTimeAtom, {
48
69
  },
49
70
 
50
71
  mediaRateAtIndex: function(index){
51
- var i = 16 + index * 12;
72
+ var i;
73
+ if (this.version === 1){
74
+ i = 16 + index * 20;
75
+ if (i >= 16 && i < this.data.length){
76
+ return this.dataView.getUint16(i + 16) + this.dataView.getUint16(i + 18) / 0x10000;
77
+ }
78
+ return null;
79
+ }
80
+ // version 0
81
+ i = 16 + index * 12;
52
82
  if (i >= 16 && i < this.data.length){
53
83
  return this.dataView.getUint16(i + 8) + this.dataView.getUint16(i + 10) / 0x10000;
54
84
  }
@@ -21,10 +21,10 @@ JSClass("MKQuickTimeFileType", MKQuickTimeAtom, {
21
21
  },
22
22
 
23
23
  initWithData: function(data){
24
+ MKQuickTimeFileType.$super.initWithData.call(this, data);
24
25
  if (data.length < 16){
25
26
  throw new Error("expecting at least 16 bytes for ftyp atom");
26
27
  }
27
- MKQuickTimeFileType.$super.initWithData.call(this, data);
28
28
  },
29
29
 
30
30
  dictionaryRepresentation: function(){
@@ -38,6 +38,19 @@ JSClass("MKQuickTimeMedia", MKQuickTimeAtom, {
38
38
  return this.atomOfType(MKQuickTimeAtom.Type.hdlr);
39
39
  },
40
40
 
41
+ duration: JSReadOnlyProperty(),
42
+
43
+ getDuration: function(){
44
+ var header = this.mediaHeader;
45
+ if (header === null){
46
+ return -1;
47
+ }
48
+ if (header.timeScale === 0){
49
+ return -1;
50
+ }
51
+ return header.duration / header.timeScale;
52
+ },
53
+
41
54
  videoFrameRates: JSReadOnlyProperty(),
42
55
 
43
56
  getVideoFrameRates: function(){
@@ -59,8 +72,9 @@ JSClass("MKQuickTimeMedia", MKQuickTimeAtom, {
59
72
  var rates = [];
60
73
  var durations = info.sampleDurations;
61
74
  var i, l;
75
+ var timeScale = header.timeScale;
62
76
  for (i = 0, l = durations.length; i < l; ++i){
63
- rates.push(header.timeScale / durations[i]);
77
+ rates.push(timeScale / durations[i]);
64
78
  }
65
79
  return rates;
66
80
  },
@@ -83,6 +97,7 @@ JSClass("MKQuickTimeMedia", MKQuickTimeAtom, {
83
97
  if (header === null){
84
98
  return null;
85
99
  }
100
+ var timeScale = header.timeScale;
86
101
  var counts = info.sampleCounts;
87
102
  var durations = info.sampleDurations;
88
103
  var totalCount = 0;
@@ -90,7 +105,7 @@ JSClass("MKQuickTimeMedia", MKQuickTimeAtom, {
90
105
  var i, l;
91
106
  for (i = 0, l = durations.length; i < l; ++i){
92
107
  totalCount += counts[i];
93
- totalSeconds += (durations[i] * counts[i]) / header.timeScale;
108
+ totalSeconds += (durations[i] * counts[i]) / timeScale;
94
109
  }
95
110
  return totalCount / totalSeconds;
96
111
  },
@@ -141,6 +156,7 @@ JSClass("MKQuickTimeMedia", MKQuickTimeAtom, {
141
156
  if (sizeTable === null){
142
157
  return null;
143
158
  }
159
+ var timeScale = header.timeScale;
144
160
  var counts = info.sampleCounts;
145
161
  var durations = info.sampleDurations;
146
162
  var totalSeconds = 0;
@@ -152,7 +168,7 @@ JSClass("MKQuickTimeMedia", MKQuickTimeAtom, {
152
168
  for (j = 0; j < counts[i]; ++j, ++s){
153
169
  totalBytes += sizeTable.sizeAtIndex(s);
154
170
  }
155
- totalSeconds += (durations[i] * counts[i]) / header.timeScale;
171
+ totalSeconds += (durations[i] * counts[i]) / timeScale;
156
172
  }
157
173
  return (totalBytes * 8) / totalSeconds;
158
174
  }
@@ -30,10 +30,13 @@ JSClass("MKQuickTimeMediaHandler", MKQuickTimeAtom, {
30
30
  },
31
31
 
32
32
  initWithData: function(data){
33
+ MKQuickTimeMediaHandler.$super.initWithData.call(this, data);
33
34
  if (data.length < 20){
34
35
  throw new Error("expecting at least 20 bytes for hdlr atom");
35
36
  }
36
- MKQuickTimeMediaHandler.$super.initWithData.call(this, data);
37
+ if (this.version > 0){
38
+ throw new Error("Unsupported hdlr version: %d".sprintf(this.version));
39
+ }
37
40
  },
38
41
 
39
42
  dictionaryRepresentation: function(){
@@ -22,18 +22,37 @@ JSClass("MKQuickTimeMediaHeader", MKQuickTimeAtom, {
22
22
  },
23
23
 
24
24
  getTimeScale: function(){
25
+ if (this.version === 1){
26
+ return this.dataView.getUint32(28);
27
+ }
28
+ // version 0
25
29
  return this.dataView.getUint32(20);
26
30
  },
27
31
 
28
32
  getDuration: function(){
33
+ if (this.version === 1){
34
+ return this._getUint64(32);
35
+ }
36
+ // version 0
29
37
  return this.dataView.getUint32(24);
30
38
  },
31
39
 
32
40
  initWithData: function(data){
41
+ MKQuickTimeMediaHeader.$super.initWithData.call(this, data);
42
+ if (data.length < 12){
43
+ Error("expecting at least 12 bytes for mdhd atom");
44
+ }
45
+ if (this.version > 1){
46
+ throw new Error("Unsupported mdhd version: %d".sprintf(this.version));
47
+ }
48
+ if (this.version === 1){
49
+ if (data.length < 40){
50
+ throw new Error("expecting at least 40 bytes for mdhd v1 atom");
51
+ }
52
+ }
33
53
  if (data.length < 28){
34
54
  throw new Error("expecting at least 28 bytes for mdhd atom");
35
55
  }
36
- MKQuickTimeMediaHeader.$super.initWithData.call(this, data);
37
56
  },
38
57
 
39
58
  dictionaryRepresentation: function(){
@@ -24,26 +24,53 @@ JSClass("MKQuickTimeMovieHeader", MKQuickTimeAtom, {
24
24
  },
25
25
 
26
26
  getTimeScale: function(){
27
+ if (this.version === 1){
28
+ return this.dataView.getUint32(28);
29
+ }
30
+ // version 0
27
31
  return this.dataView.getUint32(20);
28
32
  },
29
33
 
30
34
  getDuration: function(){
35
+ if (this.version === 1){
36
+ return this._getUint64(32);
37
+ }
38
+ // version 0
31
39
  return this.dataView.getUint32(24);
32
40
  },
33
41
 
34
42
  getPreferredRate: function(){
43
+ if (this.version === 1){
44
+ return this.dataView.getUint16(40) + this.dataView.getUint16(42) / 0x10000;
45
+ }
46
+ // version 0
35
47
  return this.dataView.getUint16(28) + this.dataView.getUint16(30) / 0x10000;
36
48
  },
37
49
 
38
50
  getPosterTime: function(){
51
+ if (this.version === 1){
52
+ return this.dataView.getUint32(90);
53
+ }
54
+ // version 0
39
55
  return this.dataView.getUint32(78);
40
56
  },
41
57
 
42
58
  initWithData: function(data){
59
+ MKQuickTimeMovieHeader.$super.initWithData.call(this, data);
60
+ if (data.length < 12){
61
+ Error("expecting at least 12 bytes for mvhd atom");
62
+ }
63
+ if (this.version > 1){
64
+ throw new Error("Unsupported mvhd version: %d".sprintf(this.version));
65
+ }
66
+ if (this.version === 1){
67
+ if (data.length < 110){
68
+ throw new Error("expecting at least 110 bytes for mvhd v1 atom");
69
+ }
70
+ }
43
71
  if (data.length < 98){
44
72
  throw new Error("expecting at least 98 bytes for mvhd atom");
45
73
  }
46
- MKQuickTimeMovieHeader.$super.initWithData.call(this, data);
47
74
  },
48
75
 
49
76
  dictionaryRepresentation: function(){
@@ -23,7 +23,11 @@ JSClass("MKQuickTimeSampleDescription", MKQuickTimeAtom, {
23
23
  initWithData: function(data){
24
24
  MKQuickTimeSampleDescription.$super.initWithData.call(this, data);
25
25
  if (data.length < 16){
26
- throw new Error("expecting at least 16 bytes for stts atom");
26
+ throw new Error("expecting at least 16 bytes for stsd atom");
27
+ }
28
+ // version 1 is allowed, but treated like version 0
29
+ if (this.version > 1){
30
+ throw new Error("Unsupported stsd version: %d".sprintf(this.version));
27
31
  }
28
32
  },
29
33
 
@@ -24,7 +24,10 @@ JSClass("MKQuickTimeSampleSize", MKQuickTimeAtom, {
24
24
  initWithData: function(data){
25
25
  MKQuickTimeSampleSize.$super.initWithData.call(this, data);
26
26
  if (data.length < 20){
27
- throw new Error("expecting at least 20 bytes for st atom");
27
+ throw new Error("expecting at least 20 bytes for stsz atom");
28
+ }
29
+ if (this.version > 0){
30
+ throw new Error("Unsupported stsz version: %d".sprintf(this.version));
28
31
  }
29
32
  },
30
33
 
@@ -30,6 +30,9 @@ JSClass("MKQuickTimeTimeToSample", MKQuickTimeAtom, {
30
30
  if (data.length < l){
31
31
  throw new Error("expecting at least %d bytes for stts atom with %d entries".sprintf(l, n));
32
32
  }
33
+ if (this.version > 0){
34
+ throw new Error("Unsupported stts version: %d".sprintf(this.version));
35
+ }
33
36
  },
34
37
 
35
38
  getNumberOfEntries: function(){
@@ -36,18 +36,34 @@ JSClass("MKQuickTimeTrackHeader", MKQuickTimeAtom, {
36
36
  },
37
37
 
38
38
  getTrackID: function(){
39
+ if (this.version === 1){
40
+ return this.dataView.getUint32(28);
41
+ }
42
+ // version 0
39
43
  return this.dataView.getUint32(20);
40
44
  },
41
45
 
42
46
  getDuration: function(){
47
+ if (this.version === 1){
48
+ return this.dataView.getUint32(40);
49
+ }
50
+ // version 0
43
51
  return this.dataView.getUint32(28);
44
52
  },
45
53
 
46
54
  getWidth: function(){
55
+ if (this.version === 1){
56
+ return this.dataView.getUint16(96) + this.dataView.getUint16(98) / 0x10000;
57
+ }
58
+ // version 0
47
59
  return this.dataView.getUint16(84) + this.dataView.getUint16(86) / 0x10000;
48
60
  },
49
61
 
50
62
  getHeight: function(){
63
+ if (this.version === 1){
64
+ return this.dataView.getUint16(100) + this.dataView.getUint16(102) / 0x10000;
65
+ }
66
+ // version 0
51
67
  return this.dataView.getUint16(88) + this.dataView.getUint16(90) / 0x10000;
52
68
  },
53
69
 
@@ -58,10 +74,21 @@ JSClass("MKQuickTimeTrackHeader", MKQuickTimeAtom, {
58
74
  },
59
75
 
60
76
  initWithData: function(data){
77
+ MKQuickTimeTrackHeader.$super.initWithData.call(this, data);
78
+ if (data.length < 12){
79
+ Error("expecting at least 12 bytes for tkhd atom");
80
+ }
81
+ if (this.version > 1){
82
+ throw new Error("Unsupported tkhd version: %d".sprintf(this.version));
83
+ }
84
+ if (this.version === 1){
85
+ if (data.length < 104){
86
+ throw new Error("expecting at least 104 bytes for tkhd v1 atom");
87
+ }
88
+ }
61
89
  if (data.length < 92){
62
90
  throw new Error("expecting at least 92 bytes for tkhd atom");
63
91
  }
64
- MKQuickTimeTrackHeader.$super.initWithData.call(this, data);
65
92
  },
66
93
 
67
94
  dictionaryRepresentation: function(){
@@ -24,6 +24,9 @@ JSClass("MKQuickTimeVideoMediaInformationHeader", MKQuickTimeAtom, {
24
24
  if (data.length < 20){
25
25
  throw new Error("expecting at least 20 bytes for vmhd atom");
26
26
  }
27
+ if (this.version > 0){
28
+ throw new Error("Unsupported vmhd version: %d".sprintf(this.version));
29
+ }
27
30
  },
28
31
 
29
32
  graphicsMode: JSReadOnlyProperty(),
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.MediaKitUI
3
- JSBundleVersion: 2026.2.2
3
+ JSBundleVersion: 2026.4.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSBundleEnvironments:
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.NotificationKit
3
- JSBundleVersion: 2026.2.2
3
+ JSBundleVersion: 2026.4.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2021 Breakside Inc.
6
6
  JSBundleEnvironments:
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.PDFKit
3
- JSBundleVersion: 2026.2.2
3
+ JSBundleVersion: 2026.4.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSLicenseNotice: |
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.QRKit
3
- JSBundleVersion: 2026.2.2
3
+ JSBundleVersion: 2026.4.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSLicenseNotice: |
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.SearchKit
3
- JSBundleVersion: 2026.2.2
3
+ JSBundleVersion: 2026.4.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSLicenseNotice: |
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.SecurityKit
3
- JSBundleVersion: 2026.2.2
3
+ JSBundleVersion: 2026.4.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSBundleEnvironments:
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.ServerKit
3
- JSBundleVersion: 2026.2.2
3
+ JSBundleVersion: 2026.4.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSBundleEnvironments:
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.ServerKitTesting
3
- JSBundleVersion: 2026.2.2
3
+ JSBundleVersion: 2026.4.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSLicenseNotice: |
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.TestKit
3
- JSBundleVersion: 2026.2.2
3
+ JSBundleVersion: 2026.4.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSLicenseNotice: |
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.UIKit
3
- JSBundleVersion: 2026.2.2
3
+ JSBundleVersion: 2026.4.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSBundleEnvironments:
@@ -871,6 +871,9 @@ JSClass("UIWindowServer", JSObject, {
871
871
  resizeView = window._resizeView;
872
872
  location = window.convertPointToView(location, resizeView);
873
873
  }
874
+ if (location === null){
875
+ return UIWindowServer.ResizeOperation.none;
876
+ }
874
877
  var resizeFrame = resizeView.bounds;
875
878
  var cornerSize = Math.max(resizeView.cornerRadius, this._windowResizeWidthInside);
876
879
  if (location.y < resizeFrame.origin.y - this._windowResizeWidthOutside){
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.UIKitTesting
3
- JSBundleVersion: 2026.2.2
3
+ JSBundleVersion: 2026.4.1
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSLicenseNotice: |
package/package.json CHANGED
@@ -12,7 +12,7 @@
12
12
  "node": ">=10.10.0"
13
13
  },
14
14
  "name": "@breakside/jskit",
15
- "version": "2026.2.2",
15
+ "version": "2026.4.1",
16
16
  "license": "SEE LICENSE IN LICENSE.txt",
17
17
  "files": [
18
18
  "*"