@breakside/jskit 2025.27.1 → 2025.29.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.
- 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/JSObject.js +5 -6
- package/Frameworks/Foundation.jsframework/JS/JSSpec.js +21 -7
- 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/JSObject.js +5 -6
- package/Root/Frameworks/Foundation/JSSpec.js +21 -7
- 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/UIMenuItem.js +8 -0
- package/Root/Frameworks/UIKit/UIMenuView.js +72 -11
- package/Root/Frameworks/UIKit/UIViewController.js +8 -0
- package/Root/Frameworks/UIKitTesting/Info.yaml +1 -1
- 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.
|
|
4
|
+
"JSBundleVersion": "2025.29.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": "
|
|
12
|
+
"GitRevision": "be18b8fea94119323c065579b9376a89dccb309e"
|
|
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.
|
|
6
|
+
"JSBundleVersion": "2025.29.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": "
|
|
14
|
+
"GitRevision": "be18b8fea94119323c065579b9376a89dccb309e"
|
|
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.
|
|
4
|
+
"JSBundleVersion": "2025.29.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": "
|
|
11
|
+
"GitRevision": "be18b8fea94119323c065579b9376a89dccb309e"
|
|
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.
|
|
6
|
+
"JSBundleVersion": "2025.29.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": "
|
|
13
|
+
"GitRevision": "be18b8fea94119323c065579b9376a89dccb309e"
|
|
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.
|
|
4
|
+
"JSBundleVersion": "2025.29.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": "
|
|
12
|
+
"GitRevision": "be18b8fea94119323c065579b9376a89dccb309e"
|
|
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
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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
|
-
|
|
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.
|
|
6
|
+
"JSBundleVersion": "2025.29.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": "
|
|
14
|
+
"GitRevision": "be18b8fea94119323c065579b9376a89dccb309e"
|
|
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.
|
|
4
|
+
"JSBundleVersion": "2025.29.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": "
|
|
12
|
+
"GitRevision": "be18b8fea94119323c065579b9376a89dccb309e"
|
|
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.
|
|
6
|
+
"JSBundleVersion": "2025.29.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": "
|
|
14
|
+
"GitRevision": "be18b8fea94119323c065579b9376a89dccb309e"
|
|
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.
|
|
4
|
+
"JSBundleVersion": "2025.29.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": "
|
|
11
|
+
"GitRevision": "be18b8fea94119323c065579b9376a89dccb309e"
|
|
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.
|
|
6
|
+
"JSBundleVersion": "2025.29.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": "
|
|
13
|
+
"GitRevision": "be18b8fea94119323c065579b9376a89dccb309e"
|
|
14
14
|
},
|
|
15
15
|
"Resources": [
|
|
16
16
|
{
|
|
@@ -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
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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
|
-
|
|
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.
|
|
@@ -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]]
|
|
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]]
|
|
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){
|