diff --git a/interfaces/kits/napi/js/webview_export.js b/interfaces/kits/napi/js/webview_export.js index 4185ecb727c306292636762f679cf071d1a4aa0a..ed4da91c21200eb8236e3aa47852e7ec825ce1cb 100644 --- a/interfaces/kits/napi/js/webview_export.js +++ b/interfaces/kits/napi/js/webview_export.js @@ -441,29 +441,54 @@ function selectPicture(param, selectResult) { } } -function getManifestData(bundleName, callback) { - - dataShare.createDataProxyHandle().then((dsProxyHelper) => { - const urisToGet = - [`datashareproxy://${bundleName}/browserNativeMessagingHosts`]; +async function getManifestData(bundleName, connectExtensionOrigin, notifyCallback, callback) { + try { + const dsProxyHelper = await dataShare.createDataProxyHandle(); + const urisToGet = [`datashareproxy://${bundleName}/browserNativeMessagingHosts`]; const config = { type: dataShare.DataProxyType.SHARED_CONFIG, }; - dsProxyHelper.get(urisToGet, config).then((results) => { - results.forEach((result) => { - callback(result.value); - }); - }).catch((error) => { + const results = await dsProxyHelper.get(urisToGet, config); + let foundValid = false; + for (let i = 0; i < results.length; i++) { + try { + const result = results[i]; + const json = result.value; + let info = JSON.parse(json); + let pathObject = {}; + const infoPath = info.path; + if (typeof infoPath === 'string') { + pathObject = JSON.parse(infoPath); + } + info.path = pathObject; + if (info.name && info.description && info.path && + info.type && info.allowed_origins && info.path.bundleName && info.path.abilityName) { + console.info('Native message json info is ok'); + if (!Array.isArray(info.allowed_origins)) { + info.allowed_origins = [info.allowed_origins]; + } + if (!info.allowed_origins.includes(connectExtensionOrigin)) { + console.error('Origin not allowed, continue searching'); + continue; + } + foundValid = true; + callback(info); + break; + } + } catch (error) { + console.error('NativeMessage JSON parse error:', error); + } + } + if (!foundValid) { + console.error('NativeMessage JSON no valid manifest found'); callback(undefined); - console.error('getManifestData, error getting config:', JSON.stringify(error)); - }); - }).catch((error) => { - callback(undefined); - console.error('getManifestData, error creating DataProxyHandle:', JSON.stringify(error)); - }); + } + } catch (error) { + callback(undefined); + console.error('Error getting config:', error); + } } - Object.defineProperty(webview.WebviewController.prototype, 'getCertificate', { value: function (callback) { if (arguments.length !== 0 && arguments.length !== 1) { @@ -581,36 +606,29 @@ Object.defineProperty(webview.WebviewController.prototype, 'openAppLink', { Object.defineProperty(webview.WebviewController.prototype, 'innerWebNativeMessageManager', { value: function (callback) { - console.info('Web deal native messaging '); + console.info('innerWebNativeMessageManager called'); try { - getManifestData(callback.bundleName, (result) => { + let bundleName = callback.bundleName; + let readPipe = callback.readPipe; + let writePipe = callback.writePipe; + let connectExtensionOrigin = callback.extensionOrigin; + getManifestData(bundleName, connectExtensionOrigin, callback.result, (result) => { + try { if (!result) { + console.error(`NativeMessage fnd DateShare is no ${bundleName} config`); callback.result.onFailed(4001); return; } - const infoByJson = JSON.parse(result); - if (!infoByJson || !infoByJson.allowed_origins) { - callback.result.onFailed(infoByJson ? 4002 : 4101); - return; - } - if (!infoByJson.allowed_origins.includes(callback.extensionOrigin)) { - callback.result.onFailed(4003); - return; - } - const pathByJson = JSON.parse(infoByJson.path); - if (!pathByJson) { - callback.result.onFailed(4102); - return; - } let wantInfo = { - bundleName: pathByJson.bundleName, - abilityName: pathByJson.abilityName, + bundleName: result.path.bundleName, + abilityName: result.path.abilityName, parameters: { - 'ohos.arkweb.messageReadPipe': { 'type': 'FD', 'value': callback.readPipe }, - 'ohos.arkweb.messageWritePipe': { 'type': 'FD', 'value': callback.writePipe }, - 'ohos.arkweb.extensionOrigin': callback.extensionOrigin + 'ohos.arkweb.messageReadPipe': { 'type': 'FD', 'value': readPipe }, + 'ohos.arkweb.messageWritePipe': { 'type': 'FD', 'value': writePipe }, + 'ohos.arkweb.extensionOrigin': connectExtensionOrigin }, }; + console.debug(`innerWebNativeMessageManager want ${JSON.stringify(wantInfo)}`); let options = { onConnect(connection) { callback.result.onConnect(connection.connectionId); @@ -619,14 +637,18 @@ Object.defineProperty(webview.WebviewController.prototype, 'innerWebNativeMessag callback.result.onDisconnect(connection.connectionId); }, onFailed(code) { - console.error(`messaging onFailed callback, code: ${code}`); callback.result.onFailed(code); } }; - webNativeMessagingExtensionManager.connectNative(getContext(this), wantInfo, options); + let abilityContext = getContext(this); + let connectId = webNativeMessagingExtensionManager.connectNative(abilityContext, wantInfo, options); + console.log(`innerWebNativeMessageManager connectionId : ${connectId}` ); + } catch (error) { + console.log(`inner callback error Message: ${JSON.stringify(err)}`); + } }); } catch (err) { - console.log(`messaging error : ${JSON.stringify(err)}`); + console.log(`innerWebNativeMessageManager Message: ${JSON.stringify(err)}`); } } }); @@ -634,7 +656,7 @@ Object.defineProperty(webview.WebviewController.prototype, 'innerWebNativeMessag Object.defineProperty(webview.WebviewController.prototype, 'innerNativeMessageDisconnect', { value: function (callback) { let connectId = callback.connectId; - console.log(`Messaging disconnect connectId= ${connectId}`); + console.log(`NativeMessageDisconnect start connectionId is ${connectId}`); webNativeMessagingExtensionManager.disconnectNative(connectId); } });