Diff
Modified: trunk/Source/WebKit/ChangeLog (277425 => 277426)
--- trunk/Source/WebKit/ChangeLog 2021-05-13 06:45:07 UTC (rev 277425)
+++ trunk/Source/WebKit/ChangeLog 2021-05-13 08:00:14 UTC (rev 277426)
@@ -1,3 +1,27 @@
+2021-05-13 Carlos Garcia Campos <[email protected]>
+
+ [GTK][WPE] Add ArgumentCoder for GTlsCertificate
+ https://bugs.webkit.org/show_bug.cgi?id=225509
+
+ Reviewed by Adrian Perez de Castro.
+
+ Move the GTlsCertificate serialization from CertificateInfo ArgumentCoder to its own.
+
+ * Shared/glib/ArgumentCodersGLib.cpp:
+ (IPC::ArgumentCoder<GRefPtr<GVariant>>::encode):
+ (IPC::ArgumentCoder<GRefPtr<GVariant>>::decode):
+ (IPC::ArgumentCoder<GRefPtr<GTlsCertificate>>::encode):
+ (IPC::ArgumentCoder<GRefPtr<GTlsCertificate>>::decode):
+ (IPC::encode): Deleted.
+ (IPC::decode): Deleted.
+ * Shared/glib/ArgumentCodersGLib.h:
+ * Shared/glib/UserMessage.cpp:
+ (WebKit::UserMessage::encode const):
+ (WebKit::UserMessage::decode):
+ * Shared/soup/WebCoreArgumentCodersSoup.cpp:
+ (IPC::ArgumentCoder<CertificateInfo>::encode):
+ (IPC::ArgumentCoder<CertificateInfo>::decode):
+
2021-05-12 Chris Dumez <[email protected]>
Notification.requestPermission() should return a Promise
Modified: trunk/Source/WebKit/Shared/glib/ArgumentCodersGLib.cpp (277425 => 277426)
--- trunk/Source/WebKit/Shared/glib/ArgumentCodersGLib.cpp 2021-05-13 06:45:07 UTC (rev 277425)
+++ trunk/Source/WebKit/Shared/glib/ArgumentCodersGLib.cpp 2021-05-13 08:00:14 UTC (rev 277426)
@@ -27,13 +27,13 @@
#include "ArgumentCodersGLib.h"
#include "DataReference.h"
-#include <glib.h>
+#include <gio/gio.h>
#include <wtf/glib/GUniquePtr.h>
#include <wtf/text/CString.h>
namespace IPC {
-void encode(Encoder& encoder, GVariant* variant)
+void ArgumentCoder<GRefPtr<GVariant>>::encode(Encoder& encoder, GRefPtr<GVariant> variant)
{
if (!variant) {
encoder << CString();
@@ -40,11 +40,11 @@
return;
}
- encoder << CString(g_variant_get_type_string(variant));
- encoder << DataReference(static_cast<const uint8_t*>(g_variant_get_data(variant)), g_variant_get_size(variant));
+ encoder << CString(g_variant_get_type_string(variant.get()));
+ encoder << DataReference(static_cast<const uint8_t*>(g_variant_get_data(variant.get())), g_variant_get_size(variant.get()));
}
-Optional<GRefPtr<GVariant>> decode(Decoder& decoder)
+Optional<GRefPtr<GVariant>> ArgumentCoder<GRefPtr<GVariant>>::decode(Decoder& decoder)
{
CString variantTypeString;
if (!decoder.decode(variantTypeString))
@@ -65,4 +65,66 @@
return Optional<GRefPtr<GVariant> >(g_variant_new_from_bytes(variantType.get(), bytes.get(), FALSE));
}
+void ArgumentCoder<GRefPtr<GTlsCertificate>>::encode(Encoder& encoder, GRefPtr<GTlsCertificate> certificate)
+{
+ if (!certificate) {
+ encoder << 0;
+ return;
+ }
+
+ Vector<GRefPtr<GByteArray>> certificatesDataList;
+ for (auto* nextCertificate = certificate.get(); nextCertificate; nextCertificate = g_tls_certificate_get_issuer(nextCertificate)) {
+ GRefPtr<GByteArray> certificateData;
+ g_object_get(nextCertificate, "certificate", &certificateData.outPtr(), nullptr);
+
+ if (!certificateData) {
+ certificatesDataList.clear();
+ break;
+ }
+
+ certificatesDataList.append(WTFMove(certificateData));
+ }
+
+ encoder << static_cast<uint32_t>(certificatesDataList.size());
+ if (certificatesDataList.isEmpty())
+ return;
+
+ // Encode starting from the root certificate.
+ while (!certificatesDataList.isEmpty()) {
+ auto certificateData = certificatesDataList.takeLast();
+ encoder << IPC::DataReference(certificateData->data, certificateData->len);
+ }
+}
+
+Optional<GRefPtr<GTlsCertificate>> ArgumentCoder<GRefPtr<GTlsCertificate>>::decode(Decoder& decoder)
+{
+ uint32_t chainLength;
+ if (!decoder.decode(chainLength))
+ return WTF::nullopt;
+
+ if (!chainLength)
+ return GRefPtr<GTlsCertificate>();
+
+ GType certificateType = g_tls_backend_get_certificate_type(g_tls_backend_get_default());
+ GRefPtr<GTlsCertificate> certificate;
+ GTlsCertificate* issuer = nullptr;
+ for (uint32_t i = 0; i < chainLength; i++) {
+ IPC::DataReference certificateDataReference;
+ if (!decoder.decode(certificateDataReference))
+ return WTF::nullopt;
+
+ GRefPtr<GByteArray> certificateData = adoptGRef(g_byte_array_sized_new(certificateDataReference.size()));
+ g_byte_array_append(certificateData.get(), certificateDataReference.data(), certificateDataReference.size());
+
+ certificate = adoptGRef(G_TLS_CERTIFICATE(g_initable_new(
+ certificateType, nullptr, nullptr,
+ "certificate", certificateData.get(),
+ "issuer", issuer,
+ nullptr)));
+ issuer = certificate.get();
+ }
+
+ return certificate;
+}
+
} // namespace IPC
Modified: trunk/Source/WebKit/Shared/glib/ArgumentCodersGLib.h (277425 => 277426)
--- trunk/Source/WebKit/Shared/glib/ArgumentCodersGLib.h 2021-05-13 06:45:07 UTC (rev 277425)
+++ trunk/Source/WebKit/Shared/glib/ArgumentCodersGLib.h 2021-05-13 08:00:14 UTC (rev 277426)
@@ -29,10 +29,18 @@
#include <wtf/glib/GRefPtr.h>
typedef struct _GVariant GVariant;
+typedef struct _GTlsCertificate GTlsCertificate;
namespace IPC {
-void encode(Encoder&, GVariant*);
-Optional<GRefPtr<GVariant>> decode(Decoder&);
+template<> struct ArgumentCoder<GRefPtr<GVariant>> {
+ static void encode(Encoder&, GRefPtr<GVariant>);
+ static Optional<GRefPtr<GVariant>> decode(Decoder&);
+};
+template<> struct ArgumentCoder<GRefPtr<GTlsCertificate>> {
+ static void encode(Encoder&, GRefPtr<GTlsCertificate>);
+ static Optional<GRefPtr<GTlsCertificate>> decode(Decoder&);
+};
+
} // namespace IPC
Modified: trunk/Source/WebKit/Shared/glib/UserMessage.cpp (277425 => 277426)
--- trunk/Source/WebKit/Shared/glib/UserMessage.cpp 2021-05-13 06:45:07 UTC (rev 277425)
+++ trunk/Source/WebKit/Shared/glib/UserMessage.cpp 2021-05-13 08:00:14 UTC (rev 277426)
@@ -45,7 +45,7 @@
return;
}
- IPC::encode(encoder, parameters.get());
+ encoder << parameters;
Vector<IPC::Attachment> attachments;
if (fileDescriptors) {
@@ -78,7 +78,8 @@
return result;
}
- Optional<GRefPtr<GVariant>> parameters = IPC::decode(decoder);
+ Optional<GRefPtr<GVariant>> parameters;
+ decoder >> parameters;
if (!parameters)
return WTF::nullopt;
result.parameters = WTFMove(*parameters);
Modified: trunk/Source/WebKit/Shared/soup/WebCoreArgumentCodersSoup.cpp (277425 => 277426)
--- trunk/Source/WebKit/Shared/soup/WebCoreArgumentCodersSoup.cpp 2021-05-13 06:45:07 UTC (rev 277425)
+++ trunk/Source/WebKit/Shared/soup/WebCoreArgumentCodersSoup.cpp 2021-05-13 08:00:14 UTC (rev 277426)
@@ -26,9 +26,10 @@
*/
#include "config.h"
-#include "DataReference.h"
#include "WebCoreArgumentCoders.h"
+#include "ArgumentCodersGLib.h"
+#include "DataReference.h"
#include <WebCore/CertificateInfo.h>
#include <WebCore/DictionaryPopupInfo.h>
#include <WebCore/Font.h>
@@ -54,69 +55,30 @@
void ArgumentCoder<CertificateInfo>::encode(Encoder& encoder, const CertificateInfo& certificateInfo)
{
- auto* certificate = certificateInfo.certificate();
- if (!certificate) {
- encoder << 0;
+ GRefPtr<GTlsCertificate> certificate = certificateInfo.certificate();
+ encoder << certificate;
+ if (!certificate)
return;
- }
- Vector<GRefPtr<GByteArray>> certificatesDataList;
- for (; certificate; certificate = g_tls_certificate_get_issuer(certificate)) {
- GByteArray* certificateData = nullptr;
- g_object_get(G_OBJECT(certificate), "certificate", &certificateData, nullptr);
-
- if (!certificateData) {
- certificatesDataList.clear();
- break;
- }
-
- certificatesDataList.append(adoptGRef(certificateData));
- }
-
- encoder << static_cast<uint32_t>(certificatesDataList.size());
-
- if (certificatesDataList.isEmpty())
- return;
-
- // Encode starting from the root certificate.
- for (size_t i = certificatesDataList.size(); i > 0; --i) {
- GByteArray* certificate = certificatesDataList[i - 1].get();
- encoder << IPC::DataReference(certificate->data, certificate->len);
- }
-
encoder << static_cast<uint32_t>(certificateInfo.tlsErrors());
}
bool ArgumentCoder<CertificateInfo>::decode(Decoder& decoder, CertificateInfo& certificateInfo)
{
- uint32_t chainLength;
- if (!decoder.decode(chainLength))
+ Optional<GRefPtr<GTlsCertificate>> certificate;
+ decoder >> certificate;
+ if (!certificate)
return false;
- if (!chainLength)
- return true;
-
- GType certificateType = g_tls_backend_get_certificate_type(g_tls_backend_get_default());
- GRefPtr<GTlsCertificate> certificate;
- for (uint32_t i = 0; i < chainLength; i++) {
- IPC::DataReference certificateDataReference;
- if (!decoder.decode(certificateDataReference))
+ if (certificate.value()) {
+ uint32_t tlsErrors;
+ if (!decoder.decode(tlsErrors))
return false;
- GByteArray* certificateData = g_byte_array_sized_new(certificateDataReference.size());
- GRefPtr<GByteArray> certificateBytes = adoptGRef(g_byte_array_append(certificateData, certificateDataReference.data(), certificateDataReference.size()));
-
- certificate = adoptGRef(G_TLS_CERTIFICATE(g_initable_new(
- certificateType, nullptr, nullptr, "certificate", certificateBytes.get(), "issuer", certificate.get(), nullptr)));
+ certificateInfo.setCertificate(certificate->get());
+ certificateInfo.setTLSErrors(static_cast<GTlsCertificateFlags>(tlsErrors));
}
- uint32_t tlsErrors;
- if (!decoder.decode(tlsErrors))
- return false;
-
- certificateInfo.setCertificate(certificate.get());
- certificateInfo.setTLSErrors(static_cast<GTlsCertificateFlags>(tlsErrors));
-
return true;
}