diff --git a/src/js/src/js/solitude.js b/src/js/src/js/solitude.js index d25ad5b..8305231 100644 --- a/src/js/src/js/solitude.js +++ b/src/js/src/js/solitude.js @@ -4,7 +4,8 @@ global.solitude = solitude = global.solitude || { "variant": "web", get global() { return global; }, - get postMessage() { return global.postMessage }, + //ネイティブ関数は別名つけられないらしいのでラップする + get postMessage() { return message => global.postMessage(message)}, get createURL() { return global.URL.createObjectURL }, get main() { return global.parent }, get origin() { return global.parent.location.origin }, @@ -12,24 +13,22 @@ get console() { return global.parent.console }, get message() { return message }, get persistence() { return persistenceFunc }, + get log() { return log }, }; - - const message = { - get post() { return solitude.postMessage }, + + const message = { + get fire() { return fireMessage}, get addListener() { return addMessageListener }, - get removeListener() { return } + get removeListener() { return removeMessageListener } }; - - function addMessageListener(listener, bool) { - bool = bool || false; - global.addEventListener("message", listener, bool); - } - - function removeMessageListener(listener, option, useCapture) { - global.removeEventListener("message", listener) + const log = { + get debug() {return msg => logging("debug", msg)}, + get info() {return msg => logging("info", msg)}, } })(); + + io(solitude); return solitude; @@ -114,6 +113,52 @@ } } + /* + * solitude.message + */ + function fireMessage(message) { + const enveloped = { + h: { + origin: "solitude" + }, + b: message + }; + + solitude.postMessage(enveloped); + } + + function addMessageListener(listener) { + const handler = event => { + if (event.data.h.origin != "solitude") { + return; + } + + listener(event.data.b); + } + //JSONシリアライズ可能なオブジェクトが送信できれば十分 + global.addEventListener("message", handler, false); + return handler; + } + + function removeMessageListener(listener) { + global.removeEventListener("message", listener) + } + + /* + * solitude.log + */ + function logging(level, message) { + solitude.message.fire({ + type: "log", + level: level, + msg: message + }) + } + + + /* + * その他 + */ function noop() { //do nothing } diff --git a/src/js/src/main/app.js b/src/js/src/main/app.js index a6af66f..6270a1d 100644 --- a/src/js/src/main/app.js +++ b/src/js/src/main/app.js @@ -9,7 +9,6 @@ } let Que; - const mainOrgan = solitude.newOrgan; initializeQue(); //アプリケーション毎に初期化操作 @@ -34,28 +33,6 @@ }) - window.addEventListener("message", (event) => { - const appFrame = Que("#main-pane .app-container iframe").get() - expectedOrigin = appFrame.contentWindow.location.origin - if (event.origin != expectedOrigin) { - append("failed!") - append("eventorigin:") - append(event.origin) - append("expectedOrigin:"); - append(expectedOrigin); - return; - } - append("event.data : ") - append(event.data) - try { - const data = JSON.parse(event.data); - solitude.write.local(data.path, data.content); - } catch (error) { - append(error); - } - append("success !") - }); - // 以下、宣言 function toggleMenuItem(element) { if (element.classList.contains("expanded")) { @@ -90,9 +67,11 @@ function initializeQue() { //Queはglobalではない。親スコープで宣言済み。 Que = newQue; - Query.prototype.list = asList - Query.prototype.get = asNode - Query.prototype.que = reQue + Query.prototype = { + get list() {return asList}, + get get() {return asNode}, + get que() {return reQue}, + } function Query(selector, base) { if (base instanceof Query) { @@ -226,7 +205,8 @@ } if(app) { app.instanceID = ++appInstanceID; - app.load(); + app.load(); + solitude.log.info("loaded " + name +", instanceID " + app.instanceID ) } } @@ -261,12 +241,29 @@ addNewMenu(this.name); const mount = Que("#left-menu ol"); const app = this; - mount.que("li.init").get().addEventListener("click", function () { + + if(isInitialized(app.instanceID)) { + return; + } + addNewTab(app); - addNewContent(app); + addNewContent(app); + solitude.log.info(app.name + " is initialized"); }); - mount.que("li.init").get().classList.remove("init"); + mount.que("li.init").get().classList.remove("init"); + } + + function isInitialized(appInstanceID) { + //アプリのタブが出ているかでロード済みかを判断 + let result = false; + Que("#main-tabs li").list().forEach(elem => { + if(appInstanceID == elem.dataset.soloAppId) { + result = true; + } + }); + return result; + } function loadBatchApp() { @@ -290,11 +287,6 @@ } function addNewTab(app) { - /* - タブに対するイベント設定のあたり - val.addEventListener("click", function () { - selectTab(index); - */ const mount = Que("#main-tabs").get(); let tab = Que("#app-tab").get() tab = tab.content.cloneNode(true); @@ -306,7 +298,6 @@ li.addEventListener("click", () => { selectTab(index); - //mainOrgan.fire("log", "open appID:" + app.instanceID + ", appID:" + app.name, solitude.nerve); }); } diff --git a/src/js/src/main/web-conf.js b/src/js/src/main/web-conf.js index eb05d74..b99530c 100644 --- a/src/js/src/main/web-conf.js +++ b/src/js/src/main/web-conf.js @@ -41,6 +41,10 @@ app.new = "main"; app.type = "mainType"; + app.new = "logger"; + app.type = "staticpage"; + app.src = "../simplelog/app.html" + app.new = "mdeditor"; app.type = "iframe"; app.src = "../mdeditor/app.html" @@ -50,10 +54,6 @@ app.src = "../example/app.html" app.prop.loader = fetch; - app.new = "logger"; - app.type = "staticpage"; - app.src = "../simplelog/app.html" - app.new = "bookmark"; app.type = "iframe"; app.src = "../bookmark/app.html" diff --git a/src/js/src/simplelog/app.html b/src/js/src/simplelog/app.html new file mode 100644 index 0000000..8cef661 --- /dev/null +++ b/src/js/src/simplelog/app.html @@ -0,0 +1,23 @@ + + + + + + + + + +
+ + + +
+ + + \ No newline at end of file diff --git a/src/js/src/simplelog/app.js b/src/js/src/simplelog/app.js new file mode 100644 index 0000000..69ee3d0 --- /dev/null +++ b/src/js/src/simplelog/app.js @@ -0,0 +1,23 @@ +(function () { + const sol = window.solitude || graftSolitude(window); + sol.message.addListener(receptLog); + + function receptLog(sign) { + if(sign.type != "log") + return; + + if(sign.level) { + log("[" + sign.level +"]: " + sign.msg); + } else { + log(sign.message); + } + + } + + let count = 0 + function log(stmt) { + const area = document.querySelector("#logarea2"); + area.value = area.value + count + ":" + stmt + "\n"; + count++; + } +})()