【KaiOS】分析JSON解析异常问题和文件读取“fileReadLE“接口代码解读

7 篇文章 0 订阅

问题日志

通过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);
}

  • 19
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值