diff options
Diffstat (limited to 'Source/WebKit2/Shared/win')
-rw-r--r-- | Source/WebKit2/Shared/win/PlatformCertificateInfo.cpp | 21 | ||||
-rw-r--r-- | Source/WebKit2/Shared/win/PlatformCertificateInfo.h | 1 | ||||
-rw-r--r-- | Source/WebKit2/Shared/win/WebCoreArgumentCodersWin.cpp | 37 |
3 files changed, 53 insertions, 6 deletions
diff --git a/Source/WebKit2/Shared/win/PlatformCertificateInfo.cpp b/Source/WebKit2/Shared/win/PlatformCertificateInfo.cpp index ade2291..0d1ca36 100644 --- a/Source/WebKit2/Shared/win/PlatformCertificateInfo.cpp +++ b/Source/WebKit2/Shared/win/PlatformCertificateInfo.cpp @@ -65,14 +65,23 @@ PlatformCertificateInfo::PlatformCertificateInfo(const ResourceResponse& respons PCERT_SIMPLE_CHAIN firstSimpleChain = chainContext->rgpChain[0]; for (unsigned i = 0; i < firstSimpleChain->cElement; ++i) { PCCERT_CONTEXT certificateContext = firstSimpleChain->rgpElement[i]->pCertContext; - ::CertDuplicateCertificateContext(certificateContext); - m_certificateChain.append(certificateContext); + PCCERT_CONTEXT certificateContextCopy = ::CertDuplicateCertificateContext(certificateContext); + m_certificateChain.append(certificateContextCopy); } #else // FIXME: WinCairo implementation #endif } +PlatformCertificateInfo::PlatformCertificateInfo(PCCERT_CONTEXT certificateContext) +{ + if (!certificateContext) + return; + + PCCERT_CONTEXT certificateContextCopy = ::CertDuplicateCertificateContext(certificateContext); + m_certificateChain.append(certificateContextCopy); +} + PlatformCertificateInfo::~PlatformCertificateInfo() { clearCertificateChain(); @@ -81,8 +90,8 @@ PlatformCertificateInfo::~PlatformCertificateInfo() PlatformCertificateInfo::PlatformCertificateInfo(const PlatformCertificateInfo& other) { for (size_t i = 0; i < other.m_certificateChain.size(); ++i) { - ::CertDuplicateCertificateContext(other.m_certificateChain[i]); - m_certificateChain.append(other.m_certificateChain[i]); + PCCERT_CONTEXT certificateContextCopy = ::CertDuplicateCertificateContext(other.m_certificateChain[i]); + m_certificateChain.append(certificateContextCopy); } } @@ -90,8 +99,8 @@ PlatformCertificateInfo& PlatformCertificateInfo::operator=(const PlatformCertif { clearCertificateChain(); for (size_t i = 0; i < other.m_certificateChain.size(); ++i) { - ::CertDuplicateCertificateContext(other.m_certificateChain[i]); - m_certificateChain.append(other.m_certificateChain[i]); + PCCERT_CONTEXT certificateContextCopy = ::CertDuplicateCertificateContext(other.m_certificateChain[i]); + m_certificateChain.append(certificateContextCopy); } return *this; } diff --git a/Source/WebKit2/Shared/win/PlatformCertificateInfo.h b/Source/WebKit2/Shared/win/PlatformCertificateInfo.h index e483d37..dd999ef 100644 --- a/Source/WebKit2/Shared/win/PlatformCertificateInfo.h +++ b/Source/WebKit2/Shared/win/PlatformCertificateInfo.h @@ -43,6 +43,7 @@ class PlatformCertificateInfo { public: PlatformCertificateInfo(); explicit PlatformCertificateInfo(const WebCore::ResourceResponse&); + explicit PlatformCertificateInfo(PCCERT_CONTEXT); ~PlatformCertificateInfo(); PlatformCertificateInfo(const PlatformCertificateInfo&); diff --git a/Source/WebKit2/Shared/win/WebCoreArgumentCodersWin.cpp b/Source/WebKit2/Shared/win/WebCoreArgumentCodersWin.cpp index 9513e90..d659ac4 100644 --- a/Source/WebKit2/Shared/win/WebCoreArgumentCodersWin.cpp +++ b/Source/WebKit2/Shared/win/WebCoreArgumentCodersWin.cpp @@ -28,6 +28,8 @@ #if USE(CFNETWORK) #include "ArgumentCodersCF.h" +#include "PlatformCertificateInfo.h" +#include <WebCore/CertificateCFWin.h> #include <WebKitSystemInterface/WebKitSystemInterface.h> #endif @@ -117,4 +119,39 @@ bool decodeResourceResponse(ArgumentDecoder* decoder, WebCore::ResourceResponse& #endif } +void encodeResourceError(ArgumentEncoder* encoder, const WebCore::ResourceError& resourceError) +{ + encoder->encode(CoreIPC::In(resourceError.domain(), resourceError.errorCode(), resourceError.failingURL(), resourceError.localizedDescription())); + +#if USE(CFNETWORK) + encoder->encode(WebKit::PlatformCertificateInfo(resourceError.certificate())); +#endif +} + +bool decodeResourceError(ArgumentDecoder* decoder, WebCore::ResourceError& resourceError) +{ + String domain; + int errorCode; + String failingURL; + String localizedDescription; + if (!decoder->decode(CoreIPC::Out(domain, errorCode, failingURL, localizedDescription))) + return false; + +#if USE(CFNETWORK) + WebKit::PlatformCertificateInfo certificate; + if (!decoder->decode(certificate)) + return false; + + const Vector<PCCERT_CONTEXT> certificateChain = certificate.certificateChain(); + if (!certificateChain.isEmpty()) { + ASSERT(certificateChain.size() == 1); + resourceError = WebCore::ResourceError(domain, errorCode, failingURL, localizedDescription, WebCore::copyCertificateToData(certificateChain.first()).get()); + return true; + } +#endif + + resourceError = WebCore::ResourceError(domain, errorCode, failingURL, localizedDescription); + return true; +} + } // namespace CoreIPC |