From 079c8a86daadc0fb8b13fe9f551e3fa862eaade8 Mon Sep 17 00:00:00 2001 From: HuangXin Date: Tue, 10 Sep 2019 08:13:33 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- css/popup.css | 287 +++++++++++++++++++++++++++++++++++++++++++++++ icon/icon.png | Bin 0 -> 18044 bytes js/background.js | 94 ++++++++++++++++ js/oa.js | 140 +++++++++++++++++++++++ js/popup.js | 76 +++++++++++++ js/read.js | 0 manifest.json | 28 +++++ popup.html | 33 ++++++ 8 files changed, 658 insertions(+) create mode 100644 css/popup.css create mode 100644 icon/icon.png create mode 100644 js/background.js create mode 100644 js/oa.js create mode 100644 js/popup.js create mode 100644 js/read.js create mode 100644 manifest.json create mode 100644 popup.html diff --git a/css/popup.css b/css/popup.css new file mode 100644 index 0000000..f7c733f --- /dev/null +++ b/css/popup.css @@ -0,0 +1,287 @@ +body { + font-family: Arial, Helvetica, sans-serif; +} + +* { + box-sizing: border-box; +} + +/* 容器样式 */ + +.container { + position: relative; + border-radius: 5px; + background-color: #f2f2f2; + padding: 20px 0 30px 0; +} + +/* 输入框,链接按钮样式 */ + +input, .btn { + width: 100%; + padding: 12px; + border: none; + border-radius: 4px; + margin: 5px 0; + opacity: 0.85; + display: inline-block; + font-size: 17px; + line-height: 20px; + text-decoration: none; + /* 移除锚文本链接下划线 */ +} + +input:hover, .btn:hover { + opacity: 1; +} + +/* 按钮背景颜色 */ + +.fb { + background-color: #3B5998; + color: white; +} + +.twitter { + background-color: #55ACEE; + color: white; +} + +.google { + background-color: #dd4b39; + color: white; +} + +/* 提交按钮样式 */ + +input[type=submit] { + background-color: #4CAF50; + color: white; + cursor: pointer; +} + +input[type=submit]:hover { + background-color: #45a049; +} + +/* 两列布局 */ + +.col { + float: left; + width: 50%; + margin: auto; + padding: 0 50px; + margin-top: 6px; +} + +/* 清除浮动 */ + +.row:after { + content: ""; + display: table; + clear: both; +} + +/* vertical line */ + +.vl { + position: absolute; + left: 50%; + transform: translate(-50%); + border: 2px solid #ddd; + height: 175px; +} + +/* 水平方向的文本 */ + +.vl-innertext { + position: absolute; + top: 50%; + transform: translate(-50%, -50%); + background-color: #f1f1f1; + border: 1px solid #ccc; + border-radius: 50%; + padding: 8px 10px; +} + +/* 大屏幕隐藏文本 */ + +.hide-md-lg { + display: none; +} + +/* 底部容器 */ + +.bottom-container { + text-align: center; + background-color: #666; + border-radius: 0px 0px 4px 4px; +} + +/* 响应式设计,在设备屏幕尺寸小于 650px ,上下丢跌显示 */ + +@media screen and (max-width: 650px) { + .col { + width: 100%; + margin-top: 0; + } + /* hide the vertical line */ + .vl { + display: none; + } + /* show the hidden text on small screens */ + .hide-md-lg { + display: block; + text-align: center; + } +} + +/* Rounded sliders */ + +/** + * 隐藏默认的checkbox + */ + +input[type=checkbox] { + visibility: hidden; +} + +.checkboxThree { + width: 120px; + height: 40px; + background: #333; + margin: 20px 60px; + border-radius: 50px; + position: relative; +} + +/** + * Create the text for the On position + */ + +.checkboxThree:before { + content: 'Run'; + position: absolute; + top: 12px; + left: 13px; + height: 2px; + color: #26ca28; + font-size: 16px; +} + +/** + * Create the label for the off position + */ + +.checkboxThree:after { + content: 'Stop'; + position: absolute; + top: 12px; + left: 75px; + height: 2px; + color: #ddd; + font-size: 16px; +} + +/** + * Create the pill to click + */ + +.checkboxThree label { + display: block; + width: 52px; + height: 22px; + border-radius: 50px; + -webkit-transition: all .5s ease; + -moz-transition: all .5s ease; + -o-transition: all .5s ease; + -ms-transition: all .5s ease; + transition: all .5s ease; + cursor: pointer; + position: absolute; + top: 9px; + z-index: 1; + left: 12px; + background: #ddd; +} + +/** + * Create the checkbox event for the label + */ + +.checkboxThree input[type=checkbox]:checked+label { + left: 60px; + background: #26ca28; +} + +.graphic-design { + width: 0%; + /* -moz-animation: graphic-design 2s ease-out; + -webkit-animation: graphic-design 2s ease-out; */ + background-color: #f674a4; + background-image: -webkit-gradient(linear, left top, left bottom, from(#f674a4), to(#e06995)); + background-image: -webkit-linear-gradient(top, #f674a4, #e06995); + background-image: -moz-linear-gradient(top, #f674a4, #e06995); + background-image: -ms-linear-gradient(top, #f674a4, #e06995); + background-image: -o-linear-gradient(top, #f674a4, #e06995); + background-image: linear-gradient(top, #f674a4, #e06995); +} + +#skill { + list-style: none; + font: 12px "Helvetica Neue", Arial, Helvetica, Geneva, sans-serif; + width: 240px; + margin: 50px auto 0; + position: relative; + line-height: 2em; + padding: 30px 0; +} + +#skill li { + margin-bottom: 50px; + background: #e9e5e2; + background-image: -webkit-gradient(linear, left top, left bottom, from(#e1ddd9), to(#e9e5e2)); + background-image: -webkit-linear-gradient(top, #e1ddd9, #e9e5e2); + background-image: -moz-linear-gradient(top, #e1ddd9, #e9e5e2); + background-image: -ms-linear-gradient(top, #e1ddd9, #e9e5e2); + background-image: -o-linear-gradient(top, #e1ddd9, #e9e5e2); + background-image: linear-gradient(top, #e1ddd9, #e9e5e2); + height: 20px; + border-radius: 10px; + -moz-box-shadow: 0 1px 0px #bebbb9 inset, 0 1px 0 #fcfcfc; + -webkit-box-shadow: 0 1px 0px #bebbb9 inset, 0 1px 0 #fcfcfc; + box-shadow: 0 1px 0px #bebbb9 inset, 0 1px 0 #fcfcfc; +} + +#skill li h3 { + position: relative; + top: -25px; +} + +.bar { + height: 18px; + margin: 1px 2px; + position: absolute; + border-radius: 10px; + -moz-box-shadow: 0 1px 0px #fcfcfc inset, 0 1px 0 #bebbb9; + -webkit-box-shadow: 0 1px 0px #fcfcfc inset, 0 1px 0 #bebbb9; + box-shadow: 0 1px 0px #fcfcfc inset, 0 1px 0 #bebbb9; +} + +/* @-moz-keyframes graphic-design { + 0% { + width: 0px; + } + 100% { + width: 10%; + } +} + +@-webkit-keyframes graphic-design { + 0% { + width: 0px; + } + 100% { + width: 10%; + } +} */ \ No newline at end of file diff --git a/icon/icon.png b/icon/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..12b2ad09a4e3ed0fe4c948224e0ba8adff08e3e5 GIT binary patch literal 18044 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 0) { + //console.log("%o", g_tabArray); + for (var i = 0; i < g_tabArray.length; i++) { + if (g_tabArray[i].status == "new") { + chrome.tabs.update(g_tabArray[i].tab.id, { active: true }); + g_tabArray[i].status = "opened"; + } + var now = new Date().getTime(); + + if (g_tabArray[i].lastClick == 0 || now - g_tabArray[i].stamp > 5 * 1000) { + chrome.tabs.sendMessage(g_tabArray[i].tab.id, { + from: 'background', to: 'content_scripts', action: 'read_page', tabId: g_tabArray[i].tab.id + }, function (response) { + console.log(response); + }); + g_tabArray[i].lastClick = now; + } + + console.log("%o", g_tabArray[i]); + + if (now - g_tabArray[i].stamp > 120 * 1000) { + console.log("timeout: %d, %d", now, g_tabArray[i].stamp); + chrome.tabs.remove(g_tabArray[i].tab.id); + g_tabArray.splice(i, 1); + } + } + } + }, 1000); +}); + +chrome.tabs.onRemoved.addListener(function (tabId, removeInfo) { + for (var i = 0; i < g_tabArray.length; i++) { + if (g_tabArray[i].tab.id = tabId) { + g_tabArray.splice(i, 1); + console.log("Remove Page[%d]:", tabId, removeInfo); + } + + if (g_tabArray.length == 0) { + chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) { + chrome.tabs.sendMessage(tabs[0].id, { from: 'background', to: 'content_scripts', action: 'run_cmd' }, function (response) { + console.log(response); + console.log("++++++++++++++++++++++ restart next process"); + }); + }); + } + } +}); + +chrome.extension.onMessage.addListener(function (request, sender, sendResponse) { + var msg = "Recv Commond [" + request.action + "] from (" + request.from + ")"; + sendResponse(msg); + console.log(msg); + if (request.action == "run_cmd") { + g_isRunCmd = true; + } else if (request.action == "stop_cmd") { + g_isRunCmd = false; + } else if (request.action == "run_table") { + for (var i = 0; i < 10; i++) { + chrome.tabs.query({ status: "complete", url: "https://oa.komect.com/oa/document*" }, function (tabs) { + if (tabs.length > 0) { + console.log("%o", tabs); + } + }); + } + } else if (request.action == "create_table") { + chrome.tabs.create({ url: request.url, active: false }, function (tb) { + g_tabArray.push({ tab: tb, stamp: new Date().getTime(), status: "new", lastClick: 0 }) + console.log("%o", tb); + }); + } else if (request.action == "click_table") { + for (var i = 0; i < g_tabArray.length; i++) { + if (g_tabArray[i].tab.id == request.tabId) { + g_tabArray[i].lastClick = new Date().getTime(); + console.log("Tab %d Click On %d", tabId, g_tabArray[i].lastClick); + } + } + } +}); \ No newline at end of file diff --git a/js/oa.js b/js/oa.js new file mode 100644 index 0000000..a73c00d --- /dev/null +++ b/js/oa.js @@ -0,0 +1,140 @@ +var g_tolItem = 0; + +document.addEventListener('DOMContentLoaded', function () { + console.log('我被执行了!'); + chrome.runtime.sendMessage({ from: "content_scripts" }, function (response) { + console.log(response); + }); +}); + +function sleep(time) { + return new Promise((resolve) => setTimeout(resolve, time)); +} + +function queryUnReadItems() { + var doc = document.getElementById('document-filter'); + + for (var i = 0; i < doc.childElementCount; i++) { + var ctx = doc.children[i].innerText.split(" "); + if (ctx.length > 1 && ctx[0] == "我的待阅") { + return { index: i, nItem: parseInt(ctx[1], 10) }; + } + } + + return 0; +} + +function flushUnReadList(id, nItems) { + var doc = document.getElementById('document-filter'); + + doc.children[id].firstElementChild.click(); + var cob = document.getElementById('listpagination'); + var selectObj = cob.children[1].firstElementChild; + console.log("Parent[1] = %o", cob.children[1]); + console.log("Parent[2] = %o", cob.children[1].firstElementChild); + + var n = 0;// nItems / 10; + + if (n == 2) { + selectObj.value = "20"; + } else if (n == 3) { + selectObj.value = "30"; + } else if (n >= 4) { + selectObj.value = "40"; + } else { + selectObj.value = "10"; + } + + selectObj.dispatchEvent(new Event('change', { 'bubbles': true })); + console.log("Refresh Web Pages"); +} + +function getUnReadList() { + var doc = document.getElementsByClassName('tab-pane active'); + + for (var i = 0; i < doc.length; i++) { + if (doc[i].id == 'toread') { + var tbl = doc[i].children[0].children[0].children[1]; + for (var j = 0; j < tbl.childElementCount; j++) { + if (tbl.children[j].className != "request") { + /* console.log("item(%d): %s %s", j, + tbl.children[j].children[0].innerText, + tbl.children[j].children[1].firstElementChild.href); */ + //tbl.children[j].children[1].firstElementChild.click(); + chrome.runtime.sendMessage({ + from: "content_scripts", + action: 'create_table', + url: tbl.children[j].children[1].firstElementChild.href + }, function (response) { + g_tolItem = g_tolItem + 1; + console.log(response); + }); + + if (j >= 2) { + return j; + } + } + } + + return 0; + } + } + + return 0; +} + +chrome.extension.onMessage.addListener( + function (request, sender, sendResponse) { + var msg = "Recv Commond [" + request.action + "] from (" + request.from + ")"; + sendResponse(msg); + console.log(msg); + if (request.action == "run_cmd") { + if(g_tolItem >= 4) { + console.log("------------ Cancel do"); + return; + } + for (var i = 0; i < 10; i++) { + var obj = queryUnReadItems(); + + if (obj.nItem > 0) { + var msg = "待阅处理: [" + obj.nItem + "] 条"; + console.log(msg); + flushUnReadList(obj.index, obj.nItem); + + sleep(3000).then(() => { + var j = 0, n = 0; + do { + n = getUnReadList(); + console.log("Retry:%d --> %d", j++, n); + } while (n == 0); + + console.log("Finish getUnReadList"); + return; + }); + + return; + } + + sleep(1000).then(() => { + console.log("第" + i + "次尝试获取待阅消息条数"); + }); + } + + console.log("没有待阅消息需要处理"); + } else if (request.action == "get_items") { + getUnReadList(); + } else if (request.action == "tab_info") { + chrome.runtime.sendMessage({ from: "content_scripts", to: "background", action: 'run_table' }, function (response) { + console.log(response); + }); + } else if (request.action == "read_page") { + sendResponse(""); + var rd = document.getElementById('toRead'); + rd.click(); + console.log("Click Button:%o", rd); + chrome.runtime.sendMessage({ from: "content_scripts", to: "background", action: 'click_table', tabId: request.tabId }, function (response) { + console.log(response); + }); + } + } +); \ No newline at end of file diff --git a/js/popup.js b/js/popup.js new file mode 100644 index 0000000..6426213 --- /dev/null +++ b/js/popup.js @@ -0,0 +1,76 @@ +var bg = chrome.extension.getBackgroundPage(); + +/* var testButton = document.getElementById('test_btn'); +var getItemsButton = document.getElementById('getItems_btn'); +var tabInfoButton = document.getElementById('tabInfo_btn'); + +testButton.addEventListener('click', function () { + console.log('debug tab:'); + chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) { + chrome.tabs.sendMessage(tabs[0].id, { from: 'popup', to: 'content_scripts', action: 'run_title' }, function (response) { + console.log(response); + }); + }); +}); + +getItemsButton.addEventListener('click', function () { + chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) { + chrome.tabs.sendMessage(tabs[0].id, { from: 'popup', to: 'content_scripts', action: 'get_items' }, function (response) { + console.log(response); + }); + }); +}); + +tabInfoButton.addEventListener('click', function () { + chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) { + chrome.tabs.sendMessage(tabs[0].id, { from: 'popup', to: 'content_scripts', action: 'tab_info' }, function (response) { + console.log(response); + }); + }); +}); + */ + +var runButton = document.getElementById('checkboxThreeInput'); + +runButton.addEventListener('click', function () { + console.log('debug tab:'); + var cmd = "stop_cmd"; + if (runButton.checked) { + cmd = "run_cmd" + } + + chrome.runtime.sendMessage({ from: 'popup', to: 'content_scripts', action: cmd }, function (response) { + console.log(response); + }); + /* chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) { + chrome.tabs.sendMessage(tabs[0].id, { from: 'popup', to: 'content_scripts', action: cmd }, function (response) { + console.log(response); + }); + }); */ +}); + +//var tabInfoButton = document.getElementById('runProgress'); + +/* chrome.extension.onMessage.addListener( + function (request, sender, sendResponse) { + console.log('收到消息', request); + sendResponse("回答处理结果"); + } +); */ + +/* var prog = 0; + +window.onload = function () { + var tolProgress = document.getElementById('runProgress'); + var prgTimer = setInterval(function () { + tolProgress.style.width = prog + "%"; + console.log("Progress: %d", prog); + if(prog++ >= 100) { + clearInterval(prgTimer); + } + }, 100); +} */ + +window.onload = function () { + runButton.checked = bg.g_isRunCmd; +} diff --git a/js/read.js b/js/read.js new file mode 100644 index 0000000..e69de29 diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..148f2da --- /dev/null +++ b/manifest.json @@ -0,0 +1,28 @@ +{ + "name": "HelloChrome", + "version": "1.0.0", + "manifest_version": 2, + "description": "Automatic Read Files", + "page_action": { + "default_title": "say", + "default_icon": "icon/icon.png", + "default_popup": "popup.html" + }, + "background": { + "scripts": [ + "js/background.js" + ], + "persistent": false + }, + "content_scripts": [ + { + "matches": ["https://oa.komect.com/oa*"], + "js": ["js/oa.js"], + "run_at": "document_start" + } + ], + "permissions": [ + "declarativeContent", + "tabs" + ] +} \ No newline at end of file diff --git a/popup.html b/popup.html new file mode 100644 index 0000000..d45bd73 --- /dev/null +++ b/popup.html @@ -0,0 +1,33 @@ + + + +

Automatic Read Files

+ +
+ John +
+
+ + +
+
    +
  • +

    Graphic Design

    +
  • +
+ +
+
\ No newline at end of file