background.js (4116B)
1 const port = browser.runtime.connectNative("browser"); 2 port.onMessage.addListener(message => { 3 handleMessage(message, null); 4 }); 5 6 browser.runtime.onMessage.addListener((message, sender) => { 7 handleMessage(message, sender.tab.id); 8 }); 9 10 browser.pageAction.onClicked.addListener(tab => { 11 port.postMessage({ method: "onClicked", tabId: tab.id, type: "pageAction" }); 12 }); 13 14 browser.browserAction.onClicked.addListener(tab => { 15 port.postMessage({ 16 method: "onClicked", 17 tabId: tab.id, 18 type: "browserAction", 19 }); 20 }); 21 22 function handlePageActionMessage(message, tabId) { 23 switch (message.action) { 24 case "enable": 25 browser.pageAction.show(tabId); 26 break; 27 28 case "disable": 29 browser.pageAction.hide(tabId); 30 break; 31 32 case "setPopup": 33 browser.pageAction.setPopup({ 34 tabId, 35 popup: message.popup, 36 }); 37 break; 38 39 case "setPopupCheckRestrictions": 40 browser.pageAction 41 .setPopup({ 42 tabId, 43 popup: message.popup, 44 }) 45 .then( 46 () => { 47 port.postMessage({ 48 resultFor: "setPopup", 49 type: "pageAction", 50 success: true, 51 }); 52 }, 53 err => { 54 port.postMessage({ 55 resultFor: "setPopup", 56 type: "pageAction", 57 success: false, 58 error: String(err), 59 }); 60 } 61 ); 62 break; 63 64 case "setTitle": 65 browser.pageAction.setTitle({ 66 tabId, 67 title: message.title, 68 }); 69 break; 70 71 case "setIcon": 72 browser.pageAction.setIcon({ 73 tabId, 74 imageData: message.imageData, 75 path: message.path, 76 }); 77 break; 78 79 default: 80 throw new Error(`Page Action does not support ${message.action}`); 81 } 82 } 83 84 function handleBrowserActionMessage(message, tabId) { 85 switch (message.action) { 86 case "enable": 87 browser.browserAction.enable(tabId); 88 break; 89 90 case "disable": 91 browser.browserAction.disable(tabId); 92 break; 93 94 case "setBadgeText": 95 browser.browserAction.setBadgeText({ 96 tabId, 97 text: message.text, 98 }); 99 break; 100 101 case "setBadgeTextColor": 102 browser.browserAction.setBadgeTextColor({ 103 tabId, 104 color: message.color, 105 }); 106 break; 107 108 case "setBadgeBackgroundColor": 109 browser.browserAction.setBadgeBackgroundColor({ 110 tabId, 111 color: message.color, 112 }); 113 break; 114 115 case "setPopup": 116 browser.browserAction.setPopup({ 117 tabId, 118 popup: message.popup, 119 }); 120 break; 121 122 case "setPopupCheckRestrictions": 123 browser.browserAction 124 .setPopup({ 125 tabId, 126 popup: message.popup, 127 }) 128 .then( 129 () => { 130 port.postMessage({ 131 resultFor: "setPopup", 132 type: "browserAction", 133 success: true, 134 }); 135 }, 136 err => { 137 port.postMessage({ 138 resultFor: "setPopup", 139 type: "browserAction", 140 success: false, 141 error: String(err), 142 }); 143 } 144 ); 145 break; 146 147 case "setTitle": 148 browser.browserAction.setTitle({ 149 tabId, 150 title: message.title, 151 }); 152 break; 153 154 case "setIcon": 155 browser.browserAction.setIcon({ 156 tabId, 157 imageData: message.imageData, 158 path: message.path, 159 }); 160 break; 161 162 default: 163 throw new Error(`Browser Action does not support ${message.action}`); 164 } 165 } 166 167 function handleMessage(message, tabId) { 168 switch (message.type) { 169 case "ping": 170 port.postMessage({ method: "pong" }); 171 return; 172 173 case "load": 174 browser.tabs.update(tabId, { 175 url: message.url, 176 }); 177 return; 178 179 case "browserAction": 180 handleBrowserActionMessage(message, tabId); 181 return; 182 183 case "pageAction": 184 handlePageActionMessage(message, tabId); 185 return; 186 187 default: 188 throw new Error(`Unsupported message type ${message.type}`); 189 } 190 }