Skip to content

Commit db8015b

Browse files
authored
Add Android messaging integration (#450)
1 parent ef991c7 commit db8015b

File tree

1 file changed

+55
-3
lines changed

1 file changed

+55
-3
lines changed

inject/android.js

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,18 @@
22
* @module Android integration
33
* @category Content Scope Scripts Integrations
44
*/
5-
import { load, init } from '../src/content-scope-features.js'
5+
import { load, init, update } from '../src/content-scope-features.js'
66
import { processConfig, isGloballyDisabled } from './../src/utils'
77

8+
const allowedMessages = [
9+
'getClickToLoadState',
10+
'getYouTubeVideoDetails',
11+
'openShareFeedbackPage',
12+
'setYoutubePreviewsEnabled',
13+
'unblockClickToLoadContent',
14+
'updateYouTubeCTLAddedFlag'
15+
]
16+
817
function initCode () {
918
// @ts-expect-error https://app.asana.com/0/1201614831475344/1203979574128023/f
1019
const processedConfig = processConfig($CONTENT_SCOPE$, $USER_UNPROTECTED_DOMAINS$, $USER_PREFERENCES$)
@@ -16,10 +25,53 @@ function initCode () {
1625
platform: processedConfig.platform
1726
})
1827

28+
const messageSecret = processedConfig.messageSecret
29+
// Receives messages from the platform
30+
const messageCallback = processedConfig.messageCallback
31+
// Sends messages to the platform
32+
const messageInterface = processedConfig.messageInterface
33+
34+
const wrappedUpdate = ((providedSecret, ...args) => {
35+
if (providedSecret === messageSecret) {
36+
update(...args)
37+
}
38+
// eslint-disable-next-line no-extra-bind
39+
}).bind(this)
40+
41+
Object.defineProperty(window, messageCallback, {
42+
value: wrappedUpdate
43+
})
44+
45+
let sendMessageToAndroid
46+
if (Object.prototype.hasOwnProperty.call(window, messageInterface)) {
47+
// @ts-expect-error - Defined on the platform using WebView.addJavascriptInterface()
48+
sendMessageToAndroid = window[messageInterface].process.bind(window[messageInterface])
49+
delete window[messageInterface]
50+
} else {
51+
sendMessageToAndroid = () => { console.error('Android messaging interface not available') }
52+
}
53+
1954
init(processedConfig)
2055

21-
// Not supported:
22-
// update(message)
56+
window.addEventListener('sendMessageProxy' + messageSecret, event => {
57+
event.stopImmediatePropagation()
58+
59+
if (!(event instanceof CustomEvent) || !event?.detail) {
60+
return console.warn('no details in sendMessage proxy', event)
61+
}
62+
63+
const messageType = event.detail?.messageType
64+
if (!allowedMessages.includes(messageType)) {
65+
return console.warn('Ignoring invalid sendMessage messageType', messageType)
66+
}
67+
68+
const message = {
69+
type: messageType,
70+
options: event.detail?.options
71+
}
72+
const stringifiedArgs = JSON.stringify(message)
73+
sendMessageToAndroid(stringifiedArgs, messageSecret)
74+
})
2375
}
2476

2577
initCode()

0 commit comments

Comments
 (0)