cache icon imageData because the browser doesn't
This commit is contained in:
		
							parent
							
								
									3f570c4d3a
								
							
						
					
					
						commit
						a572620765
					
				|  | @ -333,30 +333,31 @@ function updateIcon({tab, styles}) { | |||
|     const color = prefs.get(disableAll ? 'badgeDisabled' : 'badgeNormal'); | ||||
|     const text = prefs.get('show-badge') && numStyles ? String(numStyles) : ''; | ||||
|     const iconset = ['', 'light/'][prefs.get('iconset')] || ''; | ||||
|     const path = 'images/icon/' + iconset; | ||||
|     const tabIcon = tabIcons.get(tab.id) || {}; | ||||
| 
 | ||||
|     let tabIcon = tabIcons.get(tab.id); | ||||
|     if (!tabIcon) tabIcons.set(tab.id, (tabIcon = {})); | ||||
| 
 | ||||
|     if (tabIcon.iconType !== iconset + postfix) { | ||||
|       tabIcons.set(tab.id, tabIcon); | ||||
|       tabIcon.iconType = iconset + postfix; | ||||
|       const paths = {}; | ||||
|       if (FIREFOX || CHROME >= 2883 && !VIVALDI) { | ||||
|         // Material Design 2016 new size is 16px
 | ||||
|         paths['16'] = `${path}16${postfix}.png`; | ||||
|         paths['32'] = `${path}32${postfix}.png`; | ||||
|       } else { | ||||
|         // Chromium forks or non-chromium browsers may still use the traditional 19px
 | ||||
|         paths['19'] = `${path}19${postfix}.png`; | ||||
|         paths['38'] = `${path}38${postfix}.png`; | ||||
|       } | ||||
|       chrome.browserAction.setIcon({tabId: tab.id, path: paths}, ignoreChromeError); | ||||
|       const sizes = FIREFOX || CHROME >= 2883 && !VIVALDI ? [16, 32] : [19, 38]; | ||||
|       Promise.all(sizes.map(size => { | ||||
|         const src = `/images/icon/${iconset}${size}${postfix}.png`; | ||||
|         return tabIcons.get(src) || loadIcon(src); | ||||
|       })).then(data => { | ||||
|         const imageData = {}; | ||||
|         sizes.forEach((size, i) => (imageData[size] = data[i])); | ||||
|         chrome.browserAction.setIcon({tabId: tab.id, imageData}, ignoreChromeError); | ||||
|       }); | ||||
|     } | ||||
|     if (tab.id === undefined) return; | ||||
| 
 | ||||
|     let defaultIcon = tabIcons.get(undefined); | ||||
|     if (!defaultIcon) tabIcons.set(undefined, (defaultIcon = {})); | ||||
|     if (defaultIcon.color !== color) { | ||||
|       defaultIcon.color = color; | ||||
|       chrome.browserAction.setBadgeBackgroundColor({color}); | ||||
|     } | ||||
| 
 | ||||
|     if (tabIcon.text !== text) { | ||||
|       tabIcon.text = text; | ||||
|       setTimeout(() => { | ||||
|  | @ -369,6 +370,23 @@ function updateIcon({tab, styles}) { | |||
|       }); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   function loadIcon(src, resolve) { | ||||
|     if (!resolve) return new Promise(resolve => loadIcon(src, resolve)); | ||||
|     const canvas = document.createElement('canvas'); | ||||
|     const ctx = canvas.getContext('2d'); | ||||
|     const img = new Image(); | ||||
|     img.src = src; | ||||
|     img.onload = () => { | ||||
|       const w = canvas.width = img.width; | ||||
|       const h = canvas.height = img.height; | ||||
|       ctx.clearRect(0, 0, w, h); | ||||
|       ctx.drawImage(img, 0, 0, w, h); | ||||
|       const data = ctx.getImageData(0, 0, w, h); | ||||
|       tabIcons.set(src, data); | ||||
|       resolve(data); | ||||
|     }; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user