-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #31 from smapiot/issue/migration-to-manifest-3
Issue/migration to manifest 3
- Loading branch information
Showing
12 changed files
with
1,450 additions
and
1,679 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,50 +1,54 @@ | ||
import { browser } from 'webextension-polyfill-ts'; | ||
import { handleLegacyMessage } from './scripts/legacy-worker'; | ||
import type { PiralDebugApiMessage, PiralInspectorMessage } from './types'; | ||
import { runtime } from 'webextension-polyfill'; | ||
import { PiralDebugApiMessage, PiralInspectorMessage } from './types'; | ||
|
||
/** | ||
* window is marked as @deprecated in v3 but is still the official way to access external applications | ||
* https://developer.chrome.com/docs/extensions/develop/concepts/content-scripts?hl=en#host-page-communication | ||
*/ | ||
const handleMessage = (message: PiralDebugApiMessage) => { | ||
if (typeof message === 'object' && message?.source === 'piral-debug-api') { | ||
const { content } = message; | ||
runtime.sendMessage(content); | ||
|
||
if (content.type === 'available') { | ||
console.info(`Piral Inspector (${content.kind}) connected!`); | ||
} | ||
} | ||
}; | ||
/** | ||
* Disconnects the Piral Inspector. | ||
*/ | ||
window.addEventListener('unload', () => { | ||
browser.runtime.sendMessage({ | ||
runtime.sendMessage({ | ||
type: 'unavailable', | ||
}); | ||
}); | ||
|
||
/** | ||
* Receives messages from the piral-debug-utils.js | ||
* Receives messages from the piral-debug-utils.js and forwards it to service worker | ||
*/ | ||
window.addEventListener('message', event => { | ||
window.addEventListener('message', (event) => { | ||
if (event.source === window) { | ||
const message: PiralDebugApiMessage = event.data; | ||
|
||
if (typeof message === 'object' && message?.source === 'piral-debug-api') { | ||
const { content } = message; | ||
browser.runtime.sendMessage(content); | ||
|
||
if (content.type === 'available') { | ||
console.info(`Piral Inspector (${content.kind}) connected!`); | ||
} | ||
} | ||
handleMessage(message); | ||
} | ||
}); | ||
|
||
/** | ||
* Receives messages from the background.js | ||
* Receives messages from the service worker.js | ||
*/ | ||
browser.runtime.onMessage.addListener(content => { | ||
runtime.onMessage.addListener((content, sender) => { | ||
const message: PiralInspectorMessage = { | ||
content, | ||
source: 'piral-inspector', | ||
version: 'v1', | ||
}; | ||
window.postMessage(message, '*'); | ||
handleLegacyMessage(content); | ||
}); | ||
|
||
/** | ||
* Tries to connect the instance to the dev tools. | ||
*/ | ||
browser.runtime.sendMessage({ | ||
runtime.sendMessage({ | ||
type: 'cs-connect', | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,59 +1,77 @@ | ||
import { browser } from 'webextension-polyfill-ts'; | ||
import { runtime, devtools } from 'webextension-polyfill'; | ||
import { useStore } from './app/store'; | ||
import type { PiWorkerMessage, PiHostMessage } from './types'; | ||
import { PiHostMessage, PiWorkerMessage } from './types'; | ||
import { DevtoolsPanels } from 'webextension-polyfill/namespaces/devtools_panels'; | ||
|
||
function initPanel() { | ||
return browser.devtools.panels.create('Piral', '/assets/logo.png', './panel.html'); | ||
} | ||
type PanelCreate = ( | ||
title: string, | ||
iconPath: string, | ||
pagePath: string, | ||
panelCreatedCallback: | ||
(panel: DevtoolsPanels.ExtensionPanel) => void | ||
) => void | ||
|
||
function connectPanel(panel: any) { | ||
const port = browser.runtime.connect(undefined, { name: 'piral-inspector-host' }); | ||
|
||
async function initDevTools() { | ||
try { | ||
const port = runtime.connect(undefined, { name: 'piral-inspector-host' }); | ||
|
||
const sendMessage = (message: PiHostMessage) => { | ||
const tabId = browser.devtools.inspectedWindow.tabId; | ||
port.postMessage({ | ||
message, | ||
tabId, | ||
}); | ||
}; | ||
|
||
panel.onShown.addListener((panelWindow: Window) => { | ||
panelWindow.sendCommand = sendMessage; | ||
panelWindow.dispatchEvent(new CustomEvent('pi-store', { detail: useStore })); | ||
}); | ||
|
||
port.onMessage.addListener((message: PiWorkerMessage) => { | ||
const { actions } = useStore.getState(); | ||
|
||
switch (message.type) { | ||
case 'available': | ||
return actions.connect(message.name, message.version, message.kind, message.capabilities, message.state); | ||
case 'unavailable': | ||
return actions.disconnect(); | ||
case 'pilets': | ||
return actions.updatePilets(message.pilets); | ||
case 'routes': | ||
return actions.updateRoutes(message.routes); | ||
case 'settings': | ||
return actions.updateSettings(message.settings); | ||
case 'container': | ||
return actions.updateContainer(message.container); | ||
case 'events': | ||
return actions.updateEvents(message.events); | ||
case 'extensions': | ||
return actions.updateExtensions(message.extensions); | ||
case 'info': | ||
return actions.updateInfo(message.name, message.version, message.kind, message.capabilities); | ||
case 'dependency-map': | ||
return actions.updateDependencyMap(message.dependencyMap); | ||
} | ||
}); | ||
|
||
sendMessage({ type: 'init' }); | ||
} | ||
const sendMessage = (message: PiHostMessage) => { | ||
const tabId = devtools.inspectedWindow.tabId; | ||
port.postMessage({ | ||
message, | ||
tabId, | ||
}); | ||
}; | ||
|
||
/** | ||
* Cast needed because webextension polyfill does not support the right interfacing for v3 | ||
* official documentation: https://developer.chrome.com/docs/extensions/reference/api/devtools/panels?hl=en#example | ||
*/ | ||
const panelCreate = devtools.panels.create as unknown as PanelCreate | ||
|
||
/** | ||
* Call is asynchronus but doesnt provide promise anymore, needs to be done with callback | ||
*/ | ||
panelCreate('Piral', '/assets/logo.png', './panel.html', (panel: DevtoolsPanels.ExtensionPanel) => { | ||
panel.onShown.addListener((panelWindow: Window) => { | ||
|
||
function logError(err: Error) { | ||
console.error('An unexpected error occured while setting up the panels.', err); | ||
panelWindow.sendCommand = sendMessage; | ||
panelWindow.dispatchEvent(new CustomEvent('pi-store', { detail: useStore })); | ||
}); | ||
|
||
port.onMessage.addListener((message: PiWorkerMessage) => { | ||
const { actions } = useStore.getState(); | ||
|
||
switch (message.type) { | ||
case 'available': | ||
return actions.connect(message.name, message.version, message.kind, message.capabilities, message.state); | ||
case 'unavailable': | ||
return actions.disconnect(); | ||
case 'pilets': | ||
return actions.updatePilets(message.pilets); | ||
case 'routes': | ||
return actions.updateRoutes(message.routes); | ||
case 'settings': | ||
return actions.updateSettings(message.settings); | ||
case 'container': | ||
return actions.updateContainer(message.container); | ||
case 'events': | ||
return actions.updateEvents(message.events); | ||
case 'extensions': | ||
return actions.updateExtensions(message.extensions); | ||
case 'info': | ||
return actions.updateInfo(message.name, message.version, message.kind, message.capabilities); | ||
case 'dependency-map': | ||
return actions.updateDependencyMap(message.dependencyMap); | ||
} | ||
}); | ||
|
||
sendMessage({ type: 'init' }); | ||
}); | ||
} catch (err) { | ||
console.error(err.message); | ||
} | ||
} | ||
|
||
initPanel().then(connectPanel).catch(logError); | ||
initDevTools(); |
Oops, something went wrong.