RequestManagerClientEfl.cpp [plain text]
#include "config.h"
#include "RequestManagerClientEfl.h"
#include "APICustomProtocolManagerClient.h"
#include "CustomProtocolManagerProxy.h"
#include "ewk_context_private.h"
#include "ewk_url_scheme_request_private.h"
namespace WebKit {
class CustomProtocolManagerClient final : public API::CustomProtocolManagerClient {
public:
explicit CustomProtocolManagerClient(RequestManagerClientEfl* client)
: m_client(client)
{
}
private:
bool startLoading(CustomProtocolManagerProxy& manager, uint64_t customProtocolID, const WebCore::ResourceRequest& resourceRequest) override
{
auto urlRequest = API::URLRequest::create(resourceRequest);
RefPtr<EwkUrlSchemeRequest> request = EwkUrlSchemeRequest::create(manager, urlRequest.ptr(), customProtocolID);
String scheme(String::fromUTF8(request.get()->scheme()));
RefPtr<WebKitURISchemeHandler> handler = (m_client->m_uriSchemeHandlers).get(scheme);
ASSERT(handler.get());
if (!handler->hasCallback())
return true;
(m_client->m_uriSchemeRequests).set(customProtocolID, request);
handler->performCallback(request.get());
return true;
}
void stopLoading(CustomProtocolManagerProxy&, uint64_t customProtocolID) override
{
(m_client->m_uriSchemeRequests).remove(customProtocolID);
}
void invalidate(CustomProtocolManagerProxy& manager) override
{
Vector<RefPtr<EwkUrlSchemeRequest>> requests;
copyValuesToVector(m_client->m_uriSchemeRequests, requests);
for (auto& request : requests) {
if (request->manager() == &manager) {
request->invalidate();
stopLoading(manager, request->id());
}
}
}
RequestManagerClientEfl* m_client;
};
RequestManagerClientEfl::RequestManagerClientEfl(WKContextRef context)
{
m_processPool = toImpl(context);
m_processPool->setCustomProtocolManagerClient(std::make_unique<CustomProtocolManagerClient>(this));
}
void RequestManagerClientEfl::registerURLSchemeHandler(const String& scheme, Ewk_Url_Scheme_Request_Cb callback, void* userData)
{
ASSERT(callback);
RefPtr<WebKitURISchemeHandler> handler = adoptRef(new WebKitURISchemeHandler(callback, userData));
auto addResult = m_uriSchemeHandlers.set(scheme, handler);
if (addResult.isNewEntry)
m_processPool->registerSchemeForCustomProtocol(scheme);
}
}