问题日志
通过navigator.b2g.engmodeManager.fileReadLE接口读取指定文件时(如下代码),报错“JavaScript Error: "SyntaxError: JSON.parse: unterminated string literal”
navigator.b2g.engmodeManager.fileReadLE('data_json').then((dataInitial) => {
if (dataInitial) {
dataByType = JSON.parse(dataInitial);
}
}
报错日志:
06-18 14:20:43.215 696 696 E GeckoConsole: [JavaScript Error: "SyntaxError: JSON.parse: unterminated string literal at line 1 column 8193 of the JSON data" {file: "chrome://system/content/js/xxxxx.js" line: 640}]
原因分析
从报错看,直接原因是解析JSON的时候没有正确的结束符,也就是获取到的JSON字符串格式不完整。
实际上,根因就是KaiOS上fileReadLE接口读取文件数据的时候,返回数据异常,导致格式不正确,无法解析JSON。
具体看下面的KaiOS代码实现。
代码解读
在 KaiOS 的 engmode 模块中,提供文件处理 fileReadLE 的接口给各个模块调用。
fileReadLE 接口
webidl 定义接口,jsm中具体实现接口内部逻辑,最终是消息异步处理,完成数据读取。
EngmodeManager.webidl 接口定义
/gecko/koost/webidl/EngmodeManager.webidl
/**
* To hook the key event to the current window instead of GAIA system
* The client should reset onkeyevent to null to restore the key event
* being processed by GAIA system(from GAIA system)
*/
Promise<any> fileReadLE(DOMString file);
EngmodeManager.jsm 功能逻辑
/gecko/koost/engmode/EngmodeManager.jsm
fileReadLE(file) {
return this.createPromiseWithId(aResolverId => {
if (Object.keys(this.allowedFileReadList)
.includes(file)) {
//异步消息"Engmode:FileRead"
Services.cpmm.sendAsyncMessage("Engmode:FileRead", {
path: this.allowedFileReadList[file],
requestID: aResolverId,
});
} else {
let data = "error parameter";
this.takePromiseResolver(aResolverId)
.reject(data);
}
});
},
根据以上代码段内容,并没有指定读取字符的数量限制。限制的可能性更多地取决于其他部分的处理逻辑。
如上fileReadLE用于异步读取文件的功能。在代码中,并没有明确指定读取字符的数量限制。这个函数似乎是一个封装了异步操作的函数,它会发送一个“Engmode:FileRead”的异步消息来读取文件。
实际的读取字符数量限制可能不在这个函数内部,而是取决于函数发送的“Engmode:FileRead”异步消息的处理过程。这可能是由Services.cpmm.sendAsyncMessage引发的另一个过程,或者是处理该消息的其他代码或者服务。
检查"Engmode:FileRead"消息的处理部分,或许了解限制字符数量的具体规则。
使用方法
如下call duration功能:
//gaia/apps/settings/js/panels/call_duration/panel.js
navigator.b2g.engmodeManager.fileReadLE('call_duration').then((callInfo) => {
dump('call-duration: callInfo is: ' + callInfo);
}
文章评论