├── .gitignore ├── README.md ├── chrome ├── _locales │ ├── en │ │ └── messages.json │ ├── en_US │ │ └── messages.json │ └── zh_CN │ │ └── messages.json ├── background.html ├── debug.html ├── env.html ├── index.html ├── json.html ├── logo.png ├── logoTitle3.png ├── manifest.json ├── manifest_bak.json ├── more.html ├── setting.html └── source │ ├── base-dao.js │ ├── base.css │ ├── constant.js │ ├── content_scripts.js │ ├── crapApi.js │ ├── env-dao.js │ ├── env.js │ ├── iconfont │ ├── iconfont.css │ ├── iconfont.eot │ ├── iconfont.js │ ├── iconfont.json │ ├── iconfont.svg │ ├── iconfont.ttf │ ├── iconfont.woff │ └── iconfont.woff2 │ ├── interface-dao.js │ ├── json.js │ ├── locales │ ├── dev │ │ └── translation.json │ ├── en │ │ └── translation.json │ └── zh-CN │ │ └── translation.json │ ├── module-dao.js │ ├── plug-function.js │ ├── plug.css │ └── tools │ ├── bootstrap.css │ ├── bootstrap.js │ ├── i18next-1.11.2.min.js │ ├── jquery-1.9.1.min.js │ ├── jquery-1.9.1.min.map │ ├── jquery-ui.min.css │ ├── jquery-ui.min.js │ ├── jquery.cookie.js │ ├── jquery.jsonview.css │ └── jquery.jsonview.js └── release ├── 440x280.png ├── 640x400.png ├── 920x680.png └── chrome ├── apiDebug.1.0.8-en.crx ├── apiDebug.v.1.0.7.crx ├── apiDebug.v1.0.4.crx ├── apiDebug.zh.v1.0.0.crx └── dbdonnbbnhgojidhcogkapdldcheclnn_main.crx /.gitignore: -------------------------------------------------------------------------------- 1 | **/.idea 2 | **/*.iml 3 | **/target/ 4 | */*.log 5 | */*.log.* 6 | *.iml 7 | .DS_Store 8 | .project 9 | .settings 10 | .classpath 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ApiDebug & CrapApi-Plug(ApiManager-Plug)区别 2 | ``` 3 | ApiDebug为独立插件,与CrapApi接口管理系统接口数据没有互通,能不依赖服务器运行,服务器仅作数据备份 4 | 5 | CrapApi-Plug为CrapApi接口管理软件的增强插件,不能单独使用,必须为联网状态才能使用,接口数据与管理系统接口一致 6 | ``` 7 | 8 | # ApiDebug(v1.x.x) 9 | ``` 10 | [ApiDebug](https://github.com/EhsanTang/ApiDebug) 是一个浏览器HTTP接口测试插件,可以用来测试HTTP、HTTPS接口。支持POST、GET等方式,同时也支持json、xml等自定义接口参数。系统支持保存历史记录,也可同步测试接口至CrapApi接口管理系统(登陆 http://api.crap.cn ,点击同步即可保存)。除接口测试外,系统还包含json格式化等小工具。 11 | ``` 12 | 13 | # 下载 14 | [谷歌应用商店下载-英文版](https://chrome.google.com/webstore/detail/ieoejemkppmjcdfbnfphhpbfmallhfnc?utm_source=chrome-app-launcher-info-dialog) 15 | 16 | [谷歌应用商店下载-中文版](https://chrome.google.com/webstore/detail/apidebug-http%E6%8E%A5%E5%8F%A3%E8%B0%83%E8%AF%95%E6%8F%92%E4%BB%B6-%E4%B8%AD%E6%96%87%E7%89%88/hoeapaidnfedjfbdghipliboclcighij) 17 | 18 | # 离线下载 19 | [离线下载(下载后需要自行拖到Chrome扩展程序)](http://api.crap.cn/index.do#/article/detail?projectId=help&moduleId=155032424248009000006&type=ARTICLE&id=155037947655301000051): 20 | 21 | [apiDebug.v1.0.4.crx](https://gitee.com/CrapApi/ApiDebug/raw/master/release/chrome/apiDebug.v1.0.4.crx) 22 | 23 | [apiDebug.v1.0.7.crx](https://gitee.com/CrapApi/ApiDebug/raw/master/release/chrome/apiDebug.v.1.0.7.crx) 24 | 25 | [最新离线下载版本请点击查看](http://api.crap.cn/index.do#/article/detail?projectId=help&moduleId=155032424248009000006&type=ARTICLE&id=155037947655301000051) 26 | 27 | ![Chrome](http://img.blog.csdn.net/20170522174505914?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG9ycnl0YW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 28 | [Chrome浏览器插件地址:点击从谷歌应用商店安装](https://chrome.google.com/webstore/detail/ieoejemkppmjcdfbnfphhpbfmallhfnc?utm_source=chrome-app-launcher-info-dialog) 29 | 30 | 如何安装:下载.crx文件后->打开扩展工具[在浏览器地中中输入:chrome://extensions/ 即可]->拖动.crx文件至chrome即可。 31 | 32 | # Suggest「意见&吐槽」 33 | 建议反馈请加QQ群:515305698 34 | 35 | ![QQ群](http://img.blog.csdn.net/20170601193654319?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG9ycnl0YW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
Suggest「意见&吐槽」 36 | [http://api.crap.cn/index.do#/web/article/detail/web/PAGE/APIDEBUG](http://api.crap.cn/index.do#/web/article/detail/web/PAGE/APIDEBUG) 37 | 38 | # keyword 「关键词」 39 | Restfull,API debug,接口调试,开源接口调试,postman,resulteasy 40 | 41 | # effect picture 「效果图」 42 | ![Example](http://img.blog.csdn.net/20170520195634607?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG9ycnl0YW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 43 | ![Example](http://img.blog.csdn.net/20170520195653030?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG9ycnl0YW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 44 | ![Example](http://img.blog.csdn.net/20170520195711810?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG9ycnl0YW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 45 | 46 | 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /chrome/_locales/en/messages.json: -------------------------------------------------------------------------------- 1 | { 2 | "appName": { 3 | "message": "PostWoman Http Test", 4 | "description": "PostWoman Http Test" 5 | }, 6 | "appDesc": { 7 | "message": "PostWoman is a plug for testing RESTful web services, like postman.", 8 | "description":"PostWoman is a plug for testing RESTful web services, like postman." 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /chrome/_locales/en_US/messages.json: -------------------------------------------------------------------------------- 1 | { 2 | "appName": { 3 | "message": "PostWoman Http Test", 4 | "description": "PostWoman Http Test" 5 | }, 6 | "appDesc": { 7 | "message": "PostWoman is a plug for testing RESTful web services, like postman.", 8 | "description":"PostWoman is a plug for testing RESTful web services, like postman." 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /chrome/_locales/zh_CN/messages.json: -------------------------------------------------------------------------------- 1 | { 2 | "appName": { 3 | "message": "PostWoman 接口测试工具", 4 | "description": "PostWoman 接口测试工具" 5 | }, 6 | "appDesc": { 7 | "message": "开发助手,http接口调试,post调试,post模拟.", 8 | "description":"开发助手,http接口调试,post调试,post模拟." 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /chrome/background.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /chrome/debug.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ApiDebug-Http接口调试插件 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 60 | 61 |
62 | 63 | 64 |
65 | 66 |
67 |
68 |    69 | 模块 70 |
71 |
72 |    73 | 历史记录 74 |
75 |
76 | 77 |
78 | 79 |
80 |
81 | 82 | 83 | 333 |
334 | 335 |
336 |
337 |
338 |
339 |
340 |
341 |
342 |
343 |
344 |
345 |
346 | 347 |
348 |
349 |
350 |
351 | 352 | 353 | 354 | 357 | 358 | 359 | 360 | 366 | 367 | 368 | 369 | 373 | 374 | 375 |
接口名 355 | 356 |
模块 361 | 保存到已有的模块(已有模块与新模块名二选一) 362 | 365 |
模块名 370 | 创建新的模块(已有模块与新模块名二选一) 371 | 372 |
376 | 377 | 378 |
379 | 380 |
381 |
382 |
383 | Rename module 384 |
385 |
386 | 387 | 388 | 389 | 393 | 394 | 395 |
Module Name 390 | 391 | 392 |
396 | 397 | 398 |
399 | 400 |
401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | -------------------------------------------------------------------------------- /chrome/env.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ApiDebug-Json工具 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 27 | 28 | 29 | 30 | 31 | 32 | 33 |
34 |
35 |
36 |
37 |    38 | 环境列表 39 |
40 | 41 |
42 | 43 | 添加环境 44 |
45 |
46 | 47 | 48 |
49 |
50 | 51 | 52 | 75 |
76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 |
86 |
87 |
88 | 添加环境 89 |
90 |
91 | 92 | 93 | 94 | 98 | 99 | 100 |
环境名 95 | 96 | 97 |
101 | 102 |
103 | 104 |
105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | -------------------------------------------------------------------------------- /chrome/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ApiDebug-Http接口调试插件 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |
14 |

Crap | Http接口调试插件

15 | 16 | 17 | 接口调试 18 | 19 | 20 | 21 | 22 | Json格式化 23 | 24 | 25 | 26 | 27 | 官网 28 | 29 | 30 | 31 | 32 | 系统设置 33 | 34 | 35 |
36 | 登陆 → 37 |
38 |
39 | 注册 → 40 |
41 | 42 | 43 | 44 |
45 |
46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /chrome/json.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ApiDebug-Json工具 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 23 | 24 | 25 | 调试接口 26 |
27 | 28 | 29 |
30 |
31 | 32 | 33 |
34 | 35 |     Json: 36 |
37 | 38 | 39 | 40 | 41 | 42 | 43 |
44 | 45 |  帮助 46 |
47 | 48 | 49 | 50 |
51 | 52 | 53 | 54 | 55 |
56 | 59 |
60 |
61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /chrome/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EhsanTang/ApiDebug/54b2234633b4448fff545bb0424a22042fde3773/chrome/logo.png -------------------------------------------------------------------------------- /chrome/logoTitle3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EhsanTang/ApiDebug/54b2234633b4448fff545bb0424a22042fde3773/chrome/logoTitle3.png -------------------------------------------------------------------------------- /chrome/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 2, 3 | "version": "1.0.15", 4 | "default_locale": "en", 5 | "name": "__MSG_appName__", 6 | "description": "__MSG_appDesc__", 7 | "author":"ihsantang@163.com", 8 | "icons": { 9 | "64": "logo.png", 10 | "128": "logo.png" 11 | }, 12 | "browser_action": { 13 | "default_icon": "logo.png", 14 | "default_title": "__MSG_appName__", 15 | "default_popup": "index.html" 16 | }, 17 | "permissions": [ 18 | "http://*/*", 19 | "https://*/*", 20 | "cookies", 21 | "storage" 22 | ], 23 | "content_scripts":[ 24 | { 25 | "matches":["http://*/*","https://*/*"], 26 | "js":["source/tools/jquery-1.9.1.min.js","source/content_scripts.js"] 27 | } 28 | ],"background": { 29 | "page": "background.html" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /chrome/manifest_bak.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 2, 3 | "name": "Postwoman-Http调试", 4 | "version": "1.0.10", 5 | "description": "开源API接口调试工具,支持Restful接口、http、https接口调试、POST模拟,支持PUT、DELETE接口调试。支持切换语言,支持云端备份,相较于postman,Postwoman更符合中国用户习惯。", 6 | "author": "ihsantang@163.com", 7 | "icons": { 8 | "64": "logo.png", 9 | "128": "logo.png" 10 | }, 11 | "browser_action": { 12 | "default_icon": "logo.png", 13 | "default_title": "Postwoman-中文版", 14 | "default_popup": "index.html" 15 | }, 16 | "permissions": [ 17 | "http://*/*", 18 | "https://*/*", 19 | "cookies", 20 | "storage" 21 | ], 22 | "content_scripts": [ 23 | { 24 | "matches": [ 25 | "http://*/*", 26 | "https://*/*" 27 | ], 28 | "js": [ 29 | "source/tools/jquery-1.9.1.min.js", 30 | "source/content_scripts.js" 31 | ] 32 | } 33 | ], 34 | "background": { 35 | "page": "background.html" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /chrome/more.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | Json 18 | Debug 19 |
20 | 21 | 22 |
23 |
24 |
25 | 26 |
27 | 28 | 29 |
30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /chrome/setting.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 23 | 24 | 25 | 调试接口 26 |
27 | 28 |
29 |
30 |
31 |
32 |
33 | 34 |
默认服务器地址 — http://api.crap.cn
35 | 36 |
37 |
38 |
39 | 40 |
41 |
42 |
43 | 44 |
默认接口调试超时时间 — 10000(毫秒)
45 | 46 |
47 |
48 |
49 | 50 |
51 |
52 |
53 | 57 | 58 |
59 |
60 |
61 | 62 | 66 | 67 |
68 |
69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | -------------------------------------------------------------------------------- /chrome/source/base-dao.js: -------------------------------------------------------------------------------- 1 | /***********获取本地存储的数据**********/ 2 | function getLocData(key){ 3 | try{ 4 | var value = localStorage[key]; 5 | if(value){ 6 | return value; 7 | } 8 | }catch(e){ 9 | console.warn(e); 10 | return ""; 11 | } 12 | } 13 | /*********存储数据至本地***********/ 14 | function saveLocData(key, value){ 15 | try{ 16 | localStorage[key] = value; 17 | return true; 18 | }catch(e){ 19 | console.warn(e); 20 | return false; 21 | } 22 | } 23 | 24 | /**********登陆****************/ 25 | function getLoginInfoDAO(callBack) { 26 | httpPost(INIT_URL, {}, callBack); 27 | } 28 | function drawLoginInfoDAO(response) { 29 | if (response.success == 1){ 30 | setHtml(ID_USER_NAME, "Hi, " + response.data.sessionAdminName + " !"); 31 | showDiv(ID_USER_NAME); 32 | hiddenDiv(ID_LOGIN); 33 | showDiv(ID_LOGOUT); 34 | } 35 | } 36 | $("#" + ID_LOGOUT).click(function(){ 37 | httpPost(LOGOUT_URL, {}, drawLogoutDAO); 38 | }); 39 | 40 | function drawLogoutDAO(response) { 41 | alert(getText(l_logoutSuccessTip),3,"success"); 42 | if (response.success == 1){ 43 | hiddenDiv(ID_USER_NAME); 44 | showDiv(ID_LOGIN); 45 | hiddenDiv(ID_LOGOUT); 46 | } 47 | } 48 | 49 | /**********系统设置**************/ 50 | function getHttpTimeout(){ 51 | try { 52 | var httpTimeout = localStorage[WEB_HTTP_TIMEOUT]; 53 | httpTimeout = parseFloat(httpTimeout); 54 | if (httpTimeout && httpTimeout != null && httpTimeout.toString() != "NaN" && httpTimeout > 1000) { 55 | return httpTimeout; 56 | } else { 57 | return 10000; 58 | } 59 | }catch(e){ 60 | return 10000; 61 | } 62 | } 63 | function getWebSiteUrl(){ 64 | var webSiteUrl = localStorage[WEB_SITE_URL]; 65 | if (webSiteUrl && webSiteUrl != null && webSiteUrl != ''){ 66 | return webSiteUrl; 67 | }else{ 68 | return "http://api.crap.cn"; 69 | } 70 | } 71 | 72 | function getLanguage(){ 73 | try { 74 | var language = localStorage[SETTING_LANGUAGE] || navigator.language; 75 | if ($.inArray(language, SUPPORT_LANGUAGE_ZH) != -1){ 76 | return LANG_ZH_CN; 77 | } 78 | if ($.inArray(language, SUPPORT_LANGUAGE_EN) != -1){ 79 | return LANG_EN; 80 | } 81 | return LANG_ZH_CN; 82 | } catch (e){ 83 | return LANG_ZH_CN; 84 | } 85 | } 86 | 87 | function getText(name) { 88 | if (getLanguage() == LANG_ZH_CN){ 89 | return textObj[name]; 90 | } else { 91 | return textObj[name + _en]; 92 | } 93 | } 94 | 95 | function i18nInit() { 96 | $.i18n.init({ 97 | lng : getLanguage(), //指定语言 98 | resGetPath : 'source/locales/__lng__/__ns__.json', 99 | lngWhitelist:[LANG_ZH_CN, LANG_EN], 100 | preload:[LANG_ZH_CN, LANG_EN], 101 | ns: { 102 | namespaces: ['translation'], 103 | defaultNs: 'translation' //默认使用的,不指定namespace时 104 | } 105 | },function(err, t){ 106 | $('[data-i18n]').i18n(); // 通过选择器集体翻译 107 | }); 108 | } -------------------------------------------------------------------------------- /chrome/source/base.css: -------------------------------------------------------------------------------- 1 | body,h1,h2,h3,h4,h5,h6,hr,blockquote,dl,dt,dd,form,fieldset,legend,button,input,textarea,th,td 2 | {margin:0;padding:0;font-family: Georgia, 'Times New Roman', Times,'Microsoft Yahei','Hiragino Sans GB',sans-serif;} 3 | .fm{font-family: Tahoma,"\5b8b\4f53",Arial,Helvetica,Arial,sans-serif;} 4 | .roman {font-family: Georgia, 'Times New Roman', Times,'Microsoft Yahei','Hiragino Sans GB',sans-serif!important;} 5 | .ftime {font-family: -apple-system, "Helvetica Neue", Arial, "PingFang SC", "lucida grande", "lucida sans unicode", lucida, helvetica, "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif!important;} 6 | .transition{transition: all 0.2s ease-in-out;-moz-transition: all 0.2s ease-in-out;-webkit-transition: all 0.2s ease-in-out;} 7 | .cursor{cursor:pointer;} 8 | .nls{list-style: none} 9 | .break-word{ 10 | word-break:break-all; 11 | word-wrap:break-word; 12 | white-space: normal!important; 13 | } 14 | .tip-div{ 15 | text-align: center; 16 | overflow: hidden; 17 | padding: 5px 20px; 18 | line-height: 22px; 19 | border-radius: 5px; 20 | background: rgba(0,0,0,0.6); 21 | color: #fff; 22 | position: fixed; 23 | top:50%; 24 | left:50%; 25 | display:none; 26 | z-index: 1061; 27 | } 28 | .l-s-n{list-style:none;} 29 | .o2{opacity:0.2}.o3{opacity:0.3}.o5{opacity:0.5}.o8{opacity:0.8} 30 | .no-b-s{-webkit-box-shadow: none; box-shadow: none; border: 1px solid #ced4da;} 31 | .b0{border:0px!important;} 32 | .b1{border: 1px solid #ced4da;} 33 | .dashed{border:1px dashed #ced4da;} 34 | .dashed-t{border-top:1px dashed #ced4da;} 35 | .dashed-b{border-bottom:1px dashed #ced4da;} 36 | .bl3{border-left: 3px solid #ced4da;} 37 | .bl1{border-left: 1px solid #ced4da;} 38 | .bt1{border-top: 1px solid #ced4da;} 39 | .bt0{border-top:0px!important;} 40 | .bb1{border-bottom: 1px solid #ced4da;} 41 | .bb0{border-bottom:0px!important;} 42 | .br1{border-right: 1px solid #ced4da;} 43 | .bl0{border-left:0px;} 44 | .br0{border-right:0px;} 45 | .BCEEE{border-color:#EEE;} 46 | .z10{z-index:10}.z20{z-index:20} 47 | img { 48 | width: auto\9; 49 | height: auto; 50 | vertical-align: middle; 51 | border: 0; 52 | -ms-interpolation-mode: bicubic; 53 | max-width:100%; 54 | } 55 | .no-resize{resize: none;} 56 | .of-h{overflow:hidden;} 57 | .ofy-s{overflow-y:scroll;} 58 | .ofy-a{overflow-y:auto;} 59 | .ofx-a{overflow-x:auto;} 60 | .ofx-h{overflow:hidden;} 61 | small{font-size:12px} 62 | .sup{vertical-align:text-top} 63 | .sub{vertical-align:text-bottom} 64 | 65 | fieldset,img{border:0} 66 | table{border-collapse:collapse;border-spacing:0} 67 | .fixed{position:fixed;}.rel{position:relative;} 68 | .abs{position:absolute;}.static{position:static;} 69 | .r0{right:0px;}.l0{left:0px;}.t0{top:0px;} 70 | .pos-r-10{right:-10px;} 71 | .pos-r10{right:10px;}.pos-r5{right:5px;}.pos-l10{left:10px;}.pos-b10{bottom:10px;} 72 | .pos-t5{top:5px;} 73 | .pos-t-35{top:-35px;}.pos-t-36{top:-36px;} 74 | . 75 | no-radius{-moz-border-radius: 0px!important;-webkit-border-radius: 0px!important; border-radius: 0px!important; -khtml-border-radius: 0px!important;} 76 | .no-left-radius{border-top-left-radius: 0px!important;border-bottom-left-radius: 0px!important;} 77 | .no-right-radius{border-top-right-radius: 0px!important;border-bottom-right-radius: 0px!important;} 78 | .right-radius{border-top-right-radius: 5px;border-bottom-right-radius: 5px;} 79 | .left-radius{border-top-left-radius: 5px;border-bottom-left-radius: 5px;} 80 | .bottom-radius{border-bottom-right-radius: 5px;border-bottom-left-radius: 5px;} 81 | .top-radius{border-top-right-radius: 5px;border-top-left-radius: 5px;} 82 | .r2{-moz-border-radius: 2px;-webkit-border-radius: 2px;border-radius: 2px;-khtml-border-radius: 2px;} 83 | .r3{-moz-border-radius: 3px;-webkit-border-radius: 3px;border-radius: 3px;-khtml-border-radius: 3px;} 84 | .r5{-moz-border-radius: 5px!important;-webkit-border-radius: 5px!important;border-radius: 5px!important;-khtml-border-radius: 5px!important;} 85 | .r10{-moz-border-radius: 10px;-webkit-border-radius: 10px;border-radius: 10px;-khtml-border-radius: 10px;} 86 | .r12{-moz-border-radius: 12px;-webkit-border-radius: 12px;border-radius: 12px;-khtml-border-radius: 12px;} 87 | .r20{-moz-border-radius: 20px;-webkit-border-radius: 20px;border-radius: 20px;-khtml-border-radius: 20px;} 88 | 89 | 90 | .bg-feng{background-color:#ffebe8;} 91 | .bg-lan{background-color:#b2d1ff;} 92 | .BG999{background-color:#999!important;}.BGEEE{background-color:#EEE;}.BGFFF{background-color:#ffffff!important;} 93 | .BGF5{background-color:#f5f5f5!important;}.BGF9{background-color:#f9f9f9!important;} 94 | .BGBBB{background-color:#BBB!important;} 95 | .C999{color:#999}.C555{color:#555}.C333{color:#333}.CAAA{color:#AAA}.CEEE{color:#EEE}.CFFF{color:#FFF;}.C000{color:#000} 96 | .c-time{color:#b1b1b1} 97 | .ACFFF{color:#FFF;}.ACFFF:hover{color:#FFF;} 98 | .f9{font-size:9px} 99 | .f10{font-size:10px} 100 | .f11{font-size:11px} 101 | .f12{font-size:12px!important} 102 | .f13{font-size:13px} 103 | .f14{font-size:14px!important} 104 | .f16{font-size:16px!important} 105 | .f18{font-size:18px!important} 106 | .f20{font-size:20px!important} 107 | .f22{font-size:22px} 108 | .f30{font-size:30px} 109 | .f40{font-size:40px} 110 | .f50{font-size:50px} 111 | .f60{font-size:60px} 112 | .fb{font-weight:bold} 113 | .fn{font-weight:normal!important} 114 | .t2{text-indent:2em} 115 | .lh20{line-height:20px!important} 116 | .lh25{line-height:25px} 117 | .lh26{line-height:26px} 118 | .lh30{line-height:30px!important;} 119 | .lh37{line-height:37px!important;} 120 | .lh40{line-height:40px} 121 | .lh50{line-height:50px} 122 | .lh70{line-height:70px} 123 | .lh80{line-height:80px} 124 | .lh100{line-height:100px} 125 | .unl{text-decoration:underline!important} 126 | .no_unl{text-decoration:none!important} 127 | .no_unl:hover {text-decoration: none!important} 128 | .tl{text-align:left} 129 | .tc{text-align:center} 130 | .tr{text-align:right} 131 | .bc{margin-left:auto;margin-right:auto} 132 | .fl{float:left;} 133 | .fr{float:right!important;} 134 | .cb{clear:both}.cl{clear:left}.cr{clear:right} 135 | .hidden{visibility:hidden}.none{display:none!important;} 136 | .w10{width:10px}.w20{width:20px}.w30{width:30px}.w40{width:40px}.w50{width:50px} 137 | .w60{width:60px}.w70{width:70px}.w80{width:80px}.w90{width:90px}.w100{width:100px!important;}.w120{width:120px}.w130{width:130px} 138 | .w150{width:150px!important}.w200{width:200px}.w250{width:250px}.w300{width:300px}.w400{width:400px} 139 | .w-p-1{width:1%;}.w-p-10{width:10%;}.w-p-20{width:20%;}.w-p-30{width:30%;} 140 | .w500{width:500px}.w600{width:600px}.w700{width:700px}.w800{width:800px} 141 | .w{width:100%!important;}.w-10{width:10%;}.w-40{width:40%;}.w-50{width:50%;} 142 | .h-auto{height:auto;} 143 | .h30{height:30px!important}.h20{height:20px}.h27{height:27px!important;} 144 | .h32{height:32px!important} 145 | .h35{height:35px!important}.h37{height:37px!important} 146 | .h40{height:40px!important}.h45{height:45px!important}.h50{height:50px!important}.h60{height:60px}.h70{height:70px}.h80{height:80px}.h90{height:90px} 147 | .h100{height:100px}.h120{height:120px}.h150{height:150px}.h200{height:200px}.h220{height:220px}.h300{height:300px}.h400{height:400px}.h500{height:500px} 148 | .h{height:100%!important} 149 | .min-h{min-height:100%!important} 150 | .min-h70{min-height:70px} 151 | .min-h100{min-height:100px} 152 | .min-h200{min-height:200px} 153 | .min-h300{min-height:300px} 154 | .min-h400{min-height:400px} 155 | .min-h500{min-height:500px} 156 | .min-h600{min-height:600px} 157 | .min-h700{min-height:700px} 158 | .min-h800{min-height:800px} 159 | .max-w{max-width:100%} 160 | .min-w80{min-width:80px!important} 161 | .min-w100{min-width:100px!important} 162 | .min-w200{min-width:200px}.min-w300{min-width:300px!important} 163 | .min-w900{min-width:900px!important} 164 | .m0{margin:0px!important} 165 | .m5{margin:5px!important}.m7{margin:7px}.m10{margin:10px!important}.m20{margin:20px!important}.m15{margin:15px} 166 | .m30{margin:30px} 167 | .mt3{margin-top:3px!important}.mt4{margin-top:4px!important} 168 | .mt-5{margin-top:-5px!important;}.mt-3{margin-top:-3px!important;}.mt-1{margin-top:-1px!important;}.mt-2{margin-top:-2px!important;} 169 | .mt-8{margin-top:-8px!important;} 170 | .mt-10{margin-top:-10px!important;}.mt0{margin-top:0px!important} 171 | .mt1{margin-top:1px!important}.mt2{margin-top:2px!important} 172 | .mt5{margin-top:5px!important}.mt10{margin-top:10px!important} 173 | .mt15{margin-top:15px!important}.mt20{margin-top:20px!important}.mt30{margin-top:30px!important}.mt40{margin-top:40px!important}.mt50{margin-top:50px!important} 174 | .mt75{margin-top:75px!important}.mt100{margin-top:100px!important} 175 | /***********display*************************/ 176 | .ndis{ 177 | display:none!important; 178 | } 179 | .dis{ 180 | display:block!important; 181 | } 182 | .dis-in-tab{ 183 | display:inline-table!important; 184 | } 185 | .dis-in-blo{ 186 | display:inline-block!important; 187 | } 188 | /***********margin-right*******************/ 189 | .mr-1{margin-right:-1px}.mr-5{margin-right:-5px!important}.mr-15{margin-right:-15px!important}.mr0{margin-right:0px!important}.mr5{margin-right:5px} 190 | .mr10{margin-right:10px}.mr15{margin-right:15px}.mr20{margin-right:20px!important} 191 | .mr30{margin-right:30px}.mr50{margin-right:50px!important}.mr75{margin-right:75px} 192 | .mr100{margin-right:100px} 193 | 194 | /***********margin-bottom*******************/ 195 | .mb0{margin-bottom:0px}.mb5{margin-bottom:5px}.mb10{margin-bottom:10px} 196 | .mb15{margin-bottom:15px}.mb20{margin-bottom:20px}.mb30{margin-bottom:30px} 197 | .mb50{margin-bottom:50px}.mb75{margin-bottom:75px}.mb90{margin-bottom:90px}.mb100{margin-bottom:100px} 198 | .mb-2{margin-bottom:-2px!important} 199 | .mb-10{margin-bottom:-10px!important} 200 | 201 | /***********margin-left*******************/ 202 | .ml-1{margin-left:-1px}.ml-5{margin-left:-5px!important}.ml-15{margin-left:-15px} 203 | .ml0{margin-left:0px!important} 204 | .ml5{margin-left:5px}.ml10{margin-left:10px}.ml15{margin-left:15px} 205 | .ml20{margin-left:20px}.ml30{margin-left:30px}.ml50{margin-left:50px} 206 | .ml75{margin-left:75px}.ml100{margin-left:100px} 207 | 208 | /***********padding*******************/ 209 | .p0{padding:0px!important}.p3{padding:3px!important} 210 | .p5{padding:5px!important}.p10{padding:10px!important}.p12{padding:12px!important}.p15{padding:15px!important}.p20{padding:20px!important} 211 | .p30{padding:30px!important}.p40{padding:30px!important}.p50{padding:50px!important} 212 | 213 | /***********padding-top*******************/ 214 | .pt0{padding-top:0px!important} 215 | .pt5{padding-top:5px!important} 216 | .pt10{padding-top:10px!important}.pt15{padding-top:15px!important}.pt20{padding-top:20px!important} 217 | .pt30{padding-top:30px!important}.pt50{padding-top:50px!important}.pt60{padding-top:60px!important}.pt75{padding-top:75px!important} 218 | .pt100{padding-top:100px!important} 219 | 220 | /***********padding-right*******************/ 221 | .pr5{padding-right:5px!important}.pr10{padding-right:10px!important} 222 | .pr15{padding-right:15px!important}.pr20{padding-right:20px!important}.pr30{padding-right:30px!important}.pr40{padding-right:40px!important} 223 | .pr50{padding-right:50px!important}.pr75{padding-right:75px!important}.pr100{padding-right:100px!important} 224 | 225 | /***********padding-bottom*******************/ 226 | .pb0{padding-bottom:0px!important} 227 | .pb5{padding-bottom:5px!important}.pb10{padding-bottom:10px!important}.pb15{padding-bottom:15px!important} 228 | .pb20{padding-bottom:20px!important}.pb30{padding-bottom:30px!important}.pb50{padding-bottom:50px!important} 229 | .pb75{padding-bottom:75px!important}.pb100{padding-bottom:100px!important} 230 | 231 | /***********padding-left*******************/ 232 | .pl0{padding-left:0px!important} 233 | .pl5{padding-left:5px!important}.pl10{padding-left:10px!important}.pl15{padding-left:15px!important}.pl20{padding-left:20px!important} 234 | .pl30{padding-left:30px!important}.pl50{padding-left:50px!important}.pl75{padding-left:75px!important}.pl100{padding-left:100px!important} 235 | 236 | /***********max-width*******************/ 237 | .maw40 {max-width:40px;} 238 | .maw100 {max-width:100px;} 239 | .maw200 {max-width:200px;} 240 | .maw400 {max-width:400px;} 241 | 242 | .mah {max-height:100%;} 243 | .mah40 {max-height:40px!important;} 244 | .mah50 {max-height:50px!important;} 245 | .mah100{ max-height:100px;} 246 | .mah200{ max-height:200px;} 247 | .mah300{ max-height:300px;}.mah400{ max-height:400px;} 248 | /***********Color***********************/ 249 | 250 | .iconfont { 251 | vertical-align: middle; 252 | font-family: "iconfont" !important; 253 | font-style: normal; 254 | -webkit-font-smoothing: antialiased; 255 | display: block; 256 | -webkit-text-stroke-width: 0.2px; 257 | -moz-osx-font-smoothing: grayscale; 258 | display: inline-block; 259 | } 260 | 261 | .flipy{ 262 | -moz-transform:scaleY(-1); 263 | -webkit-transform:scaleY(-1); 264 | -o-transform:scaleY(-1); 265 | transform:scaleY(-1); 266 | filter:FlipV(); 267 | } 268 | .flipx { 269 | -moz-transform:scaleX(-1); 270 | -webkit-transform:scaleX(-1); 271 | -o-transform:scaleX(-1); 272 | transform:scaleX(-1); 273 | filter:FlipH(); 274 | } 275 | .ns{ 276 | -webkit-box-shadow:none!important; 277 | box-shadow:none!important; 278 | } 279 | .shadow{box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.4);} 280 | .shadow-b{box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1);} 281 | .shadow-3 { box-shadow: 0 0 3px rgba(0,0,0,0.1); } 282 | 283 | 284 | 285 | .trans{ 286 | content: ''; 287 | width: 100%; 288 | height: 100%; 289 | position: absolute; 290 | left: 0; 291 | top: 0; 292 | background: rgba(0,0,0,.6); 293 | z-index:1; 294 | } -------------------------------------------------------------------------------- /chrome/source/constant.js: -------------------------------------------------------------------------------- 1 | /***********id********/ 2 | var ID_USER_NAME = "id-user-name"; 3 | var ID_LOGIN = "login-button"; 4 | var ID_LOGOUT = "id-logout"; 5 | 6 | var ADVERTISEMENT = "http://crap.cn/mock/trueExam.do?id=155030837878212000015&cache=true"; 7 | var INIT_URL = "/admin/init.do"; 8 | var LOGOUT_URL = "/user/loginOut.do"; 9 | 10 | // zh-CN 华 -中国 11 | // zh-HK 华 - 香港的 SAR 12 | // zh-MO 华 - 澳门的 SAR 13 | // zh-SG 华 -新加坡 14 | // zh-TW 华 -台湾 15 | var LANG_ZH_CN = "zh-CN"; 16 | var LANG_ZH_HK = "zh-HK"; 17 | var LANG_ZH_MO = "zh-MO"; 18 | var LANG_ZH_SG = "zh-SG"; 19 | var LANG_ZH_TW = "zh-TW"; 20 | 21 | // en 英国 22 | // en-AU 英国 -澳洲 23 | // en-BZ 英国 -伯利兹 24 | // en-CA 英国 -加拿大 25 | // en-CB 英国 -加勒比海 26 | // en-IE 英国 -爱尔兰 27 | // en-JM 英国 -牙买加 28 | // en-NZ 英国 - 新西兰 29 | // en-PH 英国 -菲律宾共和国 30 | // en-ZA 英国 - 南非 31 | // en-TT 英国 - 千里达托贝哥共和国 32 | // en-GB 英国 - 英国 33 | // en-US 英国 - 美国 34 | // en-ZW 英国 -津巴布韦 35 | 36 | var LANG_EN = "en"; 37 | var LANG_EN_AU = "en-AU"; 38 | var LANG_EN_CA = "en-CA"; 39 | var LANG_EN_IE = "en-IE"; 40 | var LANG_EN_NZ = "en-NZ"; 41 | var LANG_EN_GB = "en-GB"; 42 | var LANG_EN_US = "en-US"; 43 | 44 | var SUPPORT_LANGUAGE_ZH = [LANG_ZH_CN, LANG_ZH_HK, LANG_ZH_MO, LANG_ZH_SG, LANG_ZH_TW]; 45 | var SUPPORT_LANGUAGE_EN = [LANG_EN, LANG_EN_AU, LANG_EN_CA, LANG_EN_IE, LANG_EN_NZ, LANG_EN_GB, LANG_EN_US]; 46 | 47 | var WEB_SITE_URL = "crap-web-site-url"; 48 | var WEB_HTTP_TIMEOUT = "crap-http-timeout"; 49 | var SETTING_LANGUAGE = "crap-setting-language"; 50 | 51 | 52 | /***********js 提示,必须以l_开头:表示language **********/ 53 | var _en = "_en" 54 | var l_responseNotJsonTip = "l_responseNotJsonTip"; 55 | var l_logoutSuccessTip = "l_logoutSuccessTip"; 56 | var l_successTip = "l_successTip" 57 | var l_clearLocalData = "l_clearLocalData"; 58 | var l_clearSuccessLogoutFail = "l_clearSuccessLogoutFail"; 59 | var l_clearSuccessLogoutSuccess = "l_clearSuccessLogoutSuccess"; 60 | var l_moduleNameIsNullTip = "l_moduleNameIsNullTip"; 61 | var l_confirmDelete = "l_confirmDelete"; 62 | var l_formatErrorTip = "l_formatErrorTip"; 63 | var l_timeoutFormatErrorTip = "l_timeoutFormatErrorTip"; 64 | var l_languageChangeTip = "l_languageChangeTip"; 65 | var l_updateSuccessTip = "l_updateSuccessTip"; 66 | var l_netErrorTip = "l_netErrorTip"; 67 | var l_unknownErrorTip = "l_unknownErrorTip"; 68 | var l_clickSendTip = "l_clickSendTip"; 69 | var l_urlIsNullTip = "l_urlIsNullTip"; 70 | var l_connectingError = "l_connectingError"; 71 | var l_interfaceNameIsNullTip = "l_interfaceNameIsNullTip"; 72 | var l_selectModuleTip = "l_selectModuleTip"; 73 | var l_saveInterface = "l_saveInterface"; 74 | var l_edit = "l_edit"; 75 | var l_closeAlertTip = "l_closeAlertTip"; 76 | var l_varSaveSuccess = "l_varSaveSuccess"; 77 | var l_save = "l_save"; 78 | 79 | var textObj = { 80 | "l_logoutSuccessTip":"退出登陆成功!", 81 | "l_logoutSuccessTip_en":"Logout success!", 82 | 83 | "l_successTip":"成功 !", 84 | "l_successTip_en" :"Success !", 85 | 86 | "l_clearLocalData" : "确定要删除本地数据吗?", 87 | "l_clearLocalData_en" : "Delete local data, Are you sure ?", 88 | 89 | "l_clearSuccessLogoutFail":"清除数据本地数据成功,但退出登陆失败!", 90 | "l_clearSuccessLogoutFail_en":"Clear local data success, But logout fail!", 91 | 92 | "l_clearSuccessLogoutSuccess":"清除数据本地数据成功,退出成功!", 93 | "l_clearSuccessLogoutSuccess_en":"Clear local data success, Logout success!", 94 | 95 | "l_moduleNameIsNullTip" :"模块名不能为空!", 96 | "l_moduleNameIsNullTip_en" :"Module name is empty!", 97 | 98 | "l_confirmDelete":"确定删除?", 99 | "l_confirmDelete_en":"Confirm delete?", 100 | 101 | "l_formatErrorTip":"格式化异常,请检查json格式是否有误:", 102 | "l_formatErrorTip_en":"Format error, please check input data:", 103 | 104 | "l_timeoutFormatErrorTip":"异常! 超时时间必须是数字,且必须大于1000!", 105 | "l_timeoutFormatErrorTip_en":"Error! Timeout must be number, and must then 1000!", 106 | 107 | "l_languageChangeTip":"修改成功,刷新页面后生效!", 108 | "l_languageChangeTip_en":"Change success, Please refresh page!", 109 | 110 | "l_updateSuccessTip":"修改成功!", 111 | "l_updateSuccessTip_en":"Update success!", 112 | 113 | "l_netErrorTip":"网络异常", 114 | "l_netErrorTip_en":"Net error", 115 | "l_unknownErrorTip":"未知异常", 116 | "l_unknownErrorTip_en":"Unknown error", 117 | 118 | "l_clickSendTip":"请点击【发送】按钮获取返回数据", 119 | "l_clickSendTip_en":"Please click [Send] button to get a response", 120 | 121 | "l_responseNotJsonTip":"返回数据不是Json格式", 122 | "l_responseNotJsonTip_en":"Response data is not json", 123 | 124 | "l_urlIsNullTip":"接口Url不能为空!", 125 | "l_urlIsNullTip_en":"Interface url can't be null!", 126 | 127 | "l_interfaceNameIsNullTip":"接口名不能为空!", 128 | "l_interfaceNameIsNullTip_en":"Interface name can't be null!", 129 | 130 | 131 | "l_connectingError":"连接网络时发生异常 ", 132 | "l_connectingError_en":"There was an error connecting to ", 133 | 134 | "l_selectModuleTip":"点击选择模块", 135 | "l_selectModuleTip_en":"Select module", 136 | 137 | "l_saveInterface" :"保存接口:", 138 | "l_saveInterface_en" :"Save Interface:", 139 | 140 | "l_edit":"编辑", 141 | "l_edit_en":"edit", 142 | 143 | "l_closeAlertTip":"请勿禁用【确认】弹窗,直接操作非常危险!", 144 | "l_closeAlertTip_en":"Do not forbid [confirm] dialog, is very dangerous", 145 | 146 | "l_varSaveSuccess":"环境变量保存成功!", 147 | "l_varSaveSuccess_en":"Environment Variable Save Success!", 148 | 149 | "l_save" :"提交保存", 150 | "l_save_en" :"Submit", 151 | 152 | } 153 | 154 | -------------------------------------------------------------------------------- /chrome/source/content_scripts.js: -------------------------------------------------------------------------------- 1 | //点击luceneSearch时执行以下代码 2 | $(function(){ 3 | // 从插件跳转至码云,自动弹出捐赠页面 4 | if(window.location.href == "http://git.oschina.net/CrapApi/CrapApi?autoDonate=true"){ 5 | $(".modals").removeClass("hidden"); 6 | $(".modals").removeClass("fade"); 7 | $(".modals").removeClass("out"); 8 | $(".modals").addClass("visible"); 9 | $(".modals").addClass("active"); 10 | 11 | $(".project-donate-modal").removeClass("hidden"); 12 | 13 | $(".modals").css("display","block"); 14 | $(".project-donate-modal").addClass("visible"); 15 | $(".project-donate-modal").addClass("active"); 16 | $(".project-donate-modal").css("margin-top","-289.5px"); 17 | 18 | 19 | } 20 | $("#btn-cancel-donate").click(function(){ 21 | window.location.href="http://git.oschina.net/CrapApi/CrapApi"; 22 | }); 23 | }) 24 | 25 | 26 | 27 | function httpRequest(url, callback){ 28 | var xhr = new XMLHttpRequest(); 29 | xhr.open("GET", url, true); 30 | xhr.onreadystatechange = function() { 31 | if (xhr.readyState == 4) { 32 | callback(xhr.responseText); 33 | } 34 | } 35 | xhr.send(); 36 | } 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /chrome/source/crapApi.js: -------------------------------------------------------------------------------- 1 | $(function(){ 2 | i18nInit(); 3 | getLocalModules(); 4 | //getHistorys(); 5 | //openMyDialog("title",500); 6 | var pageName = getValue("id-page-name") 7 | if (pageName == "debug"){ 8 | refreshSyncIco(-1); 9 | getLoginInfoDAO(drawLoginInfoDAO); 10 | // getAdvertisement(); 11 | } else if (pageName == "setting"){ 12 | $("#" + WEB_SITE_URL).val(getWebSiteUrl()); 13 | $("#" + WEB_HTTP_TIMEOUT).val(getHttpTimeout()); 14 | $("#" + SETTING_LANGUAGE).val(getLanguage()); 15 | } 16 | 17 | $("#synch").click(function(){ 18 | $("#float").fadeIn(300); 19 | var modules; 20 | try{ 21 | modules = $.parseJSON( localStorage['crap-debug-modules'] ) 22 | }catch(e){ 23 | modules = $.parseJSON( "[]" ); 24 | console.warn(e); 25 | } 26 | var moduleText = "["; 27 | var separator = ""; 28 | for(var i=0 ; i=0; i--){ 62 | var resModule = responseJson[i]; 63 | 64 | console.log("处理模块:" + i + "(" + resModule.moduleName + "),状态:" + resModule.status); 65 | if(resModule.status == -1){ 66 | continue; 67 | } 68 | 69 | saveModule(resModule.moduleName, resModule.moduleId, resModule.version, resModule.status); 70 | 71 | var debugs = resModule.debugs; 72 | console.log("处理模块接口:" + i + "," + resModule.moduleName + ",接口数量:" + debugs.length); 73 | 74 | for(var j=debugs.length-1;j>=0;j--){ 75 | saveInterfaceDetail(debugs[j].moduleId, debugs[j].paramType, debugs[j].id, debugs[j].name, debugs[j].method, 76 | debugs[j].url, debugs[j].params, debugs[j].headers, debugs[j].version, debugs[j].status); 77 | } 78 | } 79 | 80 | getLocalModules(); 81 | alert("success!",3,"success"); 82 | refreshSyncIco(1); 83 | }else{ 84 | alert(responseJson.error.message,5,"error"); 85 | } 86 | }else{ 87 | alert("Status:" + responseData.status + "\nStatusText:" + responseData.statusText +"\nTextStatus: " + textStatus); 88 | } 89 | $("#float").fadeOut(300); 90 | } 91 | }); 92 | }); 93 | $("#historys-title").click(function(){ 94 | $("#historys").removeClass("none"); 95 | $("#modules").addClass("none"); 96 | $("#modules-title").removeClass("bb2"); 97 | $(this).addClass("bb2"); 98 | getHistorys(); 99 | }); 100 | $("#modules-title").click(function(){ 101 | $("#historys").addClass("none"); 102 | $("#modules").removeClass("none"); 103 | $("#historys-title").removeClass("bb2"); 104 | $(this).addClass("bb2"); 105 | getLocalModules(); 106 | }); 107 | 108 | var saveAs = true; 109 | // 保存 110 | $("#save-interface").click(function(){ 111 | if( handerStr($("#interface-id").val()) == "" || handerStr($("#module-id").val())== ""){ 112 | saveAs = false; 113 | intitSaveInterfaceDialog(); 114 | }else{ 115 | // 直接保存 116 | $("#save-interface-name").val($("#interface-name").val()); 117 | var moduleId = $("#module-id").val(); 118 | if( saveInterface(moduleId) ){ 119 | alert(getText(l_successTip)); 120 | } 121 | } 122 | }); 123 | 124 | // 另存为 125 | $("#save-as-interface").click(function(){ 126 | saveAs = true; 127 | intitSaveInterfaceDialog(); 128 | }); 129 | 130 | $("#save-interface-submit").click(function(){ 131 | saveInterface("", saveAs); 132 | }); 133 | 134 | $(".close-dialog").click(function(){ 135 | var id = $(this).attr("crap-data"); 136 | closeMyDialog(id); 137 | }); 138 | $("#clear-local-data").click(function(){ 139 | if(!myConfirm(getText(l_clearLocalData))){ 140 | return false; 141 | } 142 | clearLocalStorage(); 143 | getLocalModules(); 144 | $.ajax({ 145 | type : "POST", 146 | url : getWebSiteUrl()+"/user/loginOut.do", 147 | async : true, 148 | data : "", 149 | complete: function(responseData, textStatus){ 150 | if(textStatus == "error"){ 151 | alert(getText(l_clearSuccessLogoutFail), 5, "error", 500); 152 | } 153 | else if(textStatus == "success"){ 154 | alert(l_clearSuccessLogoutSuccess, 5, "success", 500); 155 | }else{ 156 | alert(getText(l_clearSuccessLogoutFail), 5, "error", 500); 157 | } 158 | $("#float").fadeOut(300); 159 | } 160 | }); 161 | }); 162 | 163 | // 模块标题点击 164 | $("#modules").on("click",".panel-heading", function(e) { 165 | if ($(this).find("div").hasClass("collapsed")){ 166 | $(".module-title-ico").html(""); 167 | $(this).find(".module-title-ico").html(""); 168 | } else { 169 | $(this).find(".module-title-ico").html(""); 170 | } 171 | }); 172 | 173 | $("#modules").on("click",".interface", function() { 174 | var urlInfo = $.parseJSON( $(this).attr("crap-data") ); 175 | $("#url").val(urlInfo.url); 176 | $("#interface-id").val(urlInfo.id); 177 | $("#module-id").val(urlInfo.moduleId); 178 | $("#interface-name").val(handerStr(urlInfo.name)); 179 | $("#headers-bulk").val(urlInfo.headers); 180 | $("#method").val(urlInfo.method); 181 | $("#method").change(); 182 | 183 | if($.inArray(urlInfo.paramType, customerTypes) == -1){ 184 | urlInfo.paramType = "x-www-form-urlencoded;charset=UTF-8"; 185 | $("#param-type-value").prop("checked",true); 186 | $("#params-bulk").val(urlInfo.params); 187 | $(".key-value-edit").click(); 188 | }else{ 189 | $("#customer-type-value").prop("checked",true); 190 | // 下拉选择 customer-type 191 | $("#customer-type").val(urlInfo.paramType); 192 | $("#customer-type").change(); 193 | $("#customer-value").val(urlInfo.params); 194 | } 195 | $("input[name='param-type']").change(); 196 | 197 | $(".interface").removeClass("bg-main"); 198 | $(this).addClass("bg-main"); 199 | 200 | }); 201 | 202 | $("#historys").on("click","div", function() { 203 | var urlInfo = $.parseJSON( $(this).attr("crap-data") ); 204 | $("#url").val(urlInfo.url); 205 | $("#interface-id").val("-1"); 206 | $("#module-id").val("-1"); 207 | $("#interface-name").val(handerStr(urlInfo.name)); 208 | $("#headers-bulk").val(urlInfo.headers); 209 | $("#method").val(urlInfo.method); 210 | $("#method").change(); 211 | 212 | if($.inArray(urlInfo.paramType, customerTypes) == -1){ 213 | urlInfo.paramType = "x-www-form-urlencoded;charset=UTF-8"; 214 | $("#param-type-value").prop("checked",true); 215 | $("#params-bulk").val(urlInfo.params); 216 | $(".key-value-edit").click(); 217 | }else{ 218 | $("#customer-type-value").prop("checked",true); 219 | // 下拉选择 customer-type 220 | $("#customer-type").val(urlInfo.paramType); 221 | $("#customer-type").change(); 222 | $("#customer-value").val(urlInfo.params); 223 | } 224 | $("input[name='param-type']").change(); 225 | 226 | 227 | $(".history-div").removeClass("bg-main"); 228 | $(this).addClass("bg-main"); 229 | }); 230 | 231 | $("#new-interface").click(function() { 232 | $("#interface-name").val(""); 233 | $("#headers-bulk").val(""); 234 | $("#params-bulk").val(""); 235 | $("#url").val(""); 236 | $("#interface-id").val("-1"); 237 | $("#module-id").val("-1"); 238 | $("#method").val("GET"); 239 | $("#method").change(); 240 | 241 | $("#param-type-value").prop("checked",true); 242 | $("#params-bulk").val(""); 243 | $(".key-value-edit").click(); 244 | $("input[name='param-type']").change(); 245 | 246 | $(".interface").removeClass("bg-main"); 247 | $(".history-div").removeClass("bg-main"); 248 | }); 249 | $("#save-module-submit").click(function() { 250 | if($("#rename-module-name").val() == ""){ 251 | alert(getText(l_moduleNameIsNullTip), 5, "error", 300); 252 | return false; 253 | } 254 | renameModule( $("#rename-module-id").val(), $("#rename-module-name").val()); 255 | getLocalModules(); 256 | closeMyDialog("dialog2"); 257 | }); 258 | 259 | /******删除接口*********/ 260 | $("#modules").on("click",".delete-interface", function() { 261 | if(!myConfirm(getText(l_confirmDelete))) 262 | { 263 | return false; 264 | } 265 | var ids = $(this).attr("crap-data").split("|"); 266 | deleteInterface(ids[0],ids[1]); 267 | getLocalModules(); 268 | return false;// 不在传递至父容器 269 | }); 270 | /*******上移接口**********/ 271 | $("#modules").on("click",".up-interface", function() { 272 | var ids = $(this).attr("crap-data").split("|"); 273 | upInterface(ids[0],ids[1]); 274 | getLocalModules(); 275 | return false;// 不在传递至父容器 276 | }); 277 | /*******下移接口**********/ 278 | $("#modules").on("click",".down-interface", function() { 279 | var ids = $(this).attr("crap-data").split("|"); 280 | downInterface(ids[0],ids[1]); 281 | getLocalModules(); 282 | return false;// 不在传递至父容器 283 | }); 284 | 285 | $("#modules").on("click",".delete-module", function() { 286 | if(!myConfirm(getText(l_confirmDelete))) 287 | { 288 | return false; 289 | } 290 | var moduleId = $(this).attr("crap-data"); 291 | deleteModule(moduleId); 292 | getLocalModules(); 293 | return false;// 不在传递至父容器 294 | }); 295 | /*******上移**********/ 296 | $("#modules").on("click",".up-module", function() { 297 | var moduleId = $(this).attr("crap-data"); 298 | upModule(moduleId); 299 | getLocalModules(); 300 | return false;// 不在传递至父容器 301 | }); 302 | /*******下移**********/ 303 | $("#modules").on("click",".down-module", function() { 304 | var moduleId = $(this).attr("crap-data"); 305 | downModule(moduleId); 306 | getLocalModules(); 307 | return false;// 不在传递至父容器 308 | }); 309 | 310 | $("#modules").on("click",".rename-module", function() { 311 | var moduleId = $(this).attr("crap-data"); 312 | $("#rename-module-id").val(moduleId); 313 | lookUp('dialog2', '', '', 400 ,7,''); 314 | $("#dialog-content").css("max-height",($(document).height()*0.8)+'px'); 315 | showMessage('dialog2','false',false,-1); 316 | showMessage('fade','false',false,-1); 317 | return false;// 不在传递至父容器 318 | }); 319 | 320 | 321 | $("#left-enlarge").click(function(){ 322 | if( !leftEnlarge){ 323 | leftEnlarge = true; 324 | $("#left").css("width","18%"); 325 | $("#right").css("width","82%"); 326 | $("#left-enlarge i").html(""); 327 | }else{ 328 | leftEnlarge = false; 329 | $("#left").css("width","0%"); 330 | $("#right").css("width","100%"); 331 | $("#left-enlarge i").html(""); 332 | } 333 | 334 | }); 335 | $("#open-debug").click(function(){ 336 | window.open("debug.html") 337 | }); 338 | $("#open-json").click(function(){ 339 | window.open("json.html") 340 | }); 341 | $("#set-web-site").click(function(){ 342 | window.open("setting.html") 343 | }); 344 | 345 | $(".submitSetting").click(function(event){ 346 | var _this=$(event.target); 347 | var name = _this.attr('crap-data-name'); 348 | setSetting(name,$("#" + name).val(), _this); 349 | }); 350 | 351 | $("#login-button").click(function(){ 352 | window.open(getWebSiteUrl() + "/loginOrRegister.do#/login"); 353 | }); 354 | 355 | 356 | $(".params-headers-table").on("keyup","input", function() { 357 | if($(this).val() != ''){ 358 | var tr = $(this).parent().parent(); 359 | if( tr.hasClass("last") ){ 360 | var table = tr.parent(); 361 | table.append(paramsTr); 362 | tr.removeClass("last"); 363 | } 364 | } 365 | }); 366 | 367 | // 当前是否显示批量编辑 368 | var showBulkParams = false; 369 | var showBulkHeaders = false; 370 | 371 | // 批量编辑 372 | $(".bulk-edit").click(function(){ 373 | var preId = $(this).attr("crap-data-value"); 374 | if( preId == "headers"){ 375 | showBulkHeaders = true; 376 | } 377 | if( preId == "params"){ 378 | showBulkParams = true; 379 | } 380 | $("#"+preId+"-table").addClass("none"); 381 | $("#"+preId+"-bulk-edit-div").removeClass("none"); 382 | var bulkParams = ""; 383 | var texts = $("#"+preId+"-div input[type='text']"); 384 | // 获取所有文本框 385 | var key = ""; 386 | $.each(texts, function(i, val) { 387 | try { 388 | if(val.getAttribute("data-stage") == "value"){ 389 | var p = key+":" + val.value; 390 | if( p != ":"){ 391 | bulkParams += p + "\n"; 392 | } 393 | }else if(val.getAttribute("data-stage") == "key"){ 394 | key = val.value; 395 | } 396 | } catch (ex) { } 397 | }); 398 | $("#"+preId+"-bulk").val(bulkParams); 399 | }); 400 | 401 | // key-value编辑 402 | $(".key-value-edit").click(function(){ 403 | var preId = $(this).attr("crap-data-value"); 404 | if( preId == "headers"){ 405 | showBulkHeaders = false; 406 | } 407 | if( preId == "params"){ 408 | showBulkParams = false; 409 | } 410 | $("#"+preId+"-table").removeClass("none"); 411 | $("#"+preId+"-bulk-edit-div").addClass("none"); 412 | var bulkParams = $("#"+preId+"-bulk").val(); 413 | var params = bulkParams.split("\n"); 414 | $("#"+preId+"-table tbody").empty(); 415 | for(var i=0 ; i< params.length; i++){ 416 | if( params[i].trim() != ""){ 417 | var p = params[i].split(":"); 418 | if(p.length>2){ 419 | for(var j=2 ; j< p.length; j++){ 420 | p[1] = p[1] +":" + p[j]; 421 | } 422 | } 423 | var key = p[0]; 424 | var value = ""; 425 | if(p.length >1 ){ 426 | value = p[1]; 427 | } 428 | var tdText = paramsTr.replace("'key'","'key' value='"+key+"'").replace("'value'","'value' value='"+decodeURIComponent(value)+"'"); 429 | tdText = tdText.replace("last",""); 430 | $("#"+preId+"-table tbody").append(tdText); 431 | } 432 | } 433 | $("#"+preId+"-table tbody").append(paramsTr); 434 | }); 435 | 436 | $("#format-row").click(function(){ 437 | var rowData = originalResponseText; 438 | if( rowData == ""){ 439 | originalResponseText = $("#response-row").val(); 440 | rowData = originalResponseText; 441 | } 442 | changeBg("btn-default", "btn-main", "response-menu",this); 443 | $("#response-row").val(rowData); 444 | responseShow("response-row"); 445 | $('#response-row').removeAttr("readonly"); 446 | originalResponseText = ""; 447 | }); 448 | 449 | $("#format-pretty").click(function(){ 450 | var rowData = originalResponseText; 451 | if( rowData == ""){ 452 | originalResponseText = $("#response-row").val(); 453 | rowData = originalResponseText; 454 | } 455 | try{ 456 | var jsonFormatResult = format(rowData); 457 | if (jsonFormatResult != null && jsonFormatResult != '') { 458 | $("#response-row").val(jsonFormatResult); 459 | } 460 | }catch(e){ 461 | console.warn(e) 462 | $("#response-row").val(rowData); 463 | } 464 | changeBg("btn-default", "btn-main", "response-menu",this); 465 | $('#response-row').attr("readonly","readonly"); 466 | responseShow("response-row"); 467 | }); 468 | 469 | $('.response-json').on('click', function() { 470 | if( !formatJson() ){ 471 | return; 472 | } 473 | changeBg("btn-default", "btn-main", "response-menu",this); 474 | var value = $(this).attr("crap-data-value"); 475 | var key = $(this).attr("crap-data-name"); 476 | $('#response-pretty').JSONView(key, value); 477 | responseShow("response-pretty"); 478 | }); 479 | 480 | $(".params-headers-table").on("click","i",function() { 481 | var tr = $(this).parent().parent(); 482 | // 最后一行不允许删除 483 | if( tr.hasClass("last")){ 484 | return; 485 | } 486 | tr.remove(); 487 | }); 488 | 489 | // 请求头、参数切换 490 | $(".params-title").click(function(){ 491 | $(".params-title").removeClass("bb2"); 492 | $(this).addClass("bb2"); 493 | var contentDiv = $(this).attr("data-stage"); 494 | $("#headers-div").addClass("none"); 495 | $("#params-div").addClass("none"); 496 | $("#"+contentDiv).removeClass("none"); 497 | }); 498 | 499 | $(".response-title").click(function(){ 500 | $(".response-title").removeClass("bb2"); 501 | 502 | $(this).addClass("bb2"); 503 | var contentDiv = $(this).attr("data-stage"); 504 | $(".response-header").addClass("none"); 505 | $(".response-body").addClass("none"); 506 | $(".response-cookie").addClass("none"); 507 | $("."+contentDiv).removeClass("none"); 508 | }); 509 | 510 | 511 | 512 | $("#method").change(function() { 513 | if( $("#method").val() != "GET"){ 514 | if($("#content-type").hasClass("none")){ 515 | $("#content-type").removeClass("none"); 516 | } 517 | }else{ 518 | $("#param-type-value").prop("checked",true); 519 | $("input[name='param-type']").change(); 520 | if(!$("#content-type").hasClass("none")){ 521 | $("#content-type").addClass("none"); 522 | } 523 | } 524 | }); 525 | 526 | // param-type=customer 527 | $("#customer-type").change(function() { 528 | $("#customer-type-value").val( $("#customer-type").val() ); 529 | }); 530 | // 单选param-type监控 531 | $("input[name='param-type']").change(function(){ 532 | var crapData = $("input[name='param-type']:checked").attr("crap-data"); 533 | if( crapData && crapData=="customer") { 534 | $("#customer-type").removeClass("none") 535 | $("#params-table").addClass("none"); 536 | $("#customer-div").removeClass("none"); 537 | }else{ 538 | $("#customer-type").addClass("none"); 539 | $("#customer-div").addClass("none"); 540 | $("#params-table").removeClass("none"); 541 | } 542 | }); 543 | 544 | // 插件调试send 545 | $("#send").click(function(){ 546 | if( showBulkHeaders ){ 547 | $("#headers-bulk-edit-div .key-value-edit").click(); 548 | } 549 | if( showBulkParams ){ 550 | $("#params-bulk-edit-div .key-value-edit").click(); 551 | } 552 | callAjax(); 553 | }); 554 | 555 | // div 拖动 556 | $("#left").resizable( 557 | { 558 | autoHide: true, 559 | handles: 'e', 560 | maxWidth: 800, 561 | minWidth: 260, 562 | resize: function(e, ui) 563 | { 564 | var parentWidth = $(window).width(); 565 | var remainingSpace = parentWidth - ui.element.width(); 566 | 567 | divTwo = $("#right"), 568 | divTwoWidth = remainingSpace/parentWidth*100+"%"; 569 | divTwo.width(divTwoWidth); 570 | }, 571 | stop: function(e, ui) 572 | { 573 | var parentWidth = $(window).width(); 574 | var remainingSpace = parentWidth - ui.element.width(); 575 | divTwo = $("#right"); 576 | divTwoWidth = remainingSpace/parentWidth*100+"%"; 577 | divTwo.width(divTwoWidth); 578 | ui.element.css( 579 | { 580 | width: ui.element.width()/parentWidth*100+"%", 581 | }); 582 | } 583 | }); 584 | }) 585 | -------------------------------------------------------------------------------- /chrome/source/env-dao.js: -------------------------------------------------------------------------------- 1 | var ENV_LOC_KEY = "crap-env-list"; 2 | var VAR_LOC_KEY = "crap-var-list-"; 3 | 4 | function saveAllEnv(envList){ 5 | localStorage[ENV_LOC_KEY] = JSON.stringify(envList); 6 | } 7 | 8 | function saveAllVar(envId, varList){ 9 | localStorage[VAR_LOC_KEY + envId] = JSON.stringify(varList); 10 | } 11 | function deleteVar(envId) { 12 | localStorage.removeItem(VAR_LOC_KEY + envId); 13 | } 14 | 15 | function getAllEnv(){ 16 | try { 17 | var lovEnvList = localStorage[ENV_LOC_KEY]; 18 | if (lovEnvList == null){ 19 | lovEnvList = "[]"; 20 | } 21 | return $.parseJSON(lovEnvList); 22 | } catch (e) { 23 | console.warn(e); 24 | return $.parseJSON("[]"); 25 | } 26 | } 27 | 28 | function getAllVar(envId){ 29 | try { 30 | var lovVarList = localStorage[VAR_LOC_KEY + envId]; 31 | if (lovVarList == null){ 32 | lovVarList = "[]"; 33 | } 34 | return $.parseJSON(lovVarList); 35 | } catch (e) { 36 | console.warn(e); 37 | return $.parseJSON("[]"); 38 | } 39 | } 40 | 41 | function deleteEnv(id) { 42 | var envList = getAllEnv(); 43 | // 如果已经存在则删除 44 | var env; 45 | for (var i = 0; i < envList.length; i++) { 46 | if (envList[i].id == id) { 47 | env = envList[i]; 48 | env.status=-1; 49 | envList.splice(i, 1); 50 | break; 51 | } 52 | } 53 | //envList.unshift(env); 54 | deleteVar(id); 55 | saveAllEnv(envList); 56 | } 57 | 58 | // 保存 or 更新 59 | function saveUpdateEnv(id, name) { 60 | var envList = getAllEnv(); 61 | if( handerStr(id) == ""){ 62 | id = new Date().getTime() + "-" + random(10); 63 | } 64 | 65 | var h = { 66 | "id": id, 67 | "name": name, 68 | "version":0, 69 | "status":1 70 | }; 71 | 72 | // 如果已经存在则删除 73 | for (var i = 0; i < envList.length; i++) { 74 | if (envList[i].id == h.id) { 75 | h.status = envList[i].status; 76 | h.version = envList[i].version + 1; 77 | envList.splice(i, 1); 78 | break; 79 | } 80 | } 81 | envList.unshift(h); 82 | saveAllEnv(envList) 83 | //refreshSyncIco(0); 84 | } -------------------------------------------------------------------------------- /chrome/source/env.js: -------------------------------------------------------------------------------- 1 | var ID_DIALOG_ADD_ENV = "id-dialog-add-env"; 2 | var ID_ENV_NAME = "id-env-name"; 3 | var ID_ENV_ID = "id-env-id"; 4 | var ID_ENV_LIST = "id-env-list"; 5 | var CRAP_DATA_ENV_ID = "crap-data-env-id"; 6 | var CRAP_DATA_ENV_NAME = "crap-data-env-name"; 7 | var ID_ENV_VARIABLE_TABLE = "env-variable-table"; 8 | var ENV_LIST_MENU = "env-list-menu"; 9 | var ID_EDIT_ENG_ID = "id-edit-env-id"; 10 | 11 | var ENV_DIV = "
ca_envName "; 12 | ENV_DIV += "
"; 13 | ENV_DIV += "
"; 14 | ENV_DIV += "
"; 15 | 16 | $(function(){ 17 | drawEnvList(); 18 | // 添加环境 19 | $("#id-add-env").click(function(){ 20 | lookUp(ID_DIALOG_ADD_ENV, '', '', 600 ,7,''); 21 | $("#dialog-content").css("max-height",($(document).height()*0.8)+'px'); 22 | showMessage(ID_DIALOG_ADD_ENV,'false',false,-1); 23 | showMessage('fade','false',false,-1); 24 | return false;// 不在传递至父容器 25 | }); 26 | 27 | $("#id-env-list").on("click",".edit-env",function() { 28 | lookUp(ID_DIALOG_ADD_ENV, '', '', 600 ,7,''); 29 | $("#dialog-content").css("max-height",($(document).height()*0.8)+'px'); 30 | setValue(ID_ENV_ID, $(this).attr(CRAP_DATA_ENV_ID)); 31 | setValue(ID_ENV_NAME, $(this).attr(CRAP_DATA_ENV_NAME)); 32 | showMessage(ID_DIALOG_ADD_ENV,'false',false,-1); 33 | showMessage('fade','false',false,-1); 34 | return false;// 不在传递至父容器 35 | }); 36 | 37 | $("#id-env-list").on("click",".delete-env",function() { 38 | if(!myConfirm(getText(l_confirmDelete))) 39 | { 40 | return false; 41 | } 42 | deleteEnv($(this).attr(CRAP_DATA_ENV_ID)); 43 | drawEnvList(); 44 | drawEnvVariable(); 45 | return false; 46 | }); 47 | 48 | $("#id-save-env").click(function(){ 49 | saveUpdateEnv(getValue(ID_ENV_ID), getValue(ID_ENV_NAME)); 50 | drawEnvList(); 51 | closeMyDialog(ID_DIALOG_ADD_ENV); 52 | }); 53 | 54 | $("#id-env-list").on("click","." + ENV_LIST_MENU,function() { 55 | drawEnvVariable($(this).attr(CRAP_DATA_ENV_ID)) 56 | $("." + ENV_LIST_MENU).removeClass("btn-main"); 57 | $(this).addClass("btn-main"); 58 | $("#id-save-env-var").removeClass("none"); 59 | $("#id-save-env-var").addClass("btn-adorn"); 60 | $("#id-save-env-var").removeClass("btn-main"); 61 | $("#id-save-env-var").html(getText(l_save)); 62 | }); 63 | 64 | 65 | // 变量 66 | $("#" + ID_ENV_VARIABLE_TABLE).on("keyup","input", function() { 67 | if($(this).val() != ''){ 68 | var tr = $(this).parent().parent(); 69 | if( tr.hasClass("last") ){ 70 | var table = tr.parent(); 71 | table.append(paramsTr); 72 | tr.removeClass("last"); 73 | } 74 | } 75 | }); 76 | $("#" + ID_ENV_VARIABLE_TABLE).on("click","i",function() { 77 | var tr = $(this).parent().parent(); 78 | // 最后一行不允许删除 79 | if( tr.hasClass("last")){ 80 | return; 81 | } 82 | tr.remove(); 83 | }); 84 | 85 | $("#id-save-env-var").click(function() { 86 | var texts = $("#" + ID_ENV_VARIABLE_TABLE + " input[type='text']"); 87 | var key = ""; 88 | var varList = $.parseJSON("[]"); 89 | $.each(texts, function(i, val) { 90 | try { 91 | if(val.getAttribute("data-stage") == "value"){ 92 | var value = val.value; 93 | if(handerStr(value) != ""){ 94 | var variable = { 95 | "key": key, 96 | "value": value 97 | }; 98 | varList.unshift(variable) 99 | } 100 | } else if(val.getAttribute("data-stage") == "key"){ 101 | key = val.value; 102 | } 103 | } catch (ex) { } 104 | }); 105 | 106 | saveAllVar(getValue(ID_EDIT_ENG_ID), varList) 107 | $(this).html(getText(l_varSaveSuccess)); 108 | $("#id-save-env-var").addClass("btn-main"); 109 | $("#id-save-env-var").removeClass("btn-adorn"); 110 | }); 111 | 112 | }) 113 | 114 | function drawInterfaceEnvList() { 115 | var envList = getAllEnv(); 116 | var envText = ""; 117 | for(var i=0 ; i 0) { 7 | var interface = interfaces[i]; 8 | interface.version = interface.version + 1; 9 | interfaces.splice(i,1); 10 | interfaces.splice(i-1, 0, interface); 11 | } 12 | break; 13 | } 14 | } 15 | saveAllInterfaces(moduleId, interfaces); 16 | refreshSyncIco(0); 17 | return true; 18 | } 19 | /*********下移接口*********/ 20 | function downInterface(moduleId, id) { 21 | var interfaces = getInterfacesByModuleId(moduleId); 22 | for(var i=0; i 0 ){ 97 | // 判断数组类型 98 | var type = ""; 99 | if( value[0] && typeof value[0] == 'object'){ 100 | type = 'object'; 101 | }else if (typeof value == 'string') { 102 | type= 'string'; 103 | }else if (typeof value == 'number') { 104 | type = 'number'; 105 | }else if (typeof value == 'boolean') { 106 | type = 'boolean'; 107 | } 108 | if( name != ''){ 109 | draw.push('{"deep":"'+tab.length+'","name":"'+name+'","remark":"","type":"array['+type+']","necessary":"true"}' + line); 110 | }else{ 111 | indent = indent -1; 112 | } 113 | 114 | // 数组只需要记录第一个就行 115 | notify("", value[0], indent); 116 | } 117 | 118 | } else if (value && typeof value == 'object') {/*处理对象*/ 119 | 120 | // 数组中的元素,没有名称 121 | if( name != ''){ 122 | // 将对象名放入队列 123 | draw.push('{"deep":"'+tab.length+'","name":"'+name+'","remark":"","type":"object","necessary":"true"}' + line); 124 | }else{ 125 | indent = indent -1;// 名称为空,无需缩进 126 | } 127 | 128 | for ( var key in value) 129 | notify(key, value[key], indent); 130 | 131 | } else { 132 | var type; 133 | if (typeof value == 'string') { 134 | value = value.replace(/\"/gm, '\\"'); 135 | value = '"' + value + '"'; 136 | type = 'string'; 137 | }else if (typeof value == 'number') { 138 | type = 'number'; 139 | }else if (typeof value == 'boolean') { 140 | type = 'boolean'; 141 | } 142 | 143 | if(name != ""){// 数组中的字符等没有名称 144 | draw.push('{"deep":"'+tab.length+'","name":"'+name+'","remark":"","type":"'+type+'","necessary":"true"}' + line); 145 | } 146 | } 147 | ; 148 | }; 149 | 150 | var indent = 0; 151 | notify('', data, indent); 152 | var result = draw.join(''); 153 | if(result.length > 0){ 154 | result = result.substring(0,result.length-1); 155 | } 156 | return "["+result+"]"; 157 | } 158 | -------------------------------------------------------------------------------- /chrome/source/locales/dev/translation.json: -------------------------------------------------------------------------------- 1 | { 2 | } 3 | -------------------------------------------------------------------------------- /chrome/source/locales/en/translation.json: -------------------------------------------------------------------------------- 1 | { 2 | "help":"Help Doc", 3 | "interfaceName":"Interface Name", 4 | "interfaceNameTip":"Please input interface name", 5 | "moduleNameTip":"Please input module name", 6 | "module":"Module", 7 | "moduleName":"Module Name", 8 | "saveModuleTip":"Save to exist module/folder", 9 | "newModuleTip":"Or create new module/folder", 10 | "save":"Save", 11 | "saveAs":"Save As", 12 | "renameModule":"Rename Module", 13 | "interfaceDebug":"Debug Interface", 14 | "jsonTool":"Json Tool", 15 | "officialWebsite":"Official Website", 16 | "setting":"Setting (系统设置)", 17 | "login":"Login", 18 | "loginAndIco":"Login →", 19 | "registerAndIco":"Register →", 20 | "inputJsonTip":"Please input json", 21 | "submit":"Submit", 22 | "tip":"Tips:", 23 | "env":{ 24 | "addEnv":"Add Environment", 25 | "envVariable":"Unselected environment", 26 | "envList":"Environment list", 27 | "manageEnvVariable":"Manage environment variable", 28 | "envName":"Environment name", 29 | "envVarList":"Environment Variable List", 30 | "varTip1":"1. Environment Variable can used in url,params,header. For Example:{{variable}}" 31 | }, 32 | "head" :{ 33 | "title":"Crap | Http Test Plug" 34 | }, 35 | "nav":{ 36 | "menu":"Left Menu", 37 | "loginOut":"Logout", 38 | "clearLocal":"Clear Local Data", 39 | "newTab":"New Tab", 40 | "newInterface":"New Interface", 41 | "sync":"Sync Data" 42 | }, 43 | "left":{ 44 | "history":"History" 45 | }, 46 | "right":{ 47 | "interfaceUrl":"Please input interface url", 48 | "send":"Send", 49 | "header":"Header", 50 | "param":"Param", 51 | "batchEdit":"Batch Edit", 52 | "singleEdit":"Single Edit", 53 | "custom":"Custom", 54 | "responseBody":"Response Body", 55 | "responseCookie":"Response Cookie", 56 | "responseHeader":"Response Header" 57 | }, 58 | "json":{ 59 | "row":"Row", 60 | "pretty":"Pretty", 61 | "expand":"Expand", 62 | "collapseOne":"Collapse One Level", 63 | "collapseTwo":"Collapse Two Level", 64 | "collapseThree":"Collapse Three Level", 65 | "collapseFour":"Collapse Four Level", 66 | "nl2br":"Nl2br", 67 | "help":"Help Doc" 68 | }, 69 | "response":{ 70 | "responseTip":"Hit the [Send] button to get a response", 71 | "responseHelp":"Click this to get help" 72 | }, 73 | "set":{ 74 | "language":"Plug Language(语言)", 75 | "serviceUrl":"Remote Service Url", 76 | "timeout":"Http Timeout", 77 | "inputServiceUrlTip":"Please input remote service website url", 78 | "defServiceUrlTip":"Default Service Url : http://api.crap.cn", 79 | "inputTimeoutTip":"Please input http timeout (ms)", 80 | "defTimeoutTip":"Default timeout — 10000(ms)" 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /chrome/source/locales/zh-CN/translation.json: -------------------------------------------------------------------------------- 1 | { 2 | "help":"帮助文档", 3 | "interfaceName":"接口名", 4 | "interfaceNameTip":"请输入接口名", 5 | "moduleNameTip":"请输入模块名", 6 | "module":"模块", 7 | "moduleName":"模块名", 8 | "saveModuleTip":"保存到已有的模块(已有模块与新模块名二选一)", 9 | "newModuleTip":"创建新的模块(已有模块与新模块名二选一)", 10 | "save":" 保存 ", 11 | "saveAs":"另存为", 12 | "renameModule":"重命名模块", 13 | "interfaceDebug":"接口调试", 14 | "jsonTool":"Json工具", 15 | "officialWebsite":"官网", 16 | "setting":"系统设置(Setting)", 17 | "login":"登录", 18 | "loginAndIco":"登陆 →", 19 | "registerAndIco":"登陆 →", 20 | "inputJsonTip":"请输入待格式化的Json数据,然后点击上方菜单栏格式化数据;\n如需修改原数据,请切换到原始数据菜单后再修改;", 21 | "submit":"提交", 22 | "tip":"提示:", 23 | "env":{ 24 | "addEnv":"添加环境", 25 | "envVariable":"未选择环境", 26 | "envList":"环境列表", 27 | "manageEnvVariable":"管理环境变量", 28 | "envName":"环境名", 29 | "envVarList":"环境变量列表", 30 | "varTip1":"1. 环境变量支持在接口url、参数、请求头中使用,使用规则为:{{变量名}}" 31 | 32 | }, 33 | "head" :{ 34 | "title":"Crap | Http接口调试插件" 35 | }, 36 | "nav":{ 37 | "menu":"左侧菜单", 38 | "loginOut":"退出", 39 | "clearLocal":"清除本地数据", 40 | "newTab":"打开新页面", 41 | "newInterface":"新建接口", 42 | "sync":"同步数据" 43 | }, 44 | "left":{ 45 | "history":"历史记录" 46 | }, 47 | "right":{ 48 | "interfaceUrl":"请输入接口地址", 49 | "send":"发送", 50 | "header":"请求头", 51 | "param":"请求参数", 52 | "batchEdit":"批量编辑", 53 | "singleEdit":"单个编辑", 54 | "custom":"自定义格式", 55 | "responseBody":"响应主体", 56 | "responseCookie":"Cookie", 57 | "responseHeader":"响应头" 58 | }, 59 | "json":{ 60 | "row":"原始数据", 61 | "pretty":"格式化", 62 | "expand":"全部展开", 63 | "collapseOne":"展开一级", 64 | "collapseTwo":"展开二级", 65 | "collapseThree":"展开三级", 66 | "collapseFour":"展开四级", 67 | "nl2br":"自动换行", 68 | "help":"帮助文档" 69 | }, 70 | "response":{ 71 | "responseTip":"请点击【发送】按钮测试接口", 72 | "responseHelp":"点击查看帮助文档 ~" 73 | }, 74 | "set":{ 75 | "language":"插件语言(Language)", 76 | "serviceUrl":"远程服务地址", 77 | "timeout":"网络请求超时时间", 78 | "inputServiceUrlTip":"如已私有部署CRAP接口管理系统,请输入远程服务器地址", 79 | "defServiceUrlTip":"默认服务器地址 : http://api.crap.cn", 80 | "inputTimeoutTip":"请输入接口调试超时时间 (单位:毫秒)", 81 | "defTimeoutTip":"默认接口调试超时时间 : 10000(毫秒)" 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /chrome/source/module-dao.js: -------------------------------------------------------------------------------- 1 | /*********上移*********/ 2 | function upModule(moduleId) { 3 | var modules = getAllModules(moduleId); 4 | for(var i=0; i 0) { 7 | var module = modules[i]; 8 | module.version = module.version + 1; 9 | modules.splice(i,1); 10 | modules.splice(i-1, 0, module); 11 | } 12 | break; 13 | } 14 | } 15 | saveAllModules(modules); 16 | refreshSyncIco(0); 17 | return true; 18 | } 19 | /*********下移*********/ 20 | function downModule(moduleId) { 21 | var modules = getAllModules(moduleId); 22 | for(var i=0; i span{display:block!important;} 173 | .more span i:hover{background-color:#4f3479;} 174 | #modules .interface-menu:hover{background-color:#ff4530!important} 175 | 176 | /***************** evn ***********************/ 177 | .env-list-menu{ 178 | position: relative; 179 | height:40px; 180 | line-height: 40px; 181 | border-bottom: 1px solid #eeeeee; 182 | padding-left:20px; 183 | cursor: pointer; 184 | padding-right: 60px; 185 | overflow: hidden; 186 | } 187 | .env-list-menu:hover{ 188 | background-color: #4e61d4; 189 | color: #ffffff; 190 | } 191 | .delete-env,.edit-env{ 192 | width:30px; 193 | text-align: center; 194 | height:100%; 195 | float: right; 196 | color:#ff4530; 197 | right: 0px; 198 | position: absolute; 199 | top: 0px; 200 | right: 0px; 201 | } 202 | .edit-env{ 203 | right: 30px!important; 204 | } 205 | .delete-env:hover, .edit-env:hover{ 206 | color:#ffffff; 207 | background-color:#ff4530; 208 | } 209 | #env-variable-table tr td:first-child{ 210 | width: 300px; 211 | } 212 | #env-variable-table tr td{ 213 | padding-left:20px; 214 | padding-right: 20px; 215 | padding-top:10px; 216 | padding-bottom:10px; 217 | 218 | } 219 | /*****************加载浮层***************************/ 220 | .folat{ 221 | display:none; 222 | position:fixed;top:0px;left:0px;right:0px;bottom:0px; 223 | z-index:100; 224 | background: rgba(0, 0, 0, 0.3); 225 | padding-top:20%; text-align:center; 226 | } 227 | .look-up { 228 | position: absolute; 229 | top: 40%; 230 | left: 35%; 231 | background: #000000; 232 | background: rgba(0, 0, 0, 0.2); 233 | display: none; 234 | color: #fff; 235 | z-index: 1051; 236 | background-color: #ffffff; 237 | } 238 | .look-up-content { 239 | position: relative; 240 | background: #FDFDFD; 241 | width: 100%; 242 | height: 100%; 243 | padding-top: 15px; 244 | overflow: auto; 245 | } 246 | .look-up .i-close { 247 | position: absolute; 248 | top: 12px; 249 | right: 12px; 250 | font-size: 14px; 251 | cursor: pointer; 252 | color:#999; 253 | } 254 | .tip-div{ 255 | text-align: center; 256 | overflow: hidden; 257 | padding: 5px 20px; 258 | line-height: 22px; 259 | border-radius: 5px; 260 | background: rgba(0,0,0,0.6); 261 | color: #fff; 262 | position: fixed; 263 | top:50%; 264 | left:50%; 265 | display:none; 266 | z-index: 1061; 267 | font-size:12px; 268 | } 269 | .text-error { 270 | border: 1px solid red; 271 | text-align: center; 272 | background: #ffebe8; 273 | color: #333333; 274 | } 275 | .text-success { 276 | border: 1px solid green; 277 | text-align: center; 278 | background: #c1e2b3; 279 | color: #333333; 280 | } 281 | /*************loading************/ 282 | .sk-wave .sk-rect { 283 | background-color: #4e61d4; 284 | } 285 | .sk-wave { 286 | margin: 40px auto; 287 | width: 50px; 288 | height: 40px; 289 | text-align: center; 290 | font-size: 10px; } 291 | .sk-wave .sk-rect { 292 | height: 100%; 293 | width: 6px; 294 | display: inline-block; 295 | -webkit-animation: sk-waveStretchDelay 1.2s infinite ease-in-out; 296 | animation: sk-waveStretchDelay 1.2s infinite ease-in-out; } 297 | .sk-wave .sk-rect1 { 298 | -webkit-animation-delay: -1.2s; 299 | animation-delay: -1.2s; } 300 | .sk-wave .sk-rect2 { 301 | -webkit-animation-delay: -1.1s; 302 | animation-delay: -1.1s; } 303 | .sk-wave .sk-rect3 { 304 | -webkit-animation-delay: -1s; 305 | animation-delay: -1s; } 306 | .sk-wave .sk-rect4 { 307 | -webkit-animation-delay: -0.9s; 308 | animation-delay: -0.9s; } 309 | .sk-wave .sk-rect5 { 310 | -webkit-animation-delay: -0.8s; 311 | animation-delay: -0.8s; } 312 | 313 | @-webkit-keyframes sk-waveStretchDelay { 314 | 0%, 40%, 100% { 315 | -webkit-transform: scaleY(0.4); 316 | transform: scaleY(0.4); } 317 | 20% { 318 | -webkit-transform: scaleY(1); 319 | transform: scaleY(1); } } 320 | 321 | @keyframes sk-waveStretchDelay { 322 | 0%, 40%, 100% { 323 | -webkit-transform: scaleY(0.4); 324 | transform: scaleY(0.4); } 325 | 20% { 326 | -webkit-transform: scaleY(1); 327 | transform: scaleY(1); } } 328 | /****************字体*********************/ 329 | body, h1, h2, h3, h4, h5, h6, hr, blockquote, dl, dt, dd, ul, ol, li, 330 | pre, form, fieldset, legend, button, input, textarea, th, td { 331 | font-family: "Lantinghei SC", "Open Sans", Arial, "Hiragino Sans GB", "Microsoft YaHei", "STHeiti", "WenQuanYi Micro Hei", SimSun, sans-serif; 332 | } 333 | 334 | -------------------------------------------------------------------------------- /chrome/source/tools/jquery-ui.min.css: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.12.1 - 2016-09-14 2 | * http://jqueryui.com 3 | * Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css 4 | * To view and modify this theme, visit http://jqueryui.com/themeroller/?bgShadowXPos=&bgOverlayXPos=&bgErrorXPos=&bgHighlightXPos=&bgContentXPos=&bgHeaderXPos=&bgActiveXPos=&bgHoverXPos=&bgDefaultXPos=&bgShadowYPos=&bgOverlayYPos=&bgErrorYPos=&bgHighlightYPos=&bgContentYPos=&bgHeaderYPos=&bgActiveYPos=&bgHoverYPos=&bgDefaultYPos=&bgShadowRepeat=&bgOverlayRepeat=&bgErrorRepeat=&bgHighlightRepeat=&bgContentRepeat=&bgHeaderRepeat=&bgActiveRepeat=&bgHoverRepeat=&bgDefaultRepeat=&iconsHover=url(%22images%2Fui-icons_555555_256x240.png%22)&iconsHighlight=url(%22images%2Fui-icons_777620_256x240.png%22)&iconsHeader=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsError=url(%22images%2Fui-icons_cc0000_256x240.png%22)&iconsDefault=url(%22images%2Fui-icons_777777_256x240.png%22)&iconsContent=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsActive=url(%22images%2Fui-icons_ffffff_256x240.png%22)&bgImgUrlShadow=&bgImgUrlOverlay=&bgImgUrlHover=&bgImgUrlHighlight=&bgImgUrlHeader=&bgImgUrlError=&bgImgUrlDefault=&bgImgUrlContent=&bgImgUrlActive=&opacityFilterShadow=Alpha(Opacity%3D30)&opacityFilterOverlay=Alpha(Opacity%3D30)&opacityShadowPerc=30&opacityOverlayPerc=30&iconColorHover=%23555555&iconColorHighlight=%23777620&iconColorHeader=%23444444&iconColorError=%23cc0000&iconColorDefault=%23777777&iconColorContent=%23444444&iconColorActive=%23ffffff&bgImgOpacityShadow=0&bgImgOpacityOverlay=0&bgImgOpacityError=95&bgImgOpacityHighlight=55&bgImgOpacityContent=75&bgImgOpacityHeader=75&bgImgOpacityActive=65&bgImgOpacityHover=75&bgImgOpacityDefault=75&bgTextureShadow=flat&bgTextureOverlay=flat&bgTextureError=flat&bgTextureHighlight=flat&bgTextureContent=flat&bgTextureHeader=flat&bgTextureActive=flat&bgTextureHover=flat&bgTextureDefault=flat&cornerRadius=3px&fwDefault=normal&ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&cornerRadiusShadow=8px&thicknessShadow=5px&offsetLeftShadow=0px&offsetTopShadow=0px&opacityShadow=.3&bgColorShadow=%23666666&opacityOverlay=.3&bgColorOverlay=%23aaaaaa&fcError=%235f3f3f&borderColorError=%23f1a899&bgColorError=%23fddfdf&fcHighlight=%23777620&borderColorHighlight=%23dad55e&bgColorHighlight=%23fffa90&fcContent=%23333333&borderColorContent=%23dddddd&bgColorContent=%23ffffff&fcHeader=%23333333&borderColorHeader=%23dddddd&bgColorHeader=%23e9e9e9&fcActive=%23ffffff&borderColorActive=%23003eff&bgColorActive=%23007fff&fcHover=%232b2b2b&borderColorHover=%23cccccc&bgColorHover=%23ededed&fcDefault=%23454545&borderColorDefault=%23c5c5c5&bgColorDefault=%23f6f6f6 5 | * Copyright jQuery Foundation and other contributors; Licensed MIT */ 6 | 7 | .ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #c5c5c5}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:bold}.ui-widget-header a{color:#333}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #c5c5c5;background:#f6f6f6;font-weight:normal;color:#454545}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#454545;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #ccc;background:#ededed;font-weight:normal;color:#2b2b2b}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#2b2b2b;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #003eff;background:#007fff;font-weight:normal;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#003eff;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dad55e;background:#fffa90;color:#777620}.ui-state-checked{border:1px solid #dad55e;background:#fffa90}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#777620}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f1a899;background:#fddfdf;color:#5f3f3f}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#5f3f3f}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#5f3f3f}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_555555_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_777620_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cc0000_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_777777_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:3px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:3px}.ui-widget-overlay{background:#aaa;opacity:.003;filter:Alpha(Opacity=.3)}.ui-widget-shadow{-webkit-box-shadow:0 0 5px #666;box-shadow:0 0 5px #666} -------------------------------------------------------------------------------- /chrome/source/tools/jquery.cookie.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery Cookie Plugin v1.4.1 3 | * https://github.com/carhartl/jquery-cookie 4 | * 5 | * Copyright 2013 Klaus Hartl 6 | * Released under the MIT license 7 | */ 8 | (function (factory) { 9 | if (typeof define === 'function' && define.amd) { 10 | // AMD 11 | define(['jquery'], factory); 12 | } else if (typeof exports === 'object') { 13 | // CommonJS 14 | factory(require('jquery')); 15 | } else { 16 | // Browser globals 17 | factory(jQuery); 18 | } 19 | }(function ($) { 20 | 21 | var pluses = /\+/g; 22 | 23 | function encode(s) { 24 | return config.raw ? s : encodeURIComponent(s); 25 | } 26 | 27 | function decode(s) { 28 | return config.raw ? s : decodeURIComponent(s); 29 | } 30 | 31 | function stringifyCookieValue(value) { 32 | return encode(config.json ? JSON.stringify(value) : String(value)); 33 | } 34 | 35 | function parseCookieValue(s) { 36 | if (s.indexOf('"') === 0) { 37 | // This is a quoted cookie as according to RFC2068, unescape... 38 | s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\'); 39 | } 40 | 41 | try { 42 | // Replace server-side written pluses with spaces. 43 | // If we can't decode the cookie, ignore it, it's unusable. 44 | // If we can't parse the cookie, ignore it, it's unusable. 45 | s = decodeURIComponent(s.replace(pluses, ' ')); 46 | return config.json ? JSON.parse(s) : s; 47 | } catch(e) {} 48 | } 49 | 50 | function read(s, converter) { 51 | var value = config.raw ? s : parseCookieValue(s); 52 | return $.isFunction(converter) ? converter(value) : value; 53 | } 54 | 55 | var config = $.cookie = function (key, value, options) { 56 | 57 | // Write 58 | 59 | if (value !== undefined && !$.isFunction(value)) { 60 | options = $.extend({}, config.defaults, options); 61 | 62 | if (typeof options.expires === 'number') { 63 | var days = options.expires, t = options.expires = new Date(); 64 | t.setTime(+t + days * 864e+5); 65 | } 66 | 67 | return (document.cookie = [ 68 | encode(key), '=', stringifyCookieValue(value), 69 | options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE 70 | options.path ? '; path=' + options.path : '', 71 | options.domain ? '; domain=' + options.domain : '', 72 | options.secure ? '; secure' : '' 73 | ].join('')); 74 | } 75 | 76 | // Read 77 | 78 | var result = key ? undefined : {}; 79 | 80 | // To prevent the for loop in the first place assign an empty array 81 | // in case there are no cookies at all. Also prevents odd result when 82 | // calling $.cookie(). 83 | var cookies = document.cookie ? document.cookie.split('; ') : []; 84 | 85 | for (var i = 0, l = cookies.length; i < l; i++) { 86 | var parts = cookies[i].split('='); 87 | var name = decode(parts.shift()); 88 | var cookie = parts.join('='); 89 | 90 | if (key && key === name) { 91 | // If second argument (value) is a function it's a converter... 92 | result = read(cookie, value); 93 | break; 94 | } 95 | 96 | // Prevent storing a cookie that we couldn't decode. 97 | if (!key && (cookie = read(cookie)) !== undefined) { 98 | result[name] = cookie; 99 | } 100 | } 101 | 102 | return result; 103 | }; 104 | 105 | config.defaults = {}; 106 | 107 | $.removeCookie = function (key, options) { 108 | if ($.cookie(key) === undefined) { 109 | return false; 110 | } 111 | 112 | // Must not alter options, thus extending a fresh object... 113 | $.cookie(key, '', $.extend({}, options, { expires: -1 })); 114 | return !$.cookie(key); 115 | }; 116 | 117 | })); 118 | -------------------------------------------------------------------------------- /chrome/source/tools/jquery.jsonview.css: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | .jsonview { 3 | font-family: monospace; 4 | font-size: 1.1em; 5 | white-space: pre-wrap; } 6 | .jsonview .prop { 7 | font-weight: bold; } 8 | .jsonview .null { 9 | color: red; } 10 | .jsonview .bool { 11 | color: blue; } 12 | .jsonview .num { 13 | color: blue; } 14 | .jsonview .string { 15 | color: green; 16 | white-space: pre-wrap; } 17 | .jsonview .string.multiline { 18 | display: inline-block; 19 | vertical-align: text-top; } 20 | .jsonview .collapser { 21 | position: absolute; 22 | left: -1em; 23 | cursor: pointer; } 24 | .jsonview .collapsible { 25 | transition: height 1.2s; 26 | transition: width 1.2s; } 27 | .jsonview .collapsible.collapsed { 28 | height: .8em; 29 | width: 1em; 30 | display: inline-block; 31 | overflow: hidden; 32 | margin: 0; } 33 | .jsonview .collapsible.collapsed:before { 34 | content: "…"; 35 | width: 1em; 36 | margin-left: .2em; } 37 | .jsonview .collapser.collapsed { 38 | transform: rotate(0deg); } 39 | .jsonview .q { 40 | display: inline-block; 41 | width: 0px; 42 | color: transparent; } 43 | .jsonview li { 44 | position: relative; } 45 | .jsonview ul { 46 | list-style: none; 47 | margin: 0 0 0 2em; 48 | padding: 0; } 49 | .jsonview h1 { 50 | font-size: 1.2em; } 51 | 52 | /*# sourceMappingURL=jquery.jsonview.css.map */ 53 | -------------------------------------------------------------------------------- /chrome/source/tools/jquery.jsonview.js: -------------------------------------------------------------------------------- 1 | 2 | /*! 3 | jQuery JSONView. 4 | Licensed under the MIT License. 5 | */ 6 | (function(jQuery) { 7 | var $, Collapser, JSONFormatter, JSONView; 8 | JSONFormatter = (function() { 9 | function JSONFormatter(options) { 10 | if (options == null) { 11 | options = {}; 12 | } 13 | this.options = options; 14 | } 15 | 16 | JSONFormatter.prototype.htmlEncode = function(html) { 17 | if (html !== null) { 18 | return html.toString().replace(/&/g, "&").replace(/"/g, """).replace(//g, ">"); 19 | } else { 20 | return ''; 21 | } 22 | }; 23 | 24 | JSONFormatter.prototype.jsString = function(s) { 25 | s = JSON.stringify(s).slice(1, -1); 26 | return this.htmlEncode(s); 27 | }; 28 | 29 | JSONFormatter.prototype.decorateWithSpan = function(value, className) { 30 | return "" + (this.htmlEncode(value)) + ""; 31 | }; 32 | 33 | JSONFormatter.prototype.valueToHTML = function(value, level) { 34 | var valueType; 35 | if (level == null) { 36 | level = 0; 37 | } 38 | valueType = Object.prototype.toString.call(value).match(/\s(.+)]/)[1].toLowerCase(); 39 | return this["" + valueType + "ToHTML"].call(this, value, level); 40 | }; 41 | 42 | JSONFormatter.prototype.nullToHTML = function(value) { 43 | return this.decorateWithSpan('null', 'null'); 44 | }; 45 | 46 | JSONFormatter.prototype.numberToHTML = function(value) { 47 | return this.decorateWithSpan(value, 'num'); 48 | }; 49 | 50 | JSONFormatter.prototype.stringToHTML = function(value) { 51 | var multilineClass, newLinePattern; 52 | if (/^(http|https|file):\/\/[^\s]+$/i.test(value)) { 53 | return "\"" + (this.jsString(value)) + "\""; 54 | } else { 55 | multilineClass = ''; 56 | value = this.jsString(value); 57 | if (this.options.nl2br) { 58 | newLinePattern = /([^>\\r\\n]?)(\\r\\n|\\n\\r|\\r|\\n)/g; 59 | if (newLinePattern.test(value)) { 60 | multilineClass = ' multiline'; 61 | value = (value + '').replace(newLinePattern, '$1' + '
'); 62 | } 63 | } 64 | return "\"" + value + "\""; 65 | } 66 | }; 67 | 68 | JSONFormatter.prototype.booleanToHTML = function(value) { 69 | return this.decorateWithSpan(value, 'bool'); 70 | }; 71 | 72 | JSONFormatter.prototype.arrayToHTML = function(array, level) { 73 | var collapsible, hasContents, index, numProps, output, value, _i, _len; 74 | if (level == null) { 75 | level = 0; 76 | } 77 | hasContents = false; 78 | output = ''; 79 | numProps = array.length; 80 | for (index = _i = 0, _len = array.length; _i < _len; index = ++_i) { 81 | value = array[index]; 82 | hasContents = true; 83 | output += '
  • ' + this.valueToHTML(value, level + 1); 84 | if (numProps > 1) { 85 | output += ','; 86 | } 87 | output += '
  • '; 88 | numProps--; 89 | } 90 | if (hasContents) { 91 | collapsible = level === 0 ? '' : ' collapsible'; 92 | return "[
      " + output + "
    ]"; 93 | } else { 94 | return '[ ]'; 95 | } 96 | }; 97 | 98 | JSONFormatter.prototype.objectToHTML = function(object, level) { 99 | var collapsible, hasContents, key, numProps, output, prop, value; 100 | if (level == null) { 101 | level = 0; 102 | } 103 | hasContents = false; 104 | output = ''; 105 | numProps = 0; 106 | for (prop in object) { 107 | numProps++; 108 | } 109 | for (prop in object) { 110 | value = object[prop]; 111 | hasContents = true; 112 | key = this.options.escape ? this.jsString(prop) : prop; 113 | output += "
  • \"" + key + "\": " + (this.valueToHTML(value, level + 1)); 114 | if (numProps > 1) { 115 | output += ','; 116 | } 117 | output += '
  • '; 118 | numProps--; 119 | } 120 | if (hasContents) { 121 | collapsible = level === 0 ? '' : ' collapsible'; 122 | return "{
      " + output + "
    }"; 123 | } else { 124 | return '{ }'; 125 | } 126 | }; 127 | 128 | JSONFormatter.prototype.jsonToHTML = function(json) { 129 | return "
    " + (this.valueToHTML(json)) + "
    "; 130 | }; 131 | 132 | return JSONFormatter; 133 | 134 | })(); 135 | (typeof module !== "undefined" && module !== null) && (module.exports = JSONFormatter); 136 | Collapser = (function() { 137 | function Collapser() {} 138 | 139 | Collapser.bindEvent = function(item, options) { 140 | var collapser; 141 | collapser = document.createElement('div'); 142 | collapser.className = 'collapser'; 143 | collapser.innerHTML = options.collapsed ? '+' : '-'; 144 | collapser.addEventListener('click', (function(_this) { 145 | return function(event) { 146 | return _this.toggle(event.target, options); 147 | }; 148 | })(this)); 149 | item.insertBefore(collapser, item.firstChild); 150 | if (options.collapsed) { 151 | return this.collapse(collapser); 152 | } 153 | }; 154 | 155 | Collapser.expand = function(collapser) { 156 | var ellipsis, target; 157 | target = this.collapseTarget(collapser); 158 | if (target.style.display === '') { 159 | return; 160 | } 161 | ellipsis = target.parentNode.getElementsByClassName('ellipsis')[0]; 162 | target.parentNode.removeChild(ellipsis); 163 | target.style.display = ''; 164 | return collapser.innerHTML = '-'; 165 | }; 166 | 167 | Collapser.collapse = function(collapser) { 168 | var ellipsis, target; 169 | target = this.collapseTarget(collapser); 170 | if (target.style.display === 'none') { 171 | return; 172 | } 173 | target.style.display = 'none'; 174 | ellipsis = document.createElement('span'); 175 | ellipsis.className = 'ellipsis'; 176 | ellipsis.innerHTML = ' … '; 177 | target.parentNode.insertBefore(ellipsis, target); 178 | return collapser.innerHTML = '+'; 179 | }; 180 | 181 | Collapser.toggle = function(collapser, options) { 182 | var action, collapsers, target, _i, _len, _results; 183 | if (options == null) { 184 | options = {}; 185 | } 186 | target = this.collapseTarget(collapser); 187 | action = target.style.display === 'none' ? 'expand' : 'collapse'; 188 | if (options.recursive_collapser) { 189 | collapsers = collapser.parentNode.getElementsByClassName('collapser'); 190 | _results = []; 191 | for (_i = 0, _len = collapsers.length; _i < _len; _i++) { 192 | collapser = collapsers[_i]; 193 | _results.push(this[action](collapser)); 194 | } 195 | return _results; 196 | } else { 197 | return this[action](collapser); 198 | } 199 | }; 200 | 201 | Collapser.collapseTarget = function(collapser) { 202 | var target, targets; 203 | targets = collapser.parentNode.getElementsByClassName('collapsible'); 204 | if (!targets.length) { 205 | return; 206 | } 207 | return target = targets[0]; 208 | }; 209 | 210 | return Collapser; 211 | 212 | })(); 213 | $ = jQuery; 214 | JSONView = { 215 | collapse: function(el) { 216 | if (el.innerHTML === '-') { 217 | return Collapser.collapse(el); 218 | } 219 | }, 220 | expand: function(el) { 221 | if (el.innerHTML === '+') { 222 | return Collapser.expand(el); 223 | } 224 | }, 225 | toggle: function(el) { 226 | return Collapser.toggle(el); 227 | } 228 | }; 229 | return $.fn.JSONView = function() { 230 | var args, defaultOptions, formatter, json, method, options, outputDoc; 231 | args = arguments; 232 | if (JSONView[args[0]] != null) { 233 | method = args[0]; 234 | return this.each(function() { 235 | var $this, level; 236 | $this = $(this); 237 | if (args[1] != null) { 238 | level = args[1]; 239 | return $this.find(".jsonview .collapsible.level" + level).siblings('.collapser').each(function() { 240 | return JSONView[method](this); 241 | }); 242 | } else { 243 | return $this.find('.jsonview > ul > li .collapsible').siblings('.collapser').each(function() { 244 | return JSONView[method](this); 245 | }); 246 | } 247 | }); 248 | } else { 249 | json = args[0]; 250 | options = args[1] || {}; 251 | defaultOptions = { 252 | collapsed: false, 253 | nl2br: false, 254 | recursive_collapser: false, 255 | escape: true 256 | }; 257 | options = $.extend(defaultOptions, options); 258 | formatter = new JSONFormatter({ 259 | nl2br: options.nl2br, 260 | escape: options.escape 261 | }); 262 | if (Object.prototype.toString.call(json) === '[object String]') { 263 | json = JSON.parse(json); 264 | } 265 | outputDoc = formatter.jsonToHTML(json); 266 | return this.each(function() { 267 | var $this, item, items, _i, _len, _results; 268 | $this = $(this); 269 | $this.html(outputDoc); 270 | items = $this[0].getElementsByClassName('collapsible'); 271 | _results = []; 272 | for (_i = 0, _len = items.length; _i < _len; _i++) { 273 | item = items[_i]; 274 | if (item.parentNode.nodeName === 'LI') { 275 | _results.push(Collapser.bindEvent(item.parentNode, options)); 276 | } else { 277 | _results.push(void 0); 278 | } 279 | } 280 | return _results; 281 | }); 282 | } 283 | }; 284 | })(jQuery); 285 | -------------------------------------------------------------------------------- /release/440x280.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EhsanTang/ApiDebug/54b2234633b4448fff545bb0424a22042fde3773/release/440x280.png -------------------------------------------------------------------------------- /release/640x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EhsanTang/ApiDebug/54b2234633b4448fff545bb0424a22042fde3773/release/640x400.png -------------------------------------------------------------------------------- /release/920x680.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EhsanTang/ApiDebug/54b2234633b4448fff545bb0424a22042fde3773/release/920x680.png -------------------------------------------------------------------------------- /release/chrome/apiDebug.1.0.8-en.crx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EhsanTang/ApiDebug/54b2234633b4448fff545bb0424a22042fde3773/release/chrome/apiDebug.1.0.8-en.crx -------------------------------------------------------------------------------- /release/chrome/apiDebug.v.1.0.7.crx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EhsanTang/ApiDebug/54b2234633b4448fff545bb0424a22042fde3773/release/chrome/apiDebug.v.1.0.7.crx -------------------------------------------------------------------------------- /release/chrome/apiDebug.v1.0.4.crx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EhsanTang/ApiDebug/54b2234633b4448fff545bb0424a22042fde3773/release/chrome/apiDebug.v1.0.4.crx -------------------------------------------------------------------------------- /release/chrome/apiDebug.zh.v1.0.0.crx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EhsanTang/ApiDebug/54b2234633b4448fff545bb0424a22042fde3773/release/chrome/apiDebug.zh.v1.0.0.crx -------------------------------------------------------------------------------- /release/chrome/dbdonnbbnhgojidhcogkapdldcheclnn_main.crx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EhsanTang/ApiDebug/54b2234633b4448fff545bb0424a22042fde3773/release/chrome/dbdonnbbnhgojidhcogkapdldcheclnn_main.crx --------------------------------------------------------------------------------