diff options
author | Jüri Valdmann <juri.valdmann@qt.io> | 2020-07-21 14:31:18 +0200 |
---|---|---|
committer | Jüri Valdmann <juri.valdmann@qt.io> | 2020-07-23 14:45:08 +0200 |
commit | 27332664b2745d7d322b8afbc1a41dc0fbfc763a (patch) | |
tree | f80b37c4a10b3e334ba9faea871249a664b67a4d /src/core/renderer | |
parent | 005a338f169b485077c248358e1cde96d22ae506 (diff) |
Switch from binary JSON to JSON for QWebChannel messages
Qt's binary JSON has been deprecated in favor of CBOR. However, since
we have to convert to/from JSON anyway in order to pass messages
to/from Chromium, there's not much point to use a binary intermediate
format in the first place. So, let's just use JSON.
Fixes: QTBUG-85688
Change-Id: I9c3e4608bee38d460eaf87843c339d5037ed9888
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'src/core/renderer')
-rw-r--r-- | src/core/renderer/web_channel_ipc_transport.cpp | 29 | ||||
-rw-r--r-- | src/core/renderer/web_channel_ipc_transport.h | 2 |
2 files changed, 10 insertions, 21 deletions
diff --git a/src/core/renderer/web_channel_ipc_transport.cpp b/src/core/renderer/web_channel_ipc_transport.cpp index 1fb3bc678..496417329 100644 --- a/src/core/renderer/web_channel_ipc_transport.cpp +++ b/src/core/renderer/web_channel_ipc_transport.cpp @@ -152,22 +152,13 @@ void WebChannelTransport::NativeQtSendMessage(gin::Arguments *args) return; } v8::Local<v8::String> jsonString = v8::Local<v8::String>::Cast(jsonValue); + std::vector<uint8_t> json(jsonString->Utf8Length(isolate), 0); + jsonString->WriteUtf8(isolate, reinterpret_cast<char *>(json.data()), json.size(), nullptr, + v8::String::REPLACE_INVALID_UTF8); - QByteArray json(jsonString->Utf8Length(isolate), 0); - jsonString->WriteUtf8(isolate, json.data(), json.size(), nullptr, v8::String::REPLACE_INVALID_UTF8); - - QJsonParseError error; - QJsonDocument doc = QJsonDocument::fromJson(json, &error); - if (error.error != QJsonParseError::NoError) { - args->ThrowTypeError("Invalid JSON"); - return; - } - - int size = 0; - const char *rawData = doc.rawData(&size); mojo::AssociatedRemote<qtwebchannel::mojom::WebChannelTransportHost> webChannelTransport; renderFrame->GetRemoteAssociatedInterfaces()->GetInterface(&webChannelTransport); - webChannelTransport->DispatchWebChannelMessage(std::vector<uint8_t>(rawData, rawData + size)); + webChannelTransport->DispatchWebChannelMessage(json); } gin::ObjectTemplateBuilder WebChannelTransport::GetObjectTemplateBuilder(v8::Isolate *isolate) @@ -213,18 +204,14 @@ void WebChannelIPCTransport::ResetWorldId() m_worldId = 0; } -void WebChannelIPCTransport::DispatchWebChannelMessage(const std::vector<uint8_t> &binaryJson, uint32_t worldId) +void WebChannelIPCTransport::DispatchWebChannelMessage(const std::vector<uint8_t> &json, + uint32_t worldId) { DCHECK(m_worldId == worldId); if (!m_canUseContext) return; - QJsonDocument doc = QJsonDocument::fromRawData(reinterpret_cast<const char *>(binaryJson.data()), binaryJson.size(), - QJsonDocument::BypassValidation); - DCHECK(doc.isObject()); - QByteArray json = doc.toJson(QJsonDocument::Compact); - blink::WebLocalFrame *frame = render_frame()->GetWebFrame(); v8::Isolate *isolate = blink::MainThreadIsolate(); v8::HandleScope handleScope(isolate); @@ -255,7 +242,9 @@ void WebChannelIPCTransport::DispatchWebChannelMessage(const std::vector<uint8_t v8::Local<v8::Object> messageObject(v8::Object::New(isolate)); v8::Maybe<bool> wasSet = messageObject->DefineOwnProperty( context, v8::String::NewFromUtf8(isolate, "data").ToLocalChecked(), - v8::String::NewFromUtf8(isolate, json.constData(), v8::NewStringType::kNormal, json.size()).ToLocalChecked(), + v8::String::NewFromUtf8(isolate, reinterpret_cast<const char *>(json.data()), + v8::NewStringType::kNormal, json.size()) + .ToLocalChecked(), v8::PropertyAttribute(v8::ReadOnly | v8::DontDelete)); DCHECK(!wasSet.IsNothing() && wasSet.FromJust()); diff --git a/src/core/renderer/web_channel_ipc_transport.h b/src/core/renderer/web_channel_ipc_transport.h index 15778a7bc..7c3b21eec 100644 --- a/src/core/renderer/web_channel_ipc_transport.h +++ b/src/core/renderer/web_channel_ipc_transport.h @@ -61,7 +61,7 @@ private: // qtwebchannel::mojom::WebChannelTransportRender void SetWorldId(uint32_t worldId) override; void ResetWorldId() override; - void DispatchWebChannelMessage(const std::vector<uint8_t> &binaryJson, uint32_t worldId) override; + void DispatchWebChannelMessage(const std::vector<uint8_t> &json, uint32_t worldId) override; // RenderFrameObserver void WillReleaseScriptContext(v8::Local<v8::Context> context, int worldId) override; |