diff options
Diffstat (limited to 'Source/WebKit2/UIProcess/API/gtk/WebKitURISchemeRequest.cpp')
-rw-r--r-- | Source/WebKit2/UIProcess/API/gtk/WebKitURISchemeRequest.cpp | 67 |
1 files changed, 46 insertions, 21 deletions
diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitURISchemeRequest.cpp b/Source/WebKit2/UIProcess/API/gtk/WebKitURISchemeRequest.cpp index 6d8c68418..59bdb930d 100644 --- a/Source/WebKit2/UIProcess/API/gtk/WebKitURISchemeRequest.cpp +++ b/Source/WebKit2/UIProcess/API/gtk/WebKitURISchemeRequest.cpp @@ -21,6 +21,7 @@ #include "WebKitURISchemeRequest.h" #include "APIData.h" +#include "WebKitPrivate.h" #include "WebKitURISchemeRequestPrivate.h" #include "WebKitWebContextPrivate.h" #include "WebKitWebView.h" @@ -28,10 +29,11 @@ #include <WebCore/GUniquePtrSoup.h> #include <WebCore/ResourceError.h> #include <libsoup/soup.h> -#include <wtf/gobject/GRefPtr.h> +#include <wtf/glib/GRefPtr.h> #include <wtf/text/CString.h> using namespace WebKit; +using namespace WebCore; /** * SECTION: WebKitURISchemeRequest @@ -53,7 +55,7 @@ static const unsigned int gReadBufferSize = 8192; struct _WebKitURISchemeRequestPrivate { WebKitWebContext* webContext; - RefPtr<WebSoupCustomProtocolRequestManager> webRequestManager; + CustomProtocolManagerProxy* manager; RefPtr<WebPageProxy> initiatingPage; uint64_t requestID; CString uri; @@ -69,25 +71,35 @@ struct _WebKitURISchemeRequestPrivate { WEBKIT_DEFINE_TYPE(WebKitURISchemeRequest, webkit_uri_scheme_request, G_TYPE_OBJECT) -static void webkit_uri_scheme_request_class_init(WebKitURISchemeRequestClass* requestClass) +static void webkit_uri_scheme_request_class_init(WebKitURISchemeRequestClass*) { } -WebKitURISchemeRequest* webkitURISchemeRequestCreate(uint64_t requestID, WebKitWebContext* webContext, API::URLRequest* urlRequest) +WebKitURISchemeRequest* webkitURISchemeRequestCreate(uint64_t requestID, WebKitWebContext* webContext, const ResourceRequest& resourceRequest, CustomProtocolManagerProxy& manager) { - WebKitURISchemeRequest* request = WEBKIT_URI_SCHEME_REQUEST(g_object_new(WEBKIT_TYPE_URI_SCHEME_REQUEST, NULL)); + WebKitURISchemeRequest* request = WEBKIT_URI_SCHEME_REQUEST(g_object_new(WEBKIT_TYPE_URI_SCHEME_REQUEST, nullptr)); request->priv->webContext = webContext; - request->priv->webRequestManager = webkitWebContextGetRequestManager(webContext); - request->priv->uri = urlRequest->resourceRequest().url().string().utf8(); - request->priv->initiatingPage = WebProcessProxy::webPage(urlRequest->resourceRequest().initiatingPageID()); + request->priv->manager = &manager; + request->priv->uri = resourceRequest.url().string().utf8(); + request->priv->initiatingPage = WebProcessProxy::webPage(resourceRequest.initiatingPageID()); request->priv->requestID = requestID; return request; } void webkitURISchemeRequestCancel(WebKitURISchemeRequest* request) { - if (request->priv->cancellable.get()) - g_cancellable_cancel(request->priv->cancellable.get()); + g_cancellable_cancel(request->priv->cancellable.get()); +} + +CustomProtocolManagerProxy* webkitURISchemeRequestGetManager(WebKitURISchemeRequest* request) +{ + return request->priv->manager; +} + +void webkitURISchemeRequestInvalidate(WebKitURISchemeRequest* request) +{ + request->priv->manager = nullptr; + webkitURISchemeRequestCancel(request); } /** @@ -158,29 +170,39 @@ WebKitWebView* webkit_uri_scheme_request_get_web_view(WebKitURISchemeRequest* re static void webkitURISchemeRequestReadCallback(GInputStream* inputStream, GAsyncResult* result, WebKitURISchemeRequest* schemeRequest) { GRefPtr<WebKitURISchemeRequest> request = adoptGRef(schemeRequest); + WebKitURISchemeRequestPrivate* priv = request->priv; GUniqueOutPtr<GError> error; gssize bytesRead = g_input_stream_read_finish(inputStream, result, &error.outPtr()); + if (!priv->manager) { + webkitWebContextDidFinishLoadingCustomProtocol(priv->webContext, priv->requestID); + return; + } + if (bytesRead == -1) { webkit_uri_scheme_request_finish_error(request.get(), error.get()); return; } - WebKitURISchemeRequestPrivate* priv = request->priv; - RefPtr<API::Data> webData = API::Data::create(reinterpret_cast<const unsigned char*>(priv->readBuffer), bytesRead); + // Need to check the stream before proceeding as it can be cancelled if finish_error + // was previously call, which won't be detected by g_input_stream_read_finish(). + if (!request->priv->stream) + return; + + auto webData = IPC::DataReference(reinterpret_cast<const uint8_t*>(priv->readBuffer), bytesRead); if (!priv->bytesRead) { // First chunk read. In case of empty reply an empty API::Data is sent to the networking process. - WebCore::ResourceResponse response(WebCore::URL(WebCore::URL(), String::fromUTF8(priv->uri)), String::fromUTF8(priv->mimeType.data()), - priv->streamLength, emptyString(), emptyString()); - priv->webRequestManager->didReceiveResponse(priv->requestID, response); - priv->webRequestManager->didLoadData(priv->requestID, webData.get()); + ResourceResponse response(URL(URL(), String::fromUTF8(priv->uri)), String::fromUTF8(priv->mimeType.data()), + priv->streamLength, emptyString()); + priv->manager->didReceiveResponse(priv->requestID, response, 0); + priv->manager->didLoadData(priv->requestID, webData); } else if (bytesRead || (!bytesRead && !priv->streamLength)) { // Subsequent chunk read. We only send an empty API::Data to the networking process when stream length is unknown. - priv->webRequestManager->didLoadData(priv->requestID, webData.get()); + priv->manager->didLoadData(priv->requestID, webData); } if (!bytesRead) { - priv->webRequestManager->didFinishLoading(request->priv->requestID); - webkitWebContextDidFinishLoadingCustomProtocol(request->priv->webContext, request->priv->requestID); + priv->manager->didFinishLoading(priv->requestID); + webkitWebContextDidFinishLoadingCustomProtocol(priv->webContext, priv->requestID); return; } @@ -229,8 +251,11 @@ void webkit_uri_scheme_request_finish_error(WebKitURISchemeRequest* request, GEr g_return_if_fail(error); WebKitURISchemeRequestPrivate* priv = request->priv; + if (!webkitWebContextIsLoadingCustomProtocol(priv->webContext, priv->requestID)) + return; - WebCore::ResourceError resourceError(g_quark_to_string(error->domain), error->code, priv->uri.data(), String::fromUTF8(error->message)); - priv->webRequestManager->didFailWithError(priv->requestID, resourceError); + priv->stream = nullptr; + ResourceError resourceError(g_quark_to_string(error->domain), toWebCoreError(error->code), URL(priv->soupURI.get()), String::fromUTF8(error->message)); + priv->manager->didFailWithError(priv->requestID, resourceError); webkitWebContextDidFinishLoadingCustomProtocol(priv->webContext, priv->requestID); } |