Я строю расширение Chrome, которое использует местный хост обмена сообщениями для получения информации о DOM и передачи их в другое приложение. Во время моего тестирования мне удалось отправить сообщение в расширение Chrome, которое было ровно 266 байт в длину (270, учитывая 4 байта по длине). После некоторого исследования я обнаружил, что эта длина сообщения не единственная, что проблематична. Каждое кратное 256 (256, 512, 768, 1024, 1280, 1536, 1792, 2048, ... и особенно 2560), добавлены 10, иногда 20 и 30 , вызвал хромированное отопление от stdout хоста. Нативный хост продолжает отправлять данные и, в конечном счете, исключение « отправитель отправил неверное сообщение JSON; сообщение игнорируется. » появляется без контекста. После этого хром недействительный stdin нативного хоста, завершая его к концу. < /P>
Manifest < /p>
Я строю расширение Chrome, которое использует местный хост обмена сообщениями для получения информации о DOM и передачи их в другое приложение. Во время моего тестирования мне удалось отправить сообщение в расширение Chrome, которое было ровно 266 байт в длину (270, учитывая 4 байта по длине). После некоторого исследования я обнаружил, что эта длина сообщения не единственная, что проблематична. [b] Каждое кратное 256 (256, 512, 768, 1024, 1280, 1536, 1792, 2048, ... и особенно 2560), добавлены 10, иногда 20 и 30 [/b], вызвал хромированное отопление от stdout хоста. Нативный хост продолжает отправлять данные и, в конечном счете, исключение «[b] отправитель отправил неверное сообщение JSON; сообщение игнорируется. [/b]» появляется без контекста. После этого хром недействительный stdin нативного хоста, завершая его к концу. < /P> Manifest < /p> [code][...] "manifest_version": 3, "permissions": [ "storage", "tabs", "background", "notifications", "nativeMessaging", "scripting", "debugger" ], "host_permissions": [ "https://*/*", "http://*/*" ], "background": { "service_worker": "scripts/background.js" }, "content_scripts": [ { "matches": [ "http://*/*", "https://*/*" ], "js": [ "scripts/content.js" ] } ], [...] < /code> фоновый скрипт (образец) < /p> const nativeID = "com.nmhost"; var nmhostPort = chrome.runtime.connectNative(nativeID);
const onNativeMessage = function (msg) { // if (dbgFlag && dbgLvl == 3) { // console.log("Received: \n" + JSON.stringify(msg, null, 4)); // } let ss = JSON.stringify(msg); console.log(`Received:[${ss.length}]`); return; }
nmhostPort.onMessage.addListener(onNativeMessage); nmhostPort.onDisconnect.addListener(function () { console.error("NMHost Disconnected"); }); < /code> Native Host (C ++) (образец) < /p> /** * @brief Get the Message from Chromium. If the length of the message is zero or less it does not read the message! * * @param buff The message buffer to return * @return int32_t */ int32_t GetExtMessage(char *buff) { // if stdin fails retry 3 times for (int i = 0; i < STDIN_RETRY; i++) { int32_t reqLen = 0; std::cin.read(reinterpret_cast(&reqLen), 4); if (reqLen > 0) { std::cin.read(buff, reqLen); return reqLen; } else { if (std::cin.fail()) { std::cerr