const mainUrl = 'chrome-untrusted://eche-app/untrusted_index.html';
let urlParams = window.location.hash ?
new URLSearchParams(window.location.hash.substring(1)) :
new URLSearchParams(window.location.search.substring(1));
urlParams = urlParams.toString();
let iframeUrl = mainUrl;
if (urlParams) {
iframeUrl = mainUrl + '?' + urlParams;
}
document.getElementsByTagName('iframe')[0].src = iframeUrl;
const signalMessageExchanger =
ash.echeApp.mojom.SignalingMessageExchanger.getRemote();
const signalingMessageObserverRouter =
new ash.echeApp.mojom.SignalingMessageObserverCallbackRouter();
signalMessageExchanger.setSignalingMessageObserver(
signalingMessageObserverRouter.$.bindNewPipeAndPassRemote());
const systemInfo = ash.echeApp.mojom.SystemInfoProvider.getRemote();
const uidGenerator = ash.echeApp.mojom.UidGenerator.getRemote();
const systemInfoObserverRouter =
new ash.echeApp.mojom.SystemInfoObserverCallbackRouter();
systemInfo.setSystemInfoObserver(
systemInfoObserverRouter.$.bindNewPipeAndPassRemote());
const accessibility = ash.echeApp.mojom.AccessibilityProvider.getRemote();
const notificationGenerator =
ash.echeApp.mojom.NotificationGenerator.getRemote();
const displayStreamHandler = ash.echeApp.mojom.DisplayStreamHandler.getRemote();
const streamOrientationObserver =
ash.echeApp.mojom.StreamOrientationObserver.getRemote();
const connectionStatusObserver =
ash.echeApp.mojom.ConnectionStatusObserver.getRemote();
const streamActionObserverRouter =
new ash.echeApp.mojom.StreamActionObserverCallbackRouter();
displayStreamHandler.setStreamActionObserver(
streamActionObserverRouter.$.bindNewPipeAndPassRemote());
* A pipe through which we can send messages to the guest frame.
* Use an undefined `target` to find the <iframe> automatically.
* Do not rethrow errors, since handlers installed here are expected to
* throw exceptions that are handled on the other side of the pipe. And
* nothing `awaits` async callHandlerForMessageType_(), so they will always
* be reported as `unhandledrejection` and trigger a crash report.
*/
const guestMessagePipe = new MessagePipe(
'chrome-untrusted://eche-app',
undefined,
false);
guestMessagePipe.registerHandler(Message.SEND_SIGNAL, async (signal) => {
console.log('echeapi browser_proxy.js sendSignalingMessage');
signalMessageExchanger.sendSignalingMessage(signal);
});
guestMessagePipe.registerHandler(
Message.ACCESSIBILITY_EVENT_DATA, async (event_data) => {
console.log('echeapi browser_proxy.js handleAccessibilityEventReceived');
accessibility.handleAccessibilityEventReceived(event_data);
});
signalingMessageObserverRouter.onReceivedSignalingMessage.addListener(
(signal) => {
console.log('echeapi browser_proxy.js onReceivedSignalingMessage');
guestMessagePipe.sendMessage(Message.SEND_SIGNAL, {
signal,
});
});
guestMessagePipe.registerHandler(Message.TEAR_DOWN_SIGNAL, async () => {
console.log('echeapi browser_proxy.js tearDownSignaling');
signalMessageExchanger.tearDownSignaling();
});
guestMessagePipe.registerHandler(Message.CLOSE_WINDOW, async () => {
const info = (await systemInfo.getSystemInfo());
const systemInfoJson = JSON.parse(JSON.stringify(info));
console.log('echeapi browser_proxy.js window.close');
displayStreamHandler.onStreamStatusChanged(
ash.echeApp.mojom.StreamStatus.kStreamStatusStopped);
});
guestMessagePipe.registerHandler(Message.GET_SYSTEM_INFO, async () => {
console.log('echeapi browser_proxy.js getSystemInfo');
return (await systemInfo.getSystemInfo());
});
guestMessagePipe.registerHandler(Message.GET_UID, async () => {
console.log('echeapi browser_proxy.js getUid');
return (await uidGenerator.getUid());
});
systemInfoObserverRouter.onScreenBacklightStateChanged.addListener((state) => {
console.log('echeapi browser_proxy.js onScreenBacklightStateChanged');
guestMessagePipe.sendMessage(Message.SCREEN_BACKLIGHT_STATE, {
state,
});
});
systemInfoObserverRouter.onReceivedTabletModeChanged.addListener(
(isTabletMode) => {
console.log('echeapi browser_proxy.js onReceivedTabletModeChanged');
guestMessagePipe.sendMessage(Message.TABLET_MODE, {
isTabletMode,
});
});
systemInfoObserverRouter.onAndroidDeviceNetworkInfoChanged.addListener(
(isDifferentNetwork, androidDeviceOnCellular) => {
console.log('echeapi browser_proxy.js onAndroidDeviceNetworkInfoChanged');
guestMessagePipe.sendMessage(Message.ANDROID_NETWORK_INFO, {
isDifferentNetwork,
androidDeviceOnCellular,
});
});
streamActionObserverRouter.onStreamAction.addListener((action) => {
console.log(`echeapi browser_proxy.js OnStreamAction ${action}`);
guestMessagePipe.sendMessage(Message.STREAM_ACTION, {
action,
});
});
guestMessagePipe.registerHandler(Message.SHOW_NOTIFICATION, async (message) => {
const titleArray = {
data: Array.from(message.title, (c) => c.charCodeAt()),
};
const messageArray = {
data: Array.from(message.message, (c) => c.charCodeAt()),
};
console.log('echeapi browser_proxy.js showNotification');
notificationGenerator.showNotification(
titleArray, messageArray, message.notificationType);
});
guestMessagePipe.registerHandler(Message.SHOW_TOAST, async (message) => {
const textArray = {data: Array.from(message.text, (c) => c.charCodeAt())};
console.log('echeapi browser_proxy.js showToast');
notificationGenerator.showToast(textArray);
});
guestMessagePipe.registerHandler(
Message.TIME_HISTOGRAM_MESSAGE, async (message) => {
console.log('echeapi browser_proxy.js recordTime');
const histogramData = (message);
chrome.metricsPrivate.recordTime(
histogramData.histogram, histogramData.value);
});
guestMessagePipe.registerHandler(
Message.ENUM_HISTOGRAM_MESSAGE, async (message) => {
console.log('echeapi browser_proxy.js recordEnumerationValue');
const histogramData = (message);
chrome.metricsPrivate.recordEnumerationValue(
histogramData.histogram, histogramData.value, histogramData.maxValue);
});
guestMessagePipe.registerHandler(Message.START_STREAMING, async () => {
console.log('echeapi browser_proxy.js startStreaming');
displayStreamHandler.onStreamStatusChanged(
ash.echeApp.mojom.StreamStatus.kStreamStatusStarted);
});
guestMessagePipe.registerHandler(
Message.CHANGE_ORIENTATION, async (message) => {
console.log(
`echeapi browser_proxy.js ` +
`onStreamOrientationChanged ${message.isLandscape}`);
streamOrientationObserver.onStreamOrientationChanged(message.isLandscape);
});
guestMessagePipe.registerHandler(
Message.CONNECTION_STATUS_CHANGED, async (message) => {
console.log(
`echeapi browser_proxy.js ` +
`onConnectionStatusChanged ${message.connectionStatus}`);
connectionStatusObserver.onConnectionStatusChanged(
message.connectionStatus);
});
function locationHashChanged() {
const urlParams = window.location.hash ?
new URLSearchParams(window.location.hash.substring(1)) :
new URLSearchParams(window.location.search.substring(1));
const notificationId = urlParams.get('notification_id');
const packageName = urlParams.get('package_name');
const timestamp = urlParams.get('timestamp');
const userId = urlParams.get('user_id');
const notificationInfo = ({
notificationId,
packageName,
timestamp,
userId,
});
guestMessagePipe.sendMessage(Message.NOTIFICATION_INFO, notificationInfo);
}
window.onhashchange = locationHashChanged;
if ('virtualKeyboard' in navigator) {
navigator['virtualKeyboard'].overlaysContent = true;
navigator['virtualKeyboard'].addEventListener('geometrychange', (event) => {
const {x, y, width, height} = event.target['boundingRect'];
console.log('Virtual keyboard geometry:', x, y, width, height);
const isVirtualKeyboardEnabled = width > 0 && height > 0;
guestMessagePipe.sendMessage(Message.IS_VIRTUAL_KEYBOARD_ENABLED, {
isVirtualKeyboardEnabled,
});
});
} else {
console.log('virtual keyboard is not supported!');
}