@breakside/jskit 2025.27.1 → 2025.32.0

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 (45) 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/JS/JSObject.js +5 -6
  7. package/Frameworks/Foundation.jsframework/JS/JSSpec.js +21 -7
  8. package/Frameworks/Foundation.jsframework/io.breakside.JSKit.Foundation-bundle.js +2 -2
  9. package/Frameworks/SecurityKit.jsframework/Info.json +2 -2
  10. package/Frameworks/SecurityKit.jsframework/io.breakside.JSKit.SecurityKit-bundle.js +2 -2
  11. package/Info.json +2 -2
  12. package/Node/io.breakside.jskit-bundle.js +2 -2
  13. package/Root/Frameworks/APIKit/Info.yaml +1 -1
  14. package/Root/Frameworks/APIKitTesting/Info.yaml +1 -1
  15. package/Root/Frameworks/AuthKit/Info.yaml +1 -1
  16. package/Root/Frameworks/CSSOM/Info.yaml +1 -1
  17. package/Root/Frameworks/ChartKit/Info.yaml +1 -1
  18. package/Root/Frameworks/ConferenceKit/Info.yaml +1 -1
  19. package/Root/Frameworks/DBKit/Info.yaml +1 -1
  20. package/Root/Frameworks/DOM/Info.yaml +1 -1
  21. package/Root/Frameworks/Dispatch/Info.yaml +1 -1
  22. package/Root/Frameworks/FontKit/Info.yaml +1 -1
  23. package/Root/Frameworks/Foundation/Info.yaml +1 -1
  24. package/Root/Frameworks/Foundation/JSObject.js +5 -6
  25. package/Root/Frameworks/Foundation/JSSpec.js +21 -7
  26. package/Root/Frameworks/ImageKit/Info.yaml +1 -1
  27. package/Root/Frameworks/MediaKit/Info.yaml +1 -1
  28. package/Root/Frameworks/MediaKitUI/Info.yaml +1 -1
  29. package/Root/Frameworks/NotificationKit/Info.yaml +1 -1
  30. package/Root/Frameworks/PDFKit/Info.yaml +1 -1
  31. package/Root/Frameworks/QRKit/Info.yaml +1 -1
  32. package/Root/Frameworks/SearchKit/Info.yaml +1 -1
  33. package/Root/Frameworks/SecurityKit/Info.yaml +1 -1
  34. package/Root/Frameworks/ServerKit/Info.yaml +1 -1
  35. package/Root/Frameworks/ServerKitTesting/Info.yaml +1 -1
  36. package/Root/Frameworks/TestKit/Info.yaml +1 -1
  37. package/Root/Frameworks/UIKit/Info.yaml +1 -1
  38. package/Root/Frameworks/UIKit/UIHTMLWindowServer.js +6 -3
  39. package/Root/Frameworks/UIKit/UIMenuItem.js +8 -0
  40. package/Root/Frameworks/UIKit/UIMenuView.js +72 -11
  41. package/Root/Frameworks/UIKit/UIViewController.js +8 -0
  42. package/Root/Frameworks/UIKit/UIWindow.js +1 -0
  43. package/Root/Frameworks/UIKit/UIWindowServer.js +3 -0
  44. package/Root/Frameworks/UIKitTesting/Info.yaml +1 -1
  45. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "JSBundleType": "framework",
3
3
  "JSBundleIdentifier": "io.breakside.JSKit.DOM",
4
- "JSBundleVersion": "2025.27.1",
4
+ "JSBundleVersion": "2025.32.0",
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": "b48de91dcb9cc81c3131783b0c0ea4a9315ce4af"
12
+ "GitRevision": "6d705b44d392dc82ea2d5cc5fafce66c7a3352cc"
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": "2025.27.1",
6
+ "JSBundleVersion": "2025.32.0",
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": "b48de91dcb9cc81c3131783b0c0ea4a9315ce4af"
14
+ "GitRevision": "6d705b44d392dc82ea2d5cc5fafce66c7a3352cc"
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": "2025.27.1",
4
+ "JSBundleVersion": "2025.32.0",
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": "b48de91dcb9cc81c3131783b0c0ea4a9315ce4af"
11
+ "GitRevision": "6d705b44d392dc82ea2d5cc5fafce66c7a3352cc"
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": "2025.27.1",
6
+ "JSBundleVersion": "2025.32.0",
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": "b48de91dcb9cc81c3131783b0c0ea4a9315ce4af"
13
+ "GitRevision": "6d705b44d392dc82ea2d5cc5fafce66c7a3352cc"
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": "2025.27.1",
4
+ "JSBundleVersion": "2025.32.0",
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": "b48de91dcb9cc81c3131783b0c0ea4a9315ce4af"
12
+ "GitRevision": "6d705b44d392dc82ea2d5cc5fafce66c7a3352cc"
13
13
  }
@@ -88,13 +88,12 @@ JSObject.definePropertiesFromExtensions({
88
88
 
89
89
  initWithSpecName: function(specName, bundle){
90
90
  var spec = JSSpec.initWithResource(specName, bundle);
91
- if (spec !== null){
92
- var owner = spec.filesOwner;
93
- if (owner.isKindOfClass(this.$class)){
94
- return owner;
95
- }
91
+ if (spec === null){
92
+ return null;
93
+ }
94
+ if (!spec.initializeFilesOwner(this)){
95
+ return null;
96
96
  }
97
- return null;
98
97
  },
99
98
 
100
99
  initWithSpec: function(spec){
@@ -70,6 +70,17 @@ JSClass("JSSpec", JSObject, {
70
70
  this._cache = {};
71
71
  },
72
72
 
73
+ initializeFilesOwner: function(filesOwner){
74
+ var owner = this._root.valueForKey(JSSpec.Keys.FilesOwner, null, filesOwner);
75
+ if (owner === null){
76
+ return false;
77
+ }
78
+ if (owner !== filesOwner){
79
+ return false;
80
+ }
81
+ return true;
82
+ },
83
+
73
84
  getFilesOwner: function(){
74
85
  var owner = this._root.valueForKey(JSSpec.Keys.FilesOwner);
75
86
  if (owner === null){
@@ -117,7 +128,7 @@ JSClass("JSSpec", JSObject, {
117
128
  return values;
118
129
  },
119
130
 
120
- valueForKey: function(key, type){
131
+ valueForKey: function(key, type, allocatedObject){
121
132
  if (this._dictionaryValue === null){
122
133
  return null;
123
134
  }
@@ -127,7 +138,7 @@ JSClass("JSSpec", JSObject, {
127
138
  if (this === this._root){
128
139
  this._keysForNextObjectInit.push(key);
129
140
  }
130
- var value = this._createValueForKey(key, type);
141
+ var value = this._createValueForKey(key, type, allocatedObject);
131
142
  this._keysForNextObjectInit = [];
132
143
  this._cache[key] = value;
133
144
  return value;
@@ -140,7 +151,7 @@ JSClass("JSSpec", JSObject, {
140
151
  return JSDeepCopy(this._dictionaryValue[key]);
141
152
  },
142
153
 
143
- _createValueForKey: function(key, type){
154
+ _createValueForKey: function(key, type, allocatedObject){
144
155
  if (type === undefined){
145
156
  type = null;
146
157
  }
@@ -163,7 +174,7 @@ JSClass("JSSpec", JSObject, {
163
174
  return value.substr(1);
164
175
  }
165
176
  if (prefix == '/'){
166
- return this._root.valueForKey(value.substr(1), type);
177
+ return this._root.valueForKey(value.substr(1), type, allocatedObject);
167
178
  }
168
179
  if (prefix == '@'){
169
180
  return JSObject.initWithSpecName(value.substr(1), this._root._bundle);
@@ -194,17 +205,20 @@ JSClass("JSSpec", JSObject, {
194
205
  }
195
206
  }
196
207
  if (type !== null){
197
- return this._initializeObject(type, value);
208
+ if (allocatedObject && !(allocatedObject instanceof type)){
209
+ throw new Error("Incorrect File's Owner type provided in the spec file: " + type.className);
210
+ }
211
+ return this._initializeObject(type, value, allocatedObject);
198
212
  }
199
213
  return JSSpec.initWithValue(value, this._root);
200
214
  }
201
215
  return value;
202
216
  },
203
217
 
204
- _initializeObject: function(type, value){
218
+ _initializeObject: function(type, value, allocatedObject){
205
219
  var spec = JSSpec.initWithValue(value, this._root);
206
220
  if (type instanceof JSClass){
207
- var obj = type.allocate();
221
+ var obj = allocatedObject || type.allocate();
208
222
  // Since initWithSpec may resolve objects that reference back
209
223
  // to us, we need to set our entry in the object map before
210
224
  // calling init.
@@ -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": "2025.27.1",
6
+ "JSBundleVersion": "2025.32.0",
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": "b48de91dcb9cc81c3131783b0c0ea4a9315ce4af"
14
+ "GitRevision": "6d705b44d392dc82ea2d5cc5fafce66c7a3352cc"
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": "2025.27.1",
4
+ "JSBundleVersion": "2025.32.0",
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": "b48de91dcb9cc81c3131783b0c0ea4a9315ce4af"
12
+ "GitRevision": "6d705b44d392dc82ea2d5cc5fafce66c7a3352cc"
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": "2025.27.1",
6
+ "JSBundleVersion": "2025.32.0",
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": "b48de91dcb9cc81c3131783b0c0ea4a9315ce4af"
14
+ "GitRevision": "6d705b44d392dc82ea2d5cc5fafce66c7a3352cc"
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": "2025.27.1",
4
+ "JSBundleVersion": "2025.32.0",
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": "b48de91dcb9cc81c3131783b0c0ea4a9315ce4af"
11
+ "GitRevision": "6d705b44d392dc82ea2d5cc5fafce66c7a3352cc"
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": "2025.27.1",
6
+ "JSBundleVersion": "2025.32.0",
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": "b48de91dcb9cc81c3131783b0c0ea4a9315ce4af"
13
+ "GitRevision": "6d705b44d392dc82ea2d5cc5fafce66c7a3352cc"
14
14
  },
15
15
  "Resources": [
16
16
  {
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.APIKit
3
- JSBundleVersion: 2025.27.1
3
+ JSBundleVersion: 2025.32.0
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: 2025.27.1
3
+ JSBundleVersion: 2025.32.0
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: 2025.27.1
3
+ JSBundleVersion: 2025.32.0
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: 2025.27.1
3
+ JSBundleVersion: 2025.32.0
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: 2025.27.1
3
+ JSBundleVersion: 2025.32.0
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: 2025.27.1
3
+ JSBundleVersion: 2025.32.0
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: 2025.27.1
3
+ JSBundleVersion: 2025.32.0
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: 2025.27.1
3
+ JSBundleVersion: 2025.32.0
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: 2025.27.1
3
+ JSBundleVersion: 2025.32.0
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: 2025.27.1
3
+ JSBundleVersion: 2025.32.0
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: 2025.27.1
3
+ JSBundleVersion: 2025.32.0
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSBundleEnvironments:
@@ -88,13 +88,12 @@ JSObject.definePropertiesFromExtensions({
88
88
 
89
89
  initWithSpecName: function(specName, bundle){
90
90
  var spec = JSSpec.initWithResource(specName, bundle);
91
- if (spec !== null){
92
- var owner = spec.filesOwner;
93
- if (owner.isKindOfClass(this.$class)){
94
- return owner;
95
- }
91
+ if (spec === null){
92
+ return null;
93
+ }
94
+ if (!spec.initializeFilesOwner(this)){
95
+ return null;
96
96
  }
97
- return null;
98
97
  },
99
98
 
100
99
  initWithSpec: function(spec){
@@ -70,6 +70,17 @@ JSClass("JSSpec", JSObject, {
70
70
  this._cache = {};
71
71
  },
72
72
 
73
+ initializeFilesOwner: function(filesOwner){
74
+ var owner = this._root.valueForKey(JSSpec.Keys.FilesOwner, null, filesOwner);
75
+ if (owner === null){
76
+ return false;
77
+ }
78
+ if (owner !== filesOwner){
79
+ return false;
80
+ }
81
+ return true;
82
+ },
83
+
73
84
  getFilesOwner: function(){
74
85
  var owner = this._root.valueForKey(JSSpec.Keys.FilesOwner);
75
86
  if (owner === null){
@@ -117,7 +128,7 @@ JSClass("JSSpec", JSObject, {
117
128
  return values;
118
129
  },
119
130
 
120
- valueForKey: function(key, type){
131
+ valueForKey: function(key, type, allocatedObject){
121
132
  if (this._dictionaryValue === null){
122
133
  return null;
123
134
  }
@@ -127,7 +138,7 @@ JSClass("JSSpec", JSObject, {
127
138
  if (this === this._root){
128
139
  this._keysForNextObjectInit.push(key);
129
140
  }
130
- var value = this._createValueForKey(key, type);
141
+ var value = this._createValueForKey(key, type, allocatedObject);
131
142
  this._keysForNextObjectInit = [];
132
143
  this._cache[key] = value;
133
144
  return value;
@@ -140,7 +151,7 @@ JSClass("JSSpec", JSObject, {
140
151
  return JSDeepCopy(this._dictionaryValue[key]);
141
152
  },
142
153
 
143
- _createValueForKey: function(key, type){
154
+ _createValueForKey: function(key, type, allocatedObject){
144
155
  if (type === undefined){
145
156
  type = null;
146
157
  }
@@ -163,7 +174,7 @@ JSClass("JSSpec", JSObject, {
163
174
  return value.substr(1);
164
175
  }
165
176
  if (prefix == '/'){
166
- return this._root.valueForKey(value.substr(1), type);
177
+ return this._root.valueForKey(value.substr(1), type, allocatedObject);
167
178
  }
168
179
  if (prefix == '@'){
169
180
  return JSObject.initWithSpecName(value.substr(1), this._root._bundle);
@@ -194,17 +205,20 @@ JSClass("JSSpec", JSObject, {
194
205
  }
195
206
  }
196
207
  if (type !== null){
197
- return this._initializeObject(type, value);
208
+ if (allocatedObject && !(allocatedObject instanceof type)){
209
+ throw new Error("Incorrect File's Owner type provided in the spec file: " + type.className);
210
+ }
211
+ return this._initializeObject(type, value, allocatedObject);
198
212
  }
199
213
  return JSSpec.initWithValue(value, this._root);
200
214
  }
201
215
  return value;
202
216
  },
203
217
 
204
- _initializeObject: function(type, value){
218
+ _initializeObject: function(type, value, allocatedObject){
205
219
  var spec = JSSpec.initWithValue(value, this._root);
206
220
  if (type instanceof JSClass){
207
- var obj = type.allocate();
221
+ var obj = allocatedObject || type.allocate();
208
222
  // Since initWithSpec may resolve objects that reference back
209
223
  // to us, we need to set our entry in the object map before
210
224
  // calling init.
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.ImageKit
3
- JSBundleVersion: 2025.27.1
3
+ JSBundleVersion: 2025.32.0
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: 2025.27.1
3
+ JSBundleVersion: 2025.32.0
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.MediaKitUI
3
- JSBundleVersion: 2025.27.1
3
+ JSBundleVersion: 2025.32.0
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: 2025.27.1
3
+ JSBundleVersion: 2025.32.0
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: 2025.27.1
3
+ JSBundleVersion: 2025.32.0
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: 2025.27.1
3
+ JSBundleVersion: 2025.32.0
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: 2025.27.1
3
+ JSBundleVersion: 2025.32.0
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: 2025.27.1
3
+ JSBundleVersion: 2025.32.0
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: 2025.27.1
3
+ JSBundleVersion: 2025.32.0
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: 2025.27.1
3
+ JSBundleVersion: 2025.32.0
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: 2025.27.1
3
+ JSBundleVersion: 2025.32.0
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: 2025.27.1
3
+ JSBundleVersion: 2025.32.0
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSBundleEnvironments:
@@ -1021,6 +1021,12 @@ JSClass("UIHTMLWindowServer", UIWindowServer, {
1021
1021
  this.themeColorElement.setAttribute("content", color.cssString());
1022
1022
  },
1023
1023
 
1024
+ windowDidChangeTitle: function(window){
1025
+ if (window === this.windowStack[0]){
1026
+ this.updateDocumentTitle();
1027
+ }
1028
+ },
1029
+
1024
1030
  updateDocumentTitle: function(){
1025
1031
  var window = this.windowStack[0];
1026
1032
  if (window instanceof UIRootWindow){
@@ -1133,9 +1139,6 @@ JSClass("UIHTMLWindowServer", UIWindowServer, {
1133
1139
  if (context !== null){
1134
1140
  context.updateAccessibilityLabel(element);
1135
1141
  }
1136
- if (element instanceof UIRootWindow){
1137
- this.updateDocumentTitle();
1138
- }
1139
1142
  },
1140
1143
 
1141
1144
  handleAccessibilityValueChanged: function(notification){
@@ -43,6 +43,8 @@ JSClass("UIMenuItem", JSObject, {
43
43
  target: null,
44
44
  action: null,
45
45
  view: null,
46
+ accessoryView: null,
47
+ accessorySize: null,
46
48
 
47
49
  initWithSpec: function(spec){
48
50
  UIMenuItem.$super.initWithSpec.call(this, spec);
@@ -83,6 +85,12 @@ JSClass("UIMenuItem", JSObject, {
83
85
  if (spec.containsKey("view")){
84
86
  this.view = spec.valueForKey("view", UIView);
85
87
  }
88
+ if (spec.containsKey("accessoryView")){
89
+ this.accessoryView = spec.valueForKey("accessoryView", UIView);
90
+ }
91
+ if (spec.containsKey("accessorySize")){
92
+ this.accessorySize = spec.valueForKey("accessorySize", JSSize);
93
+ }
86
94
  if (spec.containsKey("accessibilityIdentifier")){
87
95
  this.accessibilityIdentifier = spec.valueForKey("accessibilityIdentifier");
88
96
  }
@@ -528,11 +528,15 @@ JSClass("UIMenuWindow", UIWindow, {
528
528
  // MARK: - Item Highlighting
529
529
 
530
530
  _highlightItem: function(item, openingSubmenu){
531
+ var view;
531
532
  if (this._menu.highlightedItem !== item){
532
533
  this._itemDownTimestamp = UIEvent.minimumTimestamp;
533
534
  if (this._menu.highlightedItem !== null){
534
535
  this._menu.highlightedItem.highlighted = false;
535
- this.menuView.itemViews[this._itemViewIndexesByItemId[this._menu.highlightedItem.objectID]].setItem(this._menu.highlightedItem);
536
+ view = this.menuView.itemViews[this._itemViewIndexesByItemId[this._menu.highlightedItem.objectID]];
537
+ if (view instanceof UIMenuItemView){
538
+ view.setItem(this._menu.highlightedItem);
539
+ }
536
540
  if (this._menu.highlightedItem.submenu){
537
541
  if (this.submenu !== null){
538
542
  this.submenu.close();
@@ -546,7 +550,10 @@ JSClass("UIMenuWindow", UIWindow, {
546
550
  this._menu._highlightedItem = item;
547
551
  if (this._menu.highlightedItem !== null){
548
552
  this._menu.highlightedItem.highlighted = true;
549
- this.menuView.itemViews[this._itemViewIndexesByItemId[item.objectID]].setItem(this._menu.highlightedItem);
553
+ view = this.menuView.itemViews[this._itemViewIndexesByItemId[item.objectID]];
554
+ if (view instanceof UIMenuItemView){
555
+ view.setItem(this._menu.highlightedItem);
556
+ }
550
557
  if (this._menu.highlightedItem.submenu && openingSubmenu){
551
558
  this.submenuTimer = JSTimer.scheduledTimerWithInterval(0.3, this.openHighlightedSubmenu, this);
552
559
  }
@@ -752,16 +759,18 @@ JSClass("UIMenuView", UIView, {
752
759
  view.frame = JSRect(0, 0, 1, this.menuWindow.separatorSize);
753
760
  }else{
754
761
  view = UIMenuItemView.init();
755
- view.contentInsets = this.menuWindow.itemContentInsets;
756
- view.indentationSize = this.menuWindow.indentationSize;
757
- view.textColor = this.menuWindow.textColor;
758
- view.highlightedTextColor = this.menuWindow.highlightedTextColor;
759
- view.disabledTextColor = this.menuWindow.disabledTextColor;
760
- view.highlightColor = this.menuWindow.highlightColor;
761
- view.keyWidth = this.menuWindow._keyWidth;
762
- view.setItem(item);
763
762
  }
764
763
  }
764
+ if (view instanceof UIMenuItemView){
765
+ view.contentInsets = this.menuWindow.itemContentInsets;
766
+ view.indentationSize = this.menuWindow.indentationSize;
767
+ view.textColor = this.menuWindow.textColor;
768
+ view.highlightedTextColor = this.menuWindow.highlightedTextColor;
769
+ view.disabledTextColor = this.menuWindow.disabledTextColor;
770
+ view.highlightColor = this.menuWindow.highlightColor;
771
+ view.keyWidth = this.menuWindow._keyWidth;
772
+ view.setItem(item);
773
+ }
765
774
  if (UIDevice.shared !== null && UIDevice.shared.primaryPointerType === UIUserInterface.PointerType.touch){
766
775
  if (!item.separator && this.itemViews.length > 0 && !(this.itemViews[this.itemViews.length - 1] instanceof UIMenuItemSeparatorView)){
767
776
  view.borderWidth = 1;
@@ -874,6 +883,8 @@ JSClass("UIMenuItemView", UIView, {
874
883
  _keyLabel: null,
875
884
  _keyModifierLabel: null,
876
885
  _menuStyler: null,
886
+ _accessoryView: null,
887
+ _accessorySize: null,
877
888
  _item: null,
878
889
 
879
890
  init: function(){
@@ -983,6 +994,18 @@ JSClass("UIMenuItemView", UIView, {
983
994
  if (this._stateImageView !== null){
984
995
  this.stateImageView.templateColor = textColor;
985
996
  }
997
+ if (item.accessoryView !== null){
998
+ if (this._accessoryView !== item.accessoryView){
999
+ if (this._accessoryView !== null){
1000
+ this._accessoryView.removeFromSuperview();
1001
+ }
1002
+ this._accessoryView = item.accessoryView;
1003
+ if (this._accessoryView !== null){
1004
+ this.addSubview(this._accessoryView);
1005
+ }
1006
+ }
1007
+ }
1008
+ this._accessorySize = item.accessorySize;
986
1009
  this.setNeedsLayout();
987
1010
  },
988
1011
 
@@ -1017,6 +1040,34 @@ JSClass("UIMenuItemView", UIView, {
1017
1040
  left += imageSize + this.contentInsets.left;
1018
1041
  }
1019
1042
  left += this.indentationSize * item.indentationLevel;
1043
+ var accessorySize = null;
1044
+ var accessoryRight = right;
1045
+ if (this._accessoryView !== null){
1046
+ accessorySize = JSSize(this._accessorySize || this._accessoryView.intrinsicSize);
1047
+ if (accessorySize.height === UIView.noIntrinsicSize){
1048
+ accessorySize.height = lineHeight;
1049
+ }
1050
+ if (accessorySize.width === UIView.noIntrinsicSize){
1051
+ accessorySize.width = accessorySize.height;
1052
+ }
1053
+ var baseline = this._accessoryView.firstBaselineOffsetFromTop;
1054
+ if (baseline === 0){
1055
+ this._accessoryView.frame = JSRect(
1056
+ accessoryRight - accessorySize.width,
1057
+ Math.floor(this.contentInsets.top + ((lineHeight - accessorySize.height) / 2)),
1058
+ accessorySize.width,
1059
+ accessorySize.height
1060
+ );
1061
+ }else{
1062
+ this._accessoryView.frame = JSRect(
1063
+ accessoryRight - accessorySize.width,
1064
+ Math.floor(this.contentInsets.top + this.titleLabel.firstBaselineOffsetFromTop - baseline),
1065
+ accessorySize.width,
1066
+ accessorySize.height
1067
+ );
1068
+ }
1069
+ right -= accessorySize.width + this.contentInsets.right;
1070
+ }
1020
1071
  if (this._submenuImageView !== null && !this._submenuImageView.hidden){
1021
1072
  this._submenuImageView.frame = JSRect(right - this._submenuImageView.frame.size.width, this.contentInsets.top, imageSize, imageSize);
1022
1073
  right -= this._submenuImageView.frame.size.width + this.contentInsets.right;
@@ -1025,7 +1076,7 @@ JSClass("UIMenuItemView", UIView, {
1025
1076
  right -= this.keyWidth;
1026
1077
  this._keyModifierLabel.frame = JSRect(right - this._keyModifierLabel.frame.size.width, this.contentInsets.top, this._keyModifierLabel.frame.size.width, this._keyModifierLabel.font.displayLineHeight);
1027
1078
  right -= this._keyModifierLabel.frame.size.width + this.contentInsets.right;
1028
- }else{
1079
+ }else if (this._accessoryView !== null){
1029
1080
  right += this.contentInsets.right - this.contentInsets.left;
1030
1081
  if (item.menu.showStatusColumn){
1031
1082
  right -= imageSize + this.contentInsets.left;
@@ -1063,6 +1114,16 @@ JSClass("UIMenuItemView", UIView, {
1063
1114
  size.width += imageSize + this.contentInsets.left;
1064
1115
  }
1065
1116
  }
1117
+ if (this._accessoryView !== null){
1118
+ var accessorySize = JSSize(this._accessorySize || this._accessoryView.intrinsicSize);
1119
+ if (accessorySize.height === UIView.noIntrinsicSize){
1120
+ accessorySize.height = lineHeight;
1121
+ }
1122
+ if (accessorySize.width === UIView.noIntrinsicSize){
1123
+ accessorySize.width = accessorySize.height;
1124
+ }
1125
+ size.width += accessorySize.width + this.contentInsets.right;
1126
+ }
1066
1127
  size.height = lineHeight + this.contentInsets.top + this.contentInsets.bottom;
1067
1128
  size.width = Math.ceil(size.width);
1068
1129
  size.height = Math.ceil(size.height);
@@ -30,6 +30,14 @@ JSClass("UIViewController", UIResponder, {
30
30
  // MARK: - Creating a View Controller
31
31
 
32
32
  init: function(){
33
+ if (JSBundle.mainBundle !== null){
34
+ var spec = JSSpec.initWithResource(this.$class.className);
35
+ if (spec !== null){
36
+ if (!spec.initializeFilesOwner(this)){
37
+ return null;
38
+ }
39
+ }
40
+ }
33
41
  },
34
42
 
35
43
  initWithSpec: function(spec){
@@ -158,6 +158,7 @@ JSClass('UIWindow', UIView, {
158
158
  this.setNeedsLayout();
159
159
  this._styler.updateWindow(this);
160
160
  this.postAccessibilityNotification(UIAccessibility.Notification.labelChanged);
161
+ this.windowServer.windowDidChangeTitle(this);
161
162
  },
162
163
 
163
164
  setIcon: function(icon){
@@ -1354,6 +1354,9 @@ JSClass("UIWindowServer", JSObject, {
1354
1354
  }, this);
1355
1355
  },
1356
1356
 
1357
+ windowDidChangeTitle: function(window){
1358
+ }
1359
+
1357
1360
  });
1358
1361
 
1359
1362
  UIWindowServer.ResizeOperation = {
@@ -1,6 +1,6 @@
1
1
  JSBundleType: framework
2
2
  JSBundleIdentifier: io.breakside.JSKit.UIKitTesting
3
- JSBundleVersion: 2025.27.1
3
+ JSBundleVersion: 2025.32.0
4
4
  JSDevelopmentLanguage: en
5
5
  JSCopyright: Copyright © 2020 Breakside Inc.
6
6
  JSLicenseNotice: |
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "node": ">=10.10.0"
10
10
  },
11
11
  "name": "@breakside/jskit",
12
- "version": "2025.27.1",
12
+ "version": "2025.32.0",
13
13
  "license": "SEE LICENSE IN LICENSE.txt",
14
14
  "files": [
15
15
  "*"