From 6b1efab615041ed6d8eb4c82ff69db2e3ae857a6 Mon Sep 17 00:00:00 2001 From: dwindown Date: Sat, 6 Sep 2025 23:58:42 +0700 Subject: [PATCH] published version in webstore --- .gitignore | 1 + assets/icon-128.png | Bin 0 -> 10898 bytes assets/icon-16.png | Bin 0 -> 798 bytes assets/icon-32.png | Bin 0 -> 2113 bytes assets/icon-48.png | Bin 0 -> 3649 bytes background.js | 8 +- content.js | 23 +- manifest.json | 100 +++++--- panel.html | 6 +- panel.js | 597 +++++++++++++++++++++++++++++++++++++------- styles.css | 20 +- 11 files changed, 619 insertions(+), 136 deletions(-) create mode 100644 .gitignore create mode 100644 assets/icon-128.png create mode 100644 assets/icon-16.png create mode 100644 assets/icon-32.png create mode 100644 assets/icon-48.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..496ee2c --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Store \ No newline at end of file diff --git a/assets/icon-128.png b/assets/icon-128.png new file mode 100644 index 0000000000000000000000000000000000000000..8dc789d87d75b270117e0d7de7df29a02a6b93fc GIT binary patch literal 10898 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 literal 0 HcmV?d00001 diff --git a/assets/icon-16.png b/assets/icon-16.png new file mode 100644 index 0000000000000000000000000000000000000000..696e6a2bd6ea48535824a7ffc855f8d25272387c GIT binary patch literal 798 zcmV+(1L6FMP)n0hZks78`x1F8$-_wQJ93eed&-3u*dA`q|FZ_>b zfLRnP0xAS*{tK@8R@Jv!^X&o{w6?Ako!qoVN7iP5yGejR&A+~a2mqaU8C8|y3*;OJ9OK!KBuq!7fBdVt zL;9H>udZh-eh5j+NYaWYkTyd-ZjgyxW9E;Fc)EVaoh~ula?+6N)@UDCa!z!Ow%j@z z3gJ9t$}z1^rg(WJ=X%MVt983#_~R#D)92grwA63kIAm1WL)Jc08jRnOzSHm5FX;$b zpkpOeUUVo{TnYs*lBPMEuMEh`I@{iK^V6^qktFPu)~&kK^*C!iI;D~9yz-^9S5FkT zP~N>WamuSm8+DuIdmcUhp~!*h-ZyU^c9$%DwtnlcuO~iV)-M2sA?*>%QRCoAm>#$? zW!~dwxv+2shoT?#ca^3;aGKjzhcmaQ)M->tep0w9_-Z*QNq#^#+YI|{6U!w8jgkv- zYA+hWgXHm+Hru|u2#wj9QxeX+GCoqixbVvV6nS`1^N~$=3FalStS}i+g|q?I@Ka}D zZhvO-%)asQr(*&&yesJf%lp-}Lo?+eT~*qyn+kqd?eMj8(PIUHd60O8UUeQM?cP8g cP`N+%HxEER)_3`@eE6evx_cqxd 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 TK-)EP00000NkvXXu0mjf<5>W@ literal 0 HcmV?d00001 diff --git a/background.js b/background.js index 6c860f8..9b16f2f 100644 --- a/background.js +++ b/background.js @@ -1,6 +1,9 @@ // Let Chrome open the panel when the toolbar icon is clicked +// Guard: some Chromium variants may not expose sidePanel +const hasSidePanel = !!chrome.sidePanel?.setOptions; + chrome.runtime.onInstalled.addListener(() => { - chrome.sidePanel?.setPanelBehavior?.({ openPanelOnActionClick: true }); + if (hasSidePanel) chrome.sidePanel.setPanelBehavior?.({ openPanelOnActionClick: true }); }); // If you still want to ensure the correct path on click, setOptions ONLY: @@ -19,7 +22,8 @@ chrome.action.onClicked.addListener(async () => { try { await chrome.scripting.executeScript({ target: { tabId: tab.id }, files: ['content.js'] }); } catch {} } - await chrome.sidePanel.setOptions({ tabId: tab.id, path: "panel.html" }); // Chrome opens it + await chrome.sidePanel.setOptions({ tabId: tab.id, path: "panel.html" }); + try { await chrome.sidePanel.open({ tabId: tab.id }); } catch {} }); // Keyboard shortcut: we do open() here (this is a user gesture) diff --git a/content.js b/content.js index c42890b..c451314 100644 --- a/content.js +++ b/content.js @@ -6,6 +6,16 @@ if (window.__dewemoji_cs_installed) { window.__dewemoji_cs_installed = true; // (keep the rest of your file below as-is) + // Throttle to animation frame to avoid excessive work on rapid events + function rafThrottle(fn){ + let scheduled = false; + return function(...args){ + if (scheduled) return; + scheduled = true; + requestAnimationFrame(() => { scheduled = false; fn.apply(this,args); }); + }; + } + let lastEditable = null; // HTMLElement (input/textarea/contenteditable root) let lastRange = null; // Range for contenteditable let lastStart = 0, lastEnd = 0; @@ -59,10 +69,17 @@ if (window.__dewemoji_cs_installed) { captureCaret(); + // Use a non-throttled handler for focusin so we snapshot *before* focus leaves to the side panel. document.addEventListener('focusin', captureCaret, true); - document.addEventListener('keyup', captureCaret, true); - document.addEventListener('mouseup', captureCaret, true); - document.addEventListener('selectionchange', captureCaret, true); + + // Throttled handlers for noisy updates + const captureCaretThrottled = rafThrottle(captureCaret); + document.addEventListener('keyup', captureCaretThrottled, true); + document.addEventListener('mouseup', captureCaretThrottled, true); + document.addEventListener('selectionchange', captureCaretThrottled, true); + + // Extra safety: when the page is about to hide (e.g., side panel opens), keep the last known caret + document.addEventListener('visibilitychange', () => { if (document.visibilityState === 'hidden') captureCaret(); }, true); // Attempt to insert text at the last saved position function insertAtCaret(text) { diff --git a/manifest.json b/manifest.json index 6390921..9c6e1d1 100644 --- a/manifest.json +++ b/manifest.json @@ -1,41 +1,65 @@ { - "name": "Dewemoji - Emojis Made Effortless", - "description": "Search emojis and insert into any text field.", - "version": "1.0.0", - "manifest_version": 3, - - "permissions": ["storage", "scripting", "activeTab", "sidePanel", "identity", "identity.email"], - - "side_panel": { - "default_path": "panel.html" - }, + "name": "Dewemoji - Emojis Made Effortless", + "description": "Find and copy emojis instantly. Optional Pro license unlocks tone lock, insert mode, and more.", + "version": "1.0.0", + "offline_enabled": false, + "permissions": [ + "storage", + "scripting", + "activeTab", + "sidePanel" + ], + "host_permissions": [ + "", + "https://api.dewemoji.com/*" + ], + "web_accessible_resources": [ + { + "resources": [ + "assets/*.png", + "assets/*.svg", + "styles.css" + ], + "matches": [""] + } + ], + "homepage_url": "https://dewemoji.com", + "manifest_version": 3, - "host_permissions": [""], - - "action": { - "default_title": "Emoji Widget" - }, - - "background": { - "service_worker": "background.js" - }, - - "commands": { - "toggle-panel": { - "suggested_key": { - "default": "Ctrl+Shift+E", - "mac": "Command+Shift+E" - }, - "description": "Toggle Emoji Side Panel" - } - }, + "minimum_chrome_version": "114", - "content_scripts": [ - { - "matches": [""], - "js": ["content.js"], - "run_at": "document_idle", - "all_frames": false - } - ] - } \ No newline at end of file + "side_panel": { + "default_path": "panel.html" + }, + + "action": { + "default_title": "Dewemoji", + "default_icon": { + "16": "assets/icon-16.png", + "32": "assets/icon-32.png", + "48": "assets/icon-48.png", + "128": "assets/icon-128.png" + } + }, + + "icons": { + "16": "assets/icon-16.png", + "32": "assets/icon-32.png", + "48": "assets/icon-48.png", + "128": "assets/icon-128.png" + }, + + "background": { + "service_worker": "background.js" + }, + + "commands": { + "toggle-panel": { + "suggested_key": { + "default": "Ctrl+Shift+E", + "mac": "Command+Shift+E" + }, + "description": "Toggle Emoji Side Panel" + } + } +} \ No newline at end of file diff --git a/panel.html b/panel.html index b53fb81..7a8ecbf 100644 --- a/panel.html +++ b/panel.html @@ -11,7 +11,7 @@

Find Your Emoji Free

- + @@ -37,7 +37,7 @@ -