gpt4 book ai didi

javascript - readStringReplaceMalformed()函数在22以下的Mozilla Firefox版本不起作用吗?

转载 作者:行者123 更新时间:2023-11-30 16:42:29 25 4
gpt4 key购买 nike

我是开发Mozilla-Firefox扩展的新手。我正在为Firefox创建附加的.xpi文件。到今天为止一切正常。但是,今天我安装了Firefox版本,即Firefox-15.1,并且附加组件开始引发以下异常:

enter image description here

在检查各种版本的Firefox时,我发现该插件在Firefox-22以下的版本上引发了相同的异常。

所以谁能告诉我为什么会这样。我是在代码中输入错误,还是Firefox存在任何兼容性问题?如果是兼容性问题,可以请您提供任何参考文档。

以下是导致错误的示例代码:

MyJS.js:



var path="D:\\DemoExportFunction.dll";
Components.utils.import("resource://gre/modules/ctypes.jsm");
var lib = ctypes.open(path);
var getStr = lib.declare("getString",ctypes.default_abi,ctypes.char.ptr);

function func_PageLoad(event)
{
try
{
alert("func_PageLoad");
var str=getStr();
str=str.readStringReplaceMalformed();
alert("String:"+str);

}
catch(err)
{
alert("Exception in func_PageLoad Message : "+err.message);
}
}

gBrowser.addEventListener("DOMContentLoaded", func_PageLoad, true);





.dll功能代码:

#include "stdafx.h"
extern "C"
{
__declspec( dllexport ) char * getString( );

}

char * getString( )
{
return "Hello . . . . This is message from dll";
}

最佳答案

您似乎假设CData在Firefox的整个生命周期中都是静态的。但是,它当然是随时间而发展的(就像整个Firefox或几乎任何大型软件项目一样)。 Firefox的较早版本中是否提供了特定功能,取决于该功能何时实现并包含在Firefox中。

关于文档,最终文档是Firefox source code。为了准确定位该功能首次在哪个版本的Firefox中使用,我希望必须查看源代码并查看它的添加时间。但是,您可以通过其他方式获得有关何时发生这种情况的一些提示。

它的文档已添加到CData page on MDN on Feb 19, 2013。自Aug 9, 2010以来未对该页面进行任何修订。显然,在2012年5月17日提交Bug 756120 - Complete implementation of CData readString时,这是一个问题。

MDN上的CData页甚至包括readStringReplaceMalformed()不可用时有效使用的polyfill。该代码是:

function readAsChar8ThenAsChar16(stringPtr, known_len, jschar) {
// when reading as jschar it assumes max length of 500

// stringPtr is either char or jschar, if you know its jschar for sure, pass 2nd arg as true
// if known_len is passed, then assumption is not made, at the known_len position in array we will see a null char
// i tried getting known_len from stringPtr but its not possible, it has be known, i tried this:
//"stringPtr.contents.toString()" "95"
//"stringPtr.toString()" "ctypes.unsigned_char.ptr(ctypes.UInt64("0x7f73d5c87650"))"
// so as we see neither of these is 77, this is for the example of "_scratchpad/EnTeHandle.js at master · Noitidart/_scratchpad - Mozilla Firefox"

// tries to do read string on stringPtr, if it fails then it falls to read as jschar

var readJSCharString = function() {
var assumption_max_len = known_len ? known_len : 500;
var ptrAsArr = ctypes.cast(stringPtr, ctypes.unsigned_char.array(assumption_max_len).ptr).contents; // MUST cast to unsigned char (not ctypes.jschar, or ctypes.char) as otherwise i dont get foreign characters, as they are got as negative values, and i should read till i find a 0 which is null terminator which will have unsigned_char code of 0 // can test this by reading a string like this: "_scratchpad/EnTeHandle.js at master · Noitidart/_scratchpad - Mozilla Firefox" at js array position 36 (so 37 if count from 1), we see 183, and at 77 we see char code of 0 IF casted to unsigned_char, if casted to char we see -73 at pos 36 but pos 77 still 0, if casted to jschar we see chineese characters in all spots expect spaces even null terminator is a chineese character
console.info('ptrAsArr.length:', ptrAsArr.length);
//console.log('debug-msg :: dataCasted:', dataCasted, uneval(dataCasted), dataCasted.toString());
var charCode = [];
var fromCharCode = []
for (var i=0; i<ptrAsArr.length; i++) { //if known_len is correct, then will not hit null terminator so like in example of "_scratchpad/EnTeHandle.js at master · Noitidart/_scratchpad - Mozilla Firefox" if you pass length of 77, then null term will not get hit by this loop as null term is at pos 77 and we go till `< known_len`
var thisUnsignedCharCode = ptrAsArr.addressOfElement(i).contents;
if (thisUnsignedCharCode == 0) {
// reached null terminator, break
console.log('reached null terminator, at pos: ', i);
break;
}
charCode.push(thisUnsignedCharCode);
fromCharCode.push(String.fromCharCode(thisUnsignedCharCode));
}
console.info('charCode:', charCode);
console.info('fromCharCode:', fromCharCode);
var char16_val = fromCharCode.join('');
console.info('char16_val:', char16_val);
return char16_val;
}

if (!jschar) {
try {
var char8_val = stringPtr.readString();
console.info('stringPtr.readString():', char8_val);
return char8_val;
} catch (ex if ex.message.indexOf('malformed UTF-8 character sequence at offset ') == 0) {
console.warn('ex of offset utf8 read error when trying to do readString so using alternative method, ex:', ex);
return readJSCharString();
}
} else {
return readJSCharString();
}
}


添加 readStringReplaceMalformed()函数的这种类型的更改对于开发此类接口是正常的。您应该意识到这是发生的事情,并且作为API的使用者,您应该了解对API的此类更改/增强及其对您的工作的影响。

较旧版本的Firefox和兼容性:

开发Firefox扩展时应执行的任务之一是 choose the oldest version of Firefox which you wish to support。您可以通过多种方法来执行此操作,但是您选择支持的最旧版本会限制您可以在加载项中使用的功能,或者要求您以两种或更多种不同的方式实现功能。例如,在Firefox 29上从Firefox UI插入/删除/更改项目的方式有了很大的变化。如果对Firefox UI进行了此类更改(甚至只是添加了一个按钮),则您需要不同版本的Firefox代码Firefox 29和Firefox 29及更高版本之前,您的代码必须根据版本(或功能的可用性)进行选择。具有如此基本且重大更改的版本通常是最旧版本支持附件的不错选择。

我最近在 answering another question是要使用 Element.closest()简化其代码的用户时遇到的API更改示例。但是,这样做的选择将限制该代码仅与Firefox 35.0或更高版本兼容。在选择与其他代码块(模块,API等)进行交互的代码时,您会多次遇到这种选择(使用新功能,而与旧版本兼容)。

通常,通常会基于多种因素来选择支持哪个旧版本的Firefox:


需要支持使用特定旧版本的客户。
所需功能的可用性(您的附加组件是否需要作为核心功能的某些功能,而在没有解决方法/ polyfill的旧版本中是不可用的)。
使用较旧版本的已安装基础的百分比
易于支持(即版本之间有多大的变化,要支持较旧的版本,您需要执行哪些附加编码)。
您是否已经兼容(即您的加载项在进行一些重大更改之前就已经存在,并且您必须编写代码以与新版本兼容(例如,在Firefox 29之前运行的任何Firefox加载项,并且添加了要兼容的代码)使用新的UI API))。
许多其他因素


假设您没有需要支持较旧版本或可以支持的最低版本的特定问题,则可能要基于 Extended Support Release (ESR)(例如 24.0esr, 31.0esr)版本做出此决定。

通常,您可能至少需要支持最新的ESR版本。

关于javascript - readStringReplaceMalformed()函数在22以下的Mozilla Firefox版本不起作用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31743141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com