Lightningコンポーネントを開発中の組織で重要な更新「Lightning コンポーネントのアクセス権チェックを適用」を有効化したところ、以下のエラーが発生した。
[NoErrorObjectAvailable] Access Check Failed! AuraComponentService.createComponentFromConfig(): 'markup://ltng:require' is not visible to 'markup://c:ComponentList {8:1;0}'.
at AuraErrorInternal (https://sve-demo3-dev-ed.lightning.force.com/auraFW/javascript/EZiSdYd2AzD0_AGai4U5jQ/aura_proddebug.js:2959:31)
at new AuraError (https://sve-demo3-dev-ed.lightning.force.com/auraFW/javascript/EZiSdYd2AzD0_AGai4U5jQ/aura_proddebug.js:2978:21)
at AuraInstance.$reportError$ (https://sve-demo3-dev-ed.lightning.force.com/auraFW/javascript/EZiSdYd2AzD0_AGai4U5jQ/aura_proddebug.js:14660:144)
at https://sve-demo3-dev-ed.lightning.force.com/auraFW/javascript/EZiSdYd2AzD0_AGai4U5jQ/aura_proddebug.js:16494:8
at Logger.$notify$ (https://sve-demo3-dev-ed.lightning.force.com/auraFW/javascript/EZiSdYd2AzD0_AGai4U5jQ/aura_proddebug.js:2727:16)
at Logger.log (https://sve-demo3-dev-ed.lightning.force.com/auraFW/javascript/EZiSdYd2AzD0_AGai4U5jQ/aura_proddebug.js:2719:10)
at Logger.error (https://sve-demo3-dev-ed.lightning.force.com/auraFW/javascript/EZiSdYd2AzD0_AGai4U5jQ/aura_proddebug.js:2695:8)
at AuraInstance.error (https://sve-demo3-dev-ed.lightning.force.com/auraFW/javascript/EZiSdYd2AzD0_AGai4U5jQ/aura_proddebug.js:14618:17)
at AuraComponentService.$createComponentPriv$ (https://sve-demo3-dev-ed.lightning.force.com/auraFW/javascript/EZiSdYd2AzD0_AGai4U5jQ/aura_proddebug.js:10866:12)
at componentConstructor.Component.$createComponentStack$ (https://sve-demo3-dev-ed.lightning.force.com/auraFW/javascript/EZiSdYd2AzD0_AGai4U5jQ/aura_proddebug.js:5081:49)
http://mino0123.github.io/slides/20160622-meetup-summer16_lightning.html#/3
の件があったので、試しにindexedDBをクリアしたら動作するようになった。
念のため、他にも同様にキャッシュで削除されるコンポーネント定義がないか確認した。
キャッシュ前後のコンポーネント定義はブラウザのコンソールから
copy(JSON.stringify($A.componentService.$componentDefRegistry$));
後にローカルに保存、その後以下で確認。
'use strict';
var src = require('./original.json');
var dst = require('./cached.json');
class Context {
constructor() {
this._propStack = [];
this.diffs = {};
}
reportDiff(src, dst) {
const name = this._propStack.join('.');
this.diffs[name] = [src, dst];
}
next(prop) {
this._propStack.push(prop);
}
pop() {
this._propStack.pop();
}
}
function unique(arr) {
return arr.filter((item, i) => arr.indexOf(item) === i);
}
function diff(ctx, src, dst) {
if (src == null || dst == null) {
if (src != dst) {
if (src == null) return;// キャッシュ前になかったオブジェクトは見逃す
ctx.reportDiff(src, dst);
}
return;
}
if (src.constructor !== dst.constructor) {// JSONなので継承とか考えなくていい。
ctx.reportDiff(src, dst);
return;
}
// primitive
if (typeof src !== 'object') {
if (src !== dst) {
ctx.reportDiff(src, dst);
}
return;
}
// array
if (Array.isArray(src)) {
var length = Math.max(src.length, dst.length);
for (var i = 0; i < length; i++) {
ctx.next(i);
diff(ctx, src[i], dst[i]);
ctx.pop();
}
return;
}
// object
var srcKeys = Object.keys(src);
var dstKeys = Object.keys(dst);
var allKeys = srcKeys.concat(dstKeys);
unique(allKeys).forEach((k) => {
ctx.next(k);
diff(ctx, src[k], dst[k]);
ctx.pop();
});
}
var ctx = new Context();
diff(ctx, src, dst);
console.log(JSON.stringify(ctx.diffs, null, ' '));
結果は以下。
{
"markup://one:auraContainer.$styleClassName$": [
"",
null
],
"markup://one:content.$styleClassName$": [
"oneContent ",
null
],
"markup://ltng:require.$access$": [
"G",
null
],
"markup://ltng:require.$registerEventDefs$.afterScriptsLoaded.$access$": [
"G",
null
],
"markup://ltng:require.$registerEventDefs$.beforeLoadingResources.$access$": [
"G",
null
]
}
権限定義が消滅したのはltng:requireとその配下の属性のみだが、 one:content.$styleClassName$
の"oneContent"が消えたのが若干気になる。