Salesforce LightningExperience内でのキャッシュによるコンポーネントのアクセス権の削除と他にヤバイのがないか調査

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をクリアしたら動作するようになった。

念のため、他にも同様にキャッシュで削除されるコンポーネント定義がないか確認した。

キャッシュ前後のコンポーネント定義はブラウザのコンソールから

```js
copy(JSON.stringify($A.componentService.$componentDefRegistry$));
```

後にローカルに保存、その後以下で確認。

```js
'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, '  '));
```

結果は以下。

```js
{
  "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"が消えたのが若干気になる。