zhangwei 2 éve
szülő
commit
b7ddfb695c

+ 25 - 0
src/denet/chrome/index.js

@@ -0,0 +1,25 @@
+import chromeMessageCenter from '@/uilts/messageCenter/chrome';
+import MESSAGE_ENUM from '@/uilts/messageCenter/chrome/messageEnum'
+
+export default {
+    // ---- 获取推文文案 ---- 
+    test({ tweetId }, overTime) {
+        return new Promise((res, rej) => {
+            chromeMessageCenter.send({
+                info: {
+                    actionType: MESSAGE_ENUM.BACK_TO_CONTENT_TEST,
+                },
+                data: {
+                    tweetId
+                },
+                overTime,
+                callback: (data) => {
+                    res(data);
+                },
+                failback: (e) => {
+                    rej(e)
+                }
+            })
+        })
+    }
+}

+ 2 - 1
src/uilts/denet/content/doTask.js → src/denet/content/doTask.js

@@ -1,6 +1,7 @@
 import MESSAGE_ENUM from '@/uilts/messageCenter/iframe/messageEnum'
 import messageCenter from '@/uilts/messageCenter/iframe'
-import { iframeId } from '@/uilts/help'
+import { getQueryString } from '@/uilts/help'
+const iframeId = getQueryString('iframeId')
 
 // 做任务
 const doTask = {

+ 7 - 3
src/uilts/denet/content/dom.js → src/denet/content/dom.js

@@ -1,16 +1,20 @@
 import MESSAGE_ENUM from '@/uilts/messageCenter/iframe/messageEnum'
 import messageCenter from '@/uilts/messageCenter/iframe'
+import { getQueryString } from '@/uilts/help'
+const iframeId = getQueryString('iframeId')
 
 const dom = {
     // ---- 获取推文文案 ---- 
-    getTweetText({ iframeId }, overTime) {
+    getTweetText({ tweetId }, overTime) {
         return new Promise((res, rej) => {
             messageCenter.send({
                 info: {
                     actionType: MESSAGE_ENUM.IFRAME_DOM_GET_TWEET_TEXT,
-                    iframeId: iframeId //用于告诉父窗口会传消息给哪个iframe
+                    iframeId //用于告诉父窗口会传消息给哪个iframe
+                },
+                data: {
+                    tweetId
                 },
-                data: {},
                 overTime,
                 callback: (data) => {
                     res(data);

+ 7 - 0
src/denet/content/index.js

@@ -0,0 +1,7 @@
+import doTask from '@/denet/content/doTask'
+import dom from '@/denet/content/dom'
+
+export default {
+    doTask,
+    dom
+}

+ 7 - 0
src/denet/index.js

@@ -0,0 +1,7 @@
+import content from '@/denet/content'
+
+const denet = {
+    content
+}
+
+export default denet

+ 3 - 0
src/entry/background.js

@@ -35,6 +35,7 @@ import {
 import {
     closeAchPayNoticeHandler
 } from "@/logic/background/denet";
+import chromeMessageCenter from '@/uilts/messageCenter/chrome';
 
 try {
     chrome.runtime.onMessage.addListener(onMessageMethod);
@@ -298,6 +299,8 @@ function onMessageMethod(req, sender, sendResponse) {
                     closeAchPayNoticeHandler();
                     break;
             }
+
+            chromeMessageCenter.init(req)
         }
     } catch (error) {
         Report.reportLog({

+ 12 - 0
src/entry/content.js

@@ -60,6 +60,8 @@ import {
 } from "@/logic/content/denet.js";
 
 import doTask from '@/logic/content/help/doTask'
+import chromeMessageCenter from '@/uilts/messageCenter/chrome';
+
 chrome.storage.onChanged.addListener(changes => {
     initExecuteScript(changes)
 })
@@ -250,6 +252,16 @@ chrome.runtime.onMessage.addListener((req, sender, sendResponse) => {
         case 'GET_CONTENT_BY_TWITTER_ID':
             sendContentByTwitterID(req.data.tweet_Id)
             break
+        case 'TEST':
+            console.log('TEST')
+            break
     }
     sendResponse && sendResponse('ok');
+    chromeMessageCenter.init(req)
 })
+
+// denet.chrome.test().then() 发background activeType 获取返回调用
+
+// content to background tabId
+// background to content 
+// content to background tabId

+ 1 - 2
src/logic/content/ParseCard.js

@@ -1,5 +1,3 @@
-import { iframeHost } from '@/http/configAPI'
-import { getChromeStorage, setChromeStorage } from '@/uilts/chromeExtension.js'
 import ToolBox from '@/view/content/tool-box/index.vue'
 import { createApp } from 'vue'
 import { getStorage, setStorage, guid } from '@/uilts/help'
@@ -347,6 +345,7 @@ class ParseCard {
         let _iframeId = `denet-${guid()}`
         let _iframe = document.createElement('iframe')
         _iframe.id = _iframeId
+        _iframe.dataset.card = 'denet'
         _iframe.src = chromeExtensionUrl + ('iframe/treasure-hunt.html') + `?params=${JSON.stringify(params)}&iframeId=${_iframeId}`;
         _iframe.style.cssText = 'border:medium none; width:375px; min-height:580px; border: 1px solid #DCDCDC; border-radius: 20px;'
         return _iframe

+ 40 - 40
src/logic/content/help/twitter.js

@@ -3,45 +3,45 @@ import { getChromeStorage, setChromeStorage } from '@/uilts/chromeExtension.js'
 
 // 根据提示dom 跳转到推文详情页面
 export const jumpTwitterDetailByAlert = () => {
-    let num = 10
-    let timer = setInterval(() => {
-        if (num <= 0) {
-            clearInterval(timer)
-            return
-        }
-        let alert = document.querySelector('div[role=alert]')
-        if (alert) {
-            let a = alert.querySelector('a')
-            if (a) {
-                clearInterval(timer)
-                a.click()
-            }
-        }
-        num--
-    }, 500)
+  let num = 10
+  let timer = setInterval(() => {
+    if (num <= 0) {
+      clearInterval(timer)
+      return
+    }
+    let alert = document.querySelector('div[role=alert]')
+    if (alert) {
+      let a = alert.querySelector('a')
+      if (a) {
+        clearInterval(timer)
+        a.click()
+      }
+    }
+    num--
+  }, 500)
 }
 
 export const showEditTweet = (callback) => {
-    let bigBtn = document.querySelector('a[data-testid="SideNav_NewTweet_Button"]');
-    if (bigBtn) {
-        bigBtn.click();
-    } else {
-        let smallBtn = document.querySelector('a[href="/compose/tweet"]')
-        smallBtn && smallBtn.click();
+  let bigBtn = document.querySelector('a[data-testid="SideNav_NewTweet_Button"]');
+  if (bigBtn) {
+    bigBtn.click();
+  } else {
+    let smallBtn = document.querySelector('a[href="/compose/tweet"]')
+    smallBtn && smallBtn.click();
+  }
+  let num = 10
+  let timer = setInterval(() => {
+    if (num <= 0) {
+      clearInterval(timer)
+      return
+    }
+    let inputEle = document.querySelector('div[contenteditable="true"]');
+    if (inputEle) {
+      clearInterval(timer)
+      callback && callback()
     }
-    let num = 10
-    let timer = setInterval(() => {
-        if(num <= 0){
-            clearInterval(timer)
-            return
-        }
-        let inputEle = document.querySelector('div[contenteditable="true"]');
-        if(inputEle){
-            clearInterval(timer)
-            callback && callback()
-        }
-        num--
-    }, 500);
+    num--
+  }, 500);
 }
 
 export const setDeviceInfo = async () => {
@@ -60,9 +60,9 @@ export const setDeviceInfo = async () => {
   }
 
   let storageDeviceInfo = getStorage(deviceStorageParams.name);
-  if(!storageDeviceInfo) {
+  if (!storageDeviceInfo) {
     let res = await getVisitorId();
-    let id =  res && res.visitorId || '';
+    let id = res && res.visitorId || '';
     setStorage(deviceStorageParams.name, id);
     deviceInfo.deviceId1 = id;
   } else {
@@ -70,7 +70,7 @@ export const setDeviceInfo = async () => {
   }
 
   let cookieDeviceInfo = getCookie(deviceCookieParams.name);
-  if(!cookieDeviceInfo) {
+  if (!cookieDeviceInfo) {
     let rid = guid();
     setCookie(deviceCookieParams.name, rid, 600);
     deviceInfo.deviceId2 = rid;
@@ -78,5 +78,5 @@ export const setDeviceInfo = async () => {
     deviceInfo.deviceId2 = cookieDeviceInfo;
   }
 
-  setChromeStorage({'deviceInfo': JSON.stringify(deviceInfo)});
-}
+  setChromeStorage({ 'deviceInfo': JSON.stringify(deviceInfo) });
+}

+ 0 - 7
src/uilts/denet/content/index.js

@@ -1,7 +0,0 @@
-import doTask from '@/uilts/denet/content/doTask'
-import dom from '@/uilts/denet/content/dom'
-
-export default {
-    doTask,
-    dom
-}

+ 0 - 7
src/uilts/denet/index.js

@@ -1,7 +0,0 @@
-import content from '@/uilts/denet/content'
-
-const denet = {
-    content
-}
-
-export default denet

+ 0 - 2
src/uilts/help.js

@@ -321,5 +321,3 @@ export const getBeforeTimeFormat = (timestamp) => {
   let _s = moment.duration(_d1.diff(_d2)).seconds()
   return plural(_s, 'sec')
 }
-
-export const iframeId = getQueryString('iframeId')

+ 103 - 0
src/uilts/messageCenter/chrome/index.js

@@ -0,0 +1,103 @@
+import { guid } from '@/uilts/help'
+//  iframe 通信中心
+class MessageCenter {
+    constructor() {
+        //  缓存事件队列
+        this.messageCallbackMap = new Map();
+        this.messageFailbackMap = new Map();
+        this.timer = null
+    }
+
+    send({ info = {}, data = {}, callback, overTime, failback }) {
+        if (!info.messageId) {
+            info.messageId = `${info.actionType}-${guid()}` // 唯一的ID,用于标记回调函数
+        }
+        try {
+            chrome.runtime.sendMessage({
+                info,
+                data
+            })
+
+            if (info.messageId && callback) {
+                // 带回调callback 的message, 要求携带messageId,callback,failback等
+                this.listen(info.messageId, callback)
+            }
+            if (failback) {
+                this.addFailback(info.messageId, overTime, failback)
+            }
+
+        } catch (error) {
+            failback({
+                error: 2,
+                msg: String(error)
+            })
+        }
+    }
+
+    listen(messageId, callback) {
+        // 序列添加失败回调
+        this.messageCallbackMap.set(messageId, { callback })
+    }
+
+    addFailback(messageId, overTime = 2000, failback) {
+        // 序列添加失败回调
+        this.messageFailbackMap.set(messageId, {
+            time: new Date().getTime(),
+            overTime,
+            failback
+        })
+        this.checkTimer()
+    }
+
+    init(req = {}) {
+        const { info, data } = req;
+        if (!info || !data) {
+            return
+        }
+        // 序列删除 失败回调
+        this.messageFailbackMap.delete(info.messageId);
+
+        // 执行成功回调
+        const _item = this.messageCallbackMap.get(info.messageId);
+        if (_item) {
+            const callback = _item.callback
+            callback(data)
+            // 序列删除 成功回调
+            this.messageCallbackMap.delete(info.messageId)
+        }
+        this.checkTimer()
+    }
+    checkTimer() {
+        if (this.timer) {
+            return
+        }
+        let key, value, now_time
+        this.timer = setInterval(() => {
+            if (this.messageFailbackMap.size == 0) {
+                clearInterval(this.timer)
+                this.timer = null
+            }
+
+            // 轮询查看有无超期的message信息
+            now_time = new Date().getTime();
+            for (let item of this.messageFailbackMap.entries()) {
+                key = item[0] || ''
+                value = item[1] || {}
+
+                if (now_time - value.time > value.overTime) {
+                    const callback = value.failback
+                    callback && callback({
+                        error: 1,
+                        msg: "message 超时错误"
+                    })
+                    this.messageFailbackMap.delete(key)
+                }
+            }
+        }, 1000)
+    }
+}
+
+// messageCenter在页面内实例化一次
+const messageCenter = new MessageCenter();
+
+export default messageCenter;

+ 13 - 0
src/uilts/messageCenter/chrome/messageEnum.js

@@ -0,0 +1,13 @@
+/** 向ServiceWorker发送的事件定义 */
+const CONTENT_TO_BACK_ENUM = {
+    CONTENT_TO_BACK_TEST: 'CONTENT_TO_BACK_TEST'
+}
+
+
+/** 接收ServiceWorker的事件定义 */
+const BACK_TO_CONTENT_ENUM = {
+    /** 切换到group tab */
+    BACK_TO_CONTENT_TEST: 'BACK_TO_CONTENT_TEST'
+}
+
+export default { ...CONTENT_TO_BACK_ENUM, ...BACK_TO_CONTENT_ENUM }

+ 10 - 0
src/uilts/messageCenter/content/index.js

@@ -22,6 +22,16 @@ class MessageCenter {
         }, '*')
     }
 
+    sendAll({ info, data }) {
+        const targets = document.querySelectorAll('iframe[data-card=denet]') || []
+        targets.forEach((item) => {
+            item.contentWindow.postMessage({
+                info,
+                data
+            }, '*')
+        })
+    }
+
     // ---- don't use ---- 
     // add(actionType, callback) {
     //     let activeQuene = this.messageCallbackMap.get(actionType);

+ 1 - 1
src/uilts/messageCenter/iframe/index.js

@@ -77,7 +77,7 @@ class MessageCenter {
                 if (now_time - value.time > value.overTime) {
                     const callback = value.failback
                     callback && callback({
-                        error: 0,
+                        error: 1,
                         msg: "message 超时错误"
                     })
                     this.messageFailbackMap.delete(key)

+ 4 - 2
src/view/iframe/treasure-hunt/index.vue

@@ -22,7 +22,7 @@ import { getChromeStorage, sendCurrentTabMessage } from '@/uilts/chromeExtension
 import VToast from '@/view/iframe/treasure-hunt/components/toast.vue'
 import OpenBox from '@/view/iframe/treasure-hunt/components/open-box.vue'
 import Report from "@/log-center/log"
-import denet from '@/uilts/denet'
+import denet from '@/denet'
 
 let state = reactive({
     loading_redbag: true,
@@ -66,9 +66,11 @@ onMounted(() => {
     onRuntimeMsg();
     // doLike()
 })
+// denet
+// chrome
 
 async function doLike() {
-    let task = await denet.content.doTask.like({ iframeId: state.iframeId, tweetId: '1564877034756534272' })
+    let task = await denet.content.doTask.like({ tweetId: '1564877034756534272' })
     console.log('task', task)
     if (tgas) {