Sfoglia il codice sorgente

单元测试集成

huqi 5 anni fa
parent
commit
86026defe9

+ 1 - 1
o2web/package.json

@@ -5,7 +5,7 @@
   "main": "o2.js",
   "scripts": {
     "build": "gulp",
-    "report-coverage": "codecov"
+    "test": "karma start source/x_test/karma.FindDesigner.js --auto-watch"
   },
   "repository": {
     "type": "git",

+ 1 - 1
o2web/source/o2_core/o2.js

@@ -21,7 +21,7 @@
  *  GNU Affero General Public License for more details.
  *
  *  You should have received a copy of the GNU General Public License
- *  along with Foobar.  If not, see <https://www.gnu.org/licenses/>.
+ *  along with O2OA.  If not, see <https://www.gnu.org/licenses/>.
  *
  * ***** END LICENSE BLOCK ******/
 

+ 1 - 1
o2web/source/o2_core/o2/xDesktop/$Default/blue/layout-pc.html

@@ -17,7 +17,7 @@
             <div style="display: table-row"><div class="layout_content_taskbar" data-o2-element="taskbarNode">
                 <div class="layout_content_taskbar_area">
                     <div class="layout_content_taskbar_area_user" data-o2-element="userInforNode">
-                        <div class="layout_content_taskbar_area_user_icon" style="background-image: url({{$.user.iconUrl}});"></div>
+                        <div class="layout_content_taskbar_area_user_icon"></div>
                         <div class="layout_content_taskbar_area_user_text">{{ $.user.name }}</div>
                     </div>
 

+ 47 - 8
o2web/source/o2_core/o2/xDesktop/Default.js

@@ -52,7 +52,7 @@ o2.xDesktop.Default = new Class({
         if (this.status && this.status.flatStyle) this.options.style = this.status.flatStyle;
     },
 
-    load: function(){
+    load: function(cb){
         this.loadLayout(function(){
             this.setEvent();
             if (!this.noDefault) this.loadDefaultPage();
@@ -63,6 +63,8 @@ o2.xDesktop.Default = new Class({
                     this.loadDefaultLnk();
 
                     this.loadStatus();
+
+                    if (cb) cb();
                 }.bind(this));
 
                 this.openWebSocket();
@@ -167,21 +169,45 @@ o2.xDesktop.Default = new Class({
 
 
     loadLayout: function(callback){
-        this.session.user.iconUrl = o2.Actions.get("x_organization_assemble_control").getPersonIcon(this.session.user.id);
-        //var css = this.path+this.options.style+ ((o2.session.isMobile || layout.mobile) ? "/style-mobile.css" : "/style-pc.css");
+        this.session.user.iconUrl = o2.filterUrl(o2.Actions.get("x_organization_assemble_control").getPersonIcon(this.session.user.id));
+
         var css = this.path+this.options.style+ ((o2.session.isMobile || layout.mobile) ? "/style-pc.css" : "/style-pc.css");
         var skinCss = this.path+this.options.style+ "/style-skin.css";
-        //var html = this.path+this.options.style+((o2.session.isMobile || layout.mobile) ? "/layout-mobile.html" : "/layout-pc.html");
         var html = this.path+this.options.style+((o2.session.isMobile || layout.mobile) ? "/layout-pc.html" : "/layout-pc.html");
 
         this.node.loadAll({ "css": [css], "html": [html]}, {"bind": {"user": this.session.user}, "module": this},function(){
+            var oReq = new XMLHttpRequest();
+            debugger;
+            oReq.addEventListener("load", function(){
+                var reader  = new FileReader();
+                reader.addEventListener("load", function () {
+                    this.userInforNode.getFirst().setStyle("background-image", "url("+reader.result+")");
+                }.bind(this), false);
+                reader.readAsDataURL(oReq.response);
+            }.bind(this));
+            oReq.open("GET", this.session.user.iconUrl);
+            oReq.setRequestHeader("authorization", layout.session.user.token);
+            oReq.responseType = "blob";
+            oReq.withCredentials = true;
+            oReq.send();
+
+            // var res = new Request({
+            //     "url": this.session.user.iconUrl,
+            //     method: "get",
+            //     withCredentials: true,
+            //     onSuccess: function(response,a,s,d){
+            //
+            //     }.bind(this)
+            // });
+            // res.setHeader("authorization", layout.session.user.token);
+            // res.send();
+
             this.node.loadCss(skinCss);
             if (callback) callback();
             // this.node.load(html, {
             //     "bind": {"user": this.session.user}
             // }, function(){});
         }.bind(this));
-
     },
 
 
@@ -483,9 +509,22 @@ o2.xDesktop.Default = new Class({
             }
         }.bind(this));
         var status = this.getLayoutStatusData();
-        o2.UD.putData("layout", status, function(){
-            if (callback) callback();
-        });
+
+        // if (navigator.sendBeacon) {
+        //     var obj = this.personalAction.action.actions["putUserData"];
+        //     var url = this.personalAction.action.address + obj.uri;
+        //     url = url.replace("{name}", "layout");
+        //     navigator.sendBeacon(url, status);
+        // } else {
+       try{
+           o2.UD.putData("layout", status, function(){
+               if (callback) callback();
+           });
+       }catch(e){};
+
+        // }
+
+
     },
     getLayoutStatusData: function(){
         var status = {

+ 7 - 1
o2web/source/x_desktop/js/base.js

@@ -18,7 +18,13 @@ o2.xDesktop.requireApp = function (module, clazz, callback, async) {
     layout.readys = [];
     layout.addReady = function () {
         for (var i = 0; i < arguments.length; i++) {
-            if (o2.typeOf(arguments[i]) === "function") layout.readys.push(arguments[i]);
+            if (o2.typeOf(arguments[i]) === "function"){
+                if (layout.isReady){
+                    arguments[i].apply(window);
+                }else{
+                    layout.readys.push(arguments[i]);
+                }
+            }
         }
     };
     var _requireApp = function (appNames, callback, clazzName) {

+ 1 - 0
o2web/source/x_desktop/js/base_loader.js

@@ -89,6 +89,7 @@ o2.addReady(function () {
             }
 
             _loadProgressBar(true);
+            layout.isReady = true;
             while (layout.readys && layout.readys.length) {
                 layout.readys.shift().apply(window);
             }

+ 26 - 19
o2web/source/x_test/karma.FindDesigner.js

@@ -6,39 +6,46 @@ module.exports = function(config) {
         basePath: '../',
         frameworks: ['jasmine'],
         files: [
-            {pattern:'o2_lib/mootools/mootools-1.6.0_all.js', included: true, nocache: true},
-            {pattern:'o2_core/o2.js', included: true, nocache: true},
-            {pattern:'x_desktop/js/base.js', included: true, nocache: true},
-            {pattern:'x_test/o2TestLoader.js', included: true, nocache: true},
-            {pattern:'x_desktop/css/style.css', included: true, nocache: true},
-            {pattern:'x_desktop/css/mBoxNotice.css', included: true, nocache: true},
-            {pattern:'x_desktop/css/mBoxTooltip.css', included: true, nocache: true},
+            {pattern:'o2_lib/mootools/mootools-1.6.0_all.js', included: true, nocache: true, watched: true},
+            {pattern:'o2_core/o2.js', included: true, nocache: true, watched: true},
+            {pattern:'x_desktop/js/base.js', included: true, nocache: true, watched: true},
+            {pattern:'x_test/o2TestConfig.js', included: true, nocache: true, watched: true},
+            {pattern:'x_test/o2TestLoader.js', included: true, nocache: true, watched: true},
+            {pattern:'x_desktop/css/style.css', included: true, nocache: true, watched: true},
+            {pattern:'x_desktop/css/mBoxNotice.css', included: true, nocache: true, watched: true},
+            {pattern:'x_desktop/css/mBoxTooltip.css', included: true, nocache: true, watched: true},
 
-            {pattern:'o2_core/**/*.*', included: false, nocache: true},
-            {pattern:'o2_lib/adapter/adapter.js', included: false, nocache: true},
-            {pattern:'x_desktop/**/*.*', included: false, nocache: true},
-            {pattern:'x_component_Common/**/*.*', included: false, nocache: true},
-            {pattern:'x_component_Template/**/*.*', included: false, nocache: true},
-            {pattern:'x_component_FindDesigner/**/*.!(spec).*', included: false, nocache: true},
+            {pattern:'o2_core/**/*.*', included: false, nocache: true, watched: true},
+            {pattern:'o2_lib/adapter/adapter.js', included: false, nocache: true, watched: true},
+            {pattern:'x_desktop/**/*.*', included: false, nocache: true, watched: true},
+            {pattern:'x_component_Common/**/*.*', included: false, nocache: true, watched: true},
+            {pattern:'x_component_Template/**/*.*', included: false, nocache: true, watched: true},
+            {pattern:'x_component_Homepage/**/*.*', included: false, nocache: true, watched: true},
 
-            {pattern:'x_component_FindDesigner/test/*.spec.js', included: true, nocache: true}
+            {pattern:'x_component_FindDesigner/test/*.spec.js', included: true, nocache: true, watched: true},
+
+            {pattern:'x_component_FindDesigner/**/*.*', included: false, nocache: true, watched: true}
 
         ],
         proxies: {
             "/": "/base/"
         },
         exclude: [
+
         ],
 
-        preprocessors: {
-        },
-        reporters: ['progress'],
+        // preprocessors: {
+        // },
+        // reporters: ["coverage"],
+        // preprocessors: {
+        //     "**/*.js": "coverage"
+        // },
         port: 9876,
         colors: true,
         logLevel: config.LOG_INFO,
-        autoWatch: false,
+        autoWatch: true,
         browsers: ['Chrome'],
-        singleRun: true,
+        singleRun: false,
         concurrency: Infinity
     });
 };

+ 180 - 0
o2web/source/x_test/o2TestConfig.js

@@ -0,0 +1,180 @@
+layout.config = {
+    "center": [
+        {
+            "port": "20030",
+            "host": "develop.o2oa.net"
+        }
+    ],
+    "initManagerChanged": true,
+    "initManagerName": "",
+    "initManagerPassword": "",
+    "footer": "开发系统Local",
+    "title": "o2oa开发平台local",
+    "app_protocol": "auto",
+    "loginPage": {
+        "enable": false,
+        "portal": "b82d7669-85d6-4c10-8151-c4d1f18ba6ef",
+        "page": ""
+    },
+    "configMapping": {
+        "localhost": {
+            "center": {
+                "port": "20030",
+                "host": "develop.o2oa.net"
+            },
+            "servers": {
+                "x_portal_assemble_designer": {
+                    "name": "门户设计",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_portal_assemble_designer"
+                },
+                "x_portal_assemble_surface": {
+                    "name": "门户",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_portal_assemble_surface"
+                },
+                "x_query_assemble_surface": {
+                    "name": "数据查询",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_query_assemble_surface"
+                },
+                "x_file_assemble_control": {
+                    "name": "云文件",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_file_assemble_control"
+                },
+                "x_organization_assemble_control": {
+                    "name": "组织管理",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_organization_assemble_control"
+                },
+                "x_cms_assemble_control": {
+                    "name": "内容管理",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_cms_assemble_control"
+                },
+                "x_mind_assemble_control": {
+                    "name": "脑图",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_mind_assemble_control"
+                },
+                "x_query_assemble_designer": {
+                    "name": "数据查询设计",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_query_assemble_designer"
+                },
+                "x_general_assemble_control": {
+                    "name": "公共模块",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_general_assemble_control"
+                },
+                "x_processplatform_assemble_surface": {
+                    "name": "流程",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_processplatform_assemble_surface"
+                },
+                "x_processplatform_assemble_designer": {
+                    "name": "流程设计",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_processplatform_assemble_designer"
+                },
+                "x_meeting_assemble_control": {
+                    "name": "会议管理",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_meeting_assemble_control"
+                },
+                "x_processplatform_assemble_bam": {
+                    "name": "流程监控",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_processplatform_assemble_bam"
+                },
+                "x_hotpic_assemble_control": {
+                    "name": "热点图片",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_hotpic_assemble_control"
+                },
+                "x_jpush_assemble_control": {
+                    "name": "极光推送服务模块",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_jpush_assemble_control"
+                },
+                "x_attendance_assemble_control": {
+                    "name": "考勤管理",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_attendance_assemble_control"
+                },
+                "x_bbs_assemble_control": {
+                    "name": "论坛",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_bbs_assemble_control"
+                },
+                "x_processplatform_service_processing": {
+                    "name": "流程服务",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_processplatform_service_processing"
+                },
+                "x_organization_assemble_express": {
+                    "name": "组织管理接口服务",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_organization_assemble_express"
+                },
+                "x_organization_assemble_personal": {
+                    "name": "组织管理个人",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_organization_assemble_personal"
+                },
+                "x_component_assemble_control": {
+                    "name": "组件",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_component_assemble_control"
+                },
+                "x_message_assemble_communicate": {
+                    "name": "消息通讯",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_message_assemble_communicate"
+                },
+                "x_query_service_processing": {
+                    "name": "数据查询服务",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_query_service_processing"
+                },
+                "x_organization_assemble_authentication": {
+                    "name": "组织管理认证",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_organization_assemble_authentication"
+                },
+                "x_calendar_assemble_control": {
+                    "name": "日程管理",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_calendar_assemble_control"
+                }
+            }
+        }
+
+    }
+};

+ 85 - 187
o2web/source/x_test/o2TestLoader.js

@@ -1,186 +1,3 @@
-o2test = window.o2test || {};
-
-layout.config = {
-    "center": [
-        {
-            "port": "20030",
-            "host": "develop.o2oa.net"
-        }
-    ],
-    "initManagerChanged": true,
-    "initManagerName": "",
-    "initManagerPassword": "",
-    "footer": "开发系统Local",
-    "title": "o2oa开发平台local",
-    "app_protocol": "auto",
-    "loginPage": {
-        "enable": false,
-        "portal": "b82d7669-85d6-4c10-8151-c4d1f18ba6ef",
-        "page": ""
-    },
-    "configMapping": {
-        "localhost": {
-            "center": {
-                "port": "20030",
-                "host": "develop.o2oa.net"
-            },
-            "servers": {
-                "x_portal_assemble_designer": {
-                    "name": "门户设计",
-                    "host": "develop.o2oa.net",
-                    "port": 20020,
-                    "context": "/x_portal_assemble_designer"
-                },
-                "x_portal_assemble_surface": {
-                    "name": "门户",
-                    "host": "develop.o2oa.net",
-                    "port": 20020,
-                    "context": "/x_portal_assemble_surface"
-                },
-                "x_query_assemble_surface": {
-                    "name": "数据查询",
-                    "host": "develop.o2oa.net",
-                    "port": 20020,
-                    "context": "/x_query_assemble_surface"
-                },
-                "x_file_assemble_control": {
-                    "name": "云文件",
-                    "host": "develop.o2oa.net",
-                    "port": 20020,
-                    "context": "/x_file_assemble_control"
-                },
-                "x_organization_assemble_control": {
-                    "name": "组织管理",
-                    "host": "develop.o2oa.net",
-                    "port": 20020,
-                    "context": "/x_organization_assemble_control"
-                },
-                "x_cms_assemble_control": {
-                    "name": "内容管理",
-                    "host": "develop.o2oa.net",
-                    "port": 20020,
-                    "context": "/x_cms_assemble_control"
-                },
-                "x_mind_assemble_control": {
-                    "name": "脑图",
-                    "host": "develop.o2oa.net",
-                    "port": 20020,
-                    "context": "/x_mind_assemble_control"
-                },
-                "x_query_assemble_designer": {
-                    "name": "数据查询设计",
-                    "host": "develop.o2oa.net",
-                    "port": 20020,
-                    "context": "/x_query_assemble_designer"
-                },
-                "x_general_assemble_control": {
-                    "name": "公共模块",
-                    "host": "develop.o2oa.net",
-                    "port": 20020,
-                    "context": "/x_general_assemble_control"
-                },
-                "x_processplatform_assemble_surface": {
-                    "name": "流程",
-                    "host": "develop.o2oa.net",
-                    "port": 20020,
-                    "context": "/x_processplatform_assemble_surface"
-                },
-                "x_processplatform_assemble_designer": {
-                    "name": "流程设计",
-                    "host": "develop.o2oa.net",
-                    "port": 20020,
-                    "context": "/x_processplatform_assemble_designer"
-                },
-                "x_meeting_assemble_control": {
-                    "name": "会议管理",
-                    "host": "develop.o2oa.net",
-                    "port": 20020,
-                    "context": "/x_meeting_assemble_control"
-                },
-                "x_processplatform_assemble_bam": {
-                    "name": "流程监控",
-                    "host": "develop.o2oa.net",
-                    "port": 20020,
-                    "context": "/x_processplatform_assemble_bam"
-                },
-                "x_hotpic_assemble_control": {
-                    "name": "热点图片",
-                    "host": "develop.o2oa.net",
-                    "port": 20020,
-                    "context": "/x_hotpic_assemble_control"
-                },
-                "x_jpush_assemble_control": {
-                    "name": "极光推送服务模块",
-                    "host": "develop.o2oa.net",
-                    "port": 20020,
-                    "context": "/x_jpush_assemble_control"
-                },
-                "x_attendance_assemble_control": {
-                    "name": "考勤管理",
-                    "host": "develop.o2oa.net",
-                    "port": 20020,
-                    "context": "/x_attendance_assemble_control"
-                },
-                "x_bbs_assemble_control": {
-                    "name": "论坛",
-                    "host": "develop.o2oa.net",
-                    "port": 20020,
-                    "context": "/x_bbs_assemble_control"
-                },
-                "x_processplatform_service_processing": {
-                    "name": "流程服务",
-                    "host": "develop.o2oa.net",
-                    "port": 20020,
-                    "context": "/x_processplatform_service_processing"
-                },
-                "x_organization_assemble_express": {
-                    "name": "组织管理接口服务",
-                    "host": "develop.o2oa.net",
-                    "port": 20020,
-                    "context": "/x_organization_assemble_express"
-                },
-                "x_organization_assemble_personal": {
-                    "name": "组织管理个人",
-                    "host": "develop.o2oa.net",
-                    "port": 20020,
-                    "context": "/x_organization_assemble_personal"
-                },
-                "x_component_assemble_control": {
-                    "name": "组件",
-                    "host": "develop.o2oa.net",
-                    "port": 20020,
-                    "context": "/x_component_assemble_control"
-                },
-                "x_message_assemble_communicate": {
-                    "name": "消息通讯",
-                    "host": "develop.o2oa.net",
-                    "port": 20020,
-                    "context": "/x_message_assemble_communicate"
-                },
-                "x_query_service_processing": {
-                    "name": "数据查询服务",
-                    "host": "develop.o2oa.net",
-                    "port": 20020,
-                    "context": "/x_query_service_processing"
-                },
-                "x_organization_assemble_authentication": {
-                    "name": "组织管理认证",
-                    "host": "develop.o2oa.net",
-                    "port": 20020,
-                    "context": "/x_organization_assemble_authentication"
-                },
-                "x_calendar_assemble_control": {
-                    "name": "日程管理",
-                    "host": "develop.o2oa.net",
-                    "port": 20020,
-                    "context": "/x_calendar_assemble_control"
-                }
-            }
-        }
-
-    }
-};
-
 
 function o2TestLoader() {
     //o2.base = "base/";
@@ -284,11 +101,15 @@ function o2TestLoader() {
                 layout.desktop.session = layout.session;
                 _loadApp();
             } else {
-                o2.Actions.load("x_organization_assemble_authentication").AuthenticationAction.login({"credential":o2test.username,"password":o2test.password}, function (json) {
-                    _loadApp(json);
-                }.bind(this), function (xhr, text, error) {
+                if (o2Unit.username){
+                    o2.Actions.load("x_organization_assemble_authentication").AuthenticationAction.login({"credential":o2Unit.username,"password":o2Unit.password}, function (json) {
+                        _loadApp(json);
+                    }.bind(this), function (xhr, text, error) {
+                        layout.openLogin();
+                    }.bind(this));
+                }else{
                     layout.openLogin();
-                }.bind(this));
+                }
             }
         });
         //_loadApp();
@@ -363,3 +184,80 @@ function o2TestLoader() {
     //});
 };
 
+o2Unit = {
+    //options: {
+    //  "username": "",
+    //  "password": "",
+    //  "anonymous": false (default) or true,
+    //  "mode": "spa"(default) or "mpa"
+    // }
+    init: function(options, fn){
+        this.username = options.username;
+        this.password = options.password;
+        layout.anonymous = (options.anonymous===true);
+        this.mode = options.mode || "spa";
+        o2.addReady(o2TestLoader);
+        layout.addReady(function(){
+            this["load_"+this.mode](function(){
+                if (fn) fn.apply(window);
+            });
+        }.bind(this));
+        //if (fn) layout.addReady(fn);
+    },
+    load_spa: function(fn){
+        var html = "<div id=\"layout_main\" style=\"overflow: hidden; height: 100%; background-position-x: center; background-size: cover;\">\n" +
+            "        <div id=\"layout_top_shim\"></div>\n" +
+            "        <div id=\"layout_top\"></div>\n" +
+            "        <div id=\"layout_desktop\">\n" +
+            "            <div id=\"desktop_content\"></div>\n" +
+            "            <div id=\"desktop_navi\"></div>\n" +
+            "        </div>\n" +
+            "    </div>"
+        document.body.appendHTML(html);
+        layout.inBrowser = false;
+        debugger;
+        layout.desktop.type = "layout";
+        layout.viewMode = "Default";
+        var _load = function(){
+            layout.userLayout = {};
+            layout.userLayout.apps = {};
+            MWF.require("MWF.xDesktop.Default", function(){
+                layout.desktop = new MWF.xDesktop.Default("layout_main", {});
+                layout.desktop.load(function(){
+                    if (fn) fn();
+                });
+                if (!layout.desktop.openApplication) layout.desktop.openApplication = layout.openApplication;
+                if (!layout.desktop.refreshApp) layout.desktop.refreshApp = layout.refreshApp;
+            });
+        };
+        if (layout.session && layout.session.user){
+            _load();
+        }else{
+            if (layout.sessionPromise){
+                layout.sessionPromise.then(function(){
+                    _load();
+                },function(){});
+            }
+        }
+    },
+    load_mpa: function(fn){
+        var html = "<div id=\"appContent\" style=\"overflow: hidden; height:100%; background-color:#EEE\"></div>";
+        document.body.appendHTML(html);
+        if (fn) fn();
+    },
+    openApplication: function(fn, appNames, options){
+        var option = options || {};
+        option.onPostLoadApplication = function(){
+            this.runPostLoadApplication = true;
+            if (fn) fn();
+        };
+        option.postLoad = function(){
+            if (!this.runPostLoadApplication) if (fn) fn();
+        }
+        var args = Array.from(arguments);
+        args.shift();
+        args.unshift(null);
+        if (!options) args.push(option);
+        layout.openApplication.apply(layout, args);
+    }
+};