LoginSignup
2
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-07-08

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

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1