diff options
Diffstat (limited to 'src/core/renderer')
-rw-r--r-- | src/core/renderer/user_resource_controller.cpp | 9 | ||||
-rw-r--r-- | src/core/renderer/web_channel_ipc_transport.cpp | 38 |
2 files changed, 30 insertions, 17 deletions
diff --git a/src/core/renderer/user_resource_controller.cpp b/src/core/renderer/user_resource_controller.cpp index ebc88c403..50a3924c6 100644 --- a/src/core/renderer/user_resource_controller.cpp +++ b/src/core/renderer/user_resource_controller.cpp @@ -69,6 +69,11 @@ static content::RenderView * const globalScriptsIndex = 0; // Scripts meant to run after the load event will be run 500ms after DOMContentLoaded if the load event doesn't come within that delay. static const int afterLoadTimeout = 500; +static int validUserScriptSchemes() +{ + return URLPattern::SCHEME_HTTP | URLPattern::SCHEME_HTTPS | URLPattern::SCHEME_FILE; +} + static bool regexMatchesURL(const std::string &pat, const GURL &url) { QRegularExpression qre(QtWebEngineCore::toQt(pat)); qre.setPatternOptions(QRegularExpression::CaseInsensitiveOption); @@ -97,8 +102,8 @@ static bool scriptMatchesURL(const UserScriptData &scriptData, const GURL &url) if (!scriptData.urlPatterns.empty()) { matchFound = false; for (auto it = scriptData.urlPatterns.begin(), end = scriptData.urlPatterns.end(); it != end; ++it) { - URLPattern urlPattern(QtWebEngineCore::UserScript::validUserScriptSchemes(), *it); - if (urlPattern.MatchesURL(url)) + URLPattern urlPattern(validUserScriptSchemes()); + if (urlPattern.Parse(*it) == URLPattern::PARSE_SUCCESS && urlPattern.MatchesURL(url)) matchFound = true; } if (!matchFound) diff --git a/src/core/renderer/web_channel_ipc_transport.cpp b/src/core/renderer/web_channel_ipc_transport.cpp index bb544168f..ef00bcef3 100644 --- a/src/core/renderer/web_channel_ipc_transport.cpp +++ b/src/core/renderer/web_channel_ipc_transport.cpp @@ -64,7 +64,7 @@ public: static void Uninstall(blink::WebLocalFrame *frame, uint worldId); private: WebChannelTransport() {} - bool NativeQtSendMessage(gin::Arguments *args); + void NativeQtSendMessage(gin::Arguments *args); // gin::WrappableBase gin::ObjectTemplateBuilder GetObjectTemplateBuilder(v8::Isolate *isolate) override; @@ -118,37 +118,45 @@ void WebChannelTransport::Uninstall(blink::WebLocalFrame *frame, uint worldId) qtObject->Delete(gin::StringToV8(isolate, "webChannelTransport")); } -bool WebChannelTransport::NativeQtSendMessage(gin::Arguments *args) +void WebChannelTransport::NativeQtSendMessage(gin::Arguments *args) { blink::WebLocalFrame *frame = blink::WebLocalFrame::FrameForCurrentContext(); if (!frame || !frame->View()) - return false; + return; content::RenderFrame *renderFrame = content::RenderFrame::FromWebFrame(frame); if (!renderFrame) - return false; + return; + + v8::Local<v8::Value> jsonValue; + if (!args->GetNext(&jsonValue)) { + args->ThrowTypeError("Missing argument"); + return; + } - std::string message; - if (!args->GetNext(&message)) - return false; + if (!jsonValue->IsString()) { + args->ThrowTypeError("Expected string"); + return; + } + v8::Local<v8::String> jsonString = v8::Local<v8::String>::Cast(jsonValue); + + QByteArray json(jsonString->Utf8Length(), 0); + jsonString->WriteUtf8(json.data(), json.size(), + nullptr, + v8::String::REPLACE_INVALID_UTF8); - QByteArray valueData(message.data(), message.size()); QJsonParseError error; - QJsonDocument doc = QJsonDocument::fromJson(valueData, &error); + QJsonDocument doc = QJsonDocument::fromJson(json, &error); if (error.error != QJsonParseError::NoError) { - LOG(WARNING) << "Parsing error: " << qPrintable(error.errorString()); - return false; + args->ThrowTypeError("Invalid JSON"); + return; } int size = 0; const char *rawData = doc.rawData(&size); - if (size == 0) - return false; - renderFrame->Send(new WebChannelIPCTransportHost_SendMessage( renderFrame->GetRoutingID(), std::vector<char>(rawData, rawData + size))); - return true; } gin::ObjectTemplateBuilder WebChannelTransport::GetObjectTemplateBuilder(v8::Isolate *isolate) |