/* * Copyright (C) 2010, 2011, 2012, 2015, 2016 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ #include "config.h" #include "WebPlatformStrategies.h" #include "BlobRegistryProxy.h" #include "BlockingResponseMap.h" #include "DataReference.h" #include "HangDetectionDisabler.h" #include "NetworkConnectionToWebProcessMessages.h" #include "NetworkProcessConnection.h" #include "NetworkResourceLoadParameters.h" #include "PluginInfoStore.h" #include "SessionTracker.h" #include "WebCookieManager.h" #include "WebCoreArgumentCoders.h" #include "WebErrors.h" #include "WebFrame.h" #include "WebFrameLoaderClient.h" #include "WebLoaderStrategy.h" #include "WebPage.h" #include "WebPasteboardOverrides.h" #include "WebPasteboardProxyMessages.h" #include "WebProcess.h" #include "WebProcessProxyMessages.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if PLATFORM(MAC) #include "StringUtilities.h" #endif #if PLATFORM(GTK) #include "WebSelectionData.h" #endif using namespace WebCore; namespace WebKit { void WebPlatformStrategies::initialize() { static NeverDestroyed platformStrategies; setPlatformStrategies(&platformStrategies.get()); } WebPlatformStrategies::WebPlatformStrategies() { } CookiesStrategy* WebPlatformStrategies::createCookiesStrategy() { return this; } LoaderStrategy* WebPlatformStrategies::createLoaderStrategy() { return &WebProcess::singleton().webLoaderStrategy(); } PasteboardStrategy* WebPlatformStrategies::createPasteboardStrategy() { return this; } BlobRegistry* WebPlatformStrategies::createBlobRegistry() { return new BlobRegistryProxy; } // CookiesStrategy String WebPlatformStrategies::cookiesForDOM(const NetworkStorageSession& session, const URL& firstParty, const URL& url) { String result; if (!WebProcess::singleton().networkConnection().connection().sendSync(Messages::NetworkConnectionToWebProcess::CookiesForDOM(session.sessionID(), firstParty, url), Messages::NetworkConnectionToWebProcess::CookiesForDOM::Reply(result), 0)) return String(); return result; } void WebPlatformStrategies::setCookiesFromDOM(const NetworkStorageSession& session, const URL& firstParty, const URL& url, const String& cookieString) { WebProcess::singleton().networkConnection().connection().send(Messages::NetworkConnectionToWebProcess::SetCookiesFromDOM(session.sessionID(), firstParty, url, cookieString), 0); } bool WebPlatformStrategies::cookiesEnabled(const NetworkStorageSession& session, const URL& firstParty, const URL& url) { bool result; if (!WebProcess::singleton().networkConnection().connection().sendSync(Messages::NetworkConnectionToWebProcess::CookiesEnabled(session.sessionID(), firstParty, url), Messages::NetworkConnectionToWebProcess::CookiesEnabled::Reply(result), 0)) return false; return result; } String WebPlatformStrategies::cookieRequestHeaderFieldValue(const NetworkStorageSession& session, const URL& firstParty, const URL& url) { return cookieRequestHeaderFieldValue(session.sessionID(), firstParty, url); } String WebPlatformStrategies::cookieRequestHeaderFieldValue(SessionID sessionID, const URL& firstParty, const URL& url) { String result; if (!WebProcess::singleton().networkConnection().connection().sendSync(Messages::NetworkConnectionToWebProcess::CookieRequestHeaderFieldValue(sessionID, firstParty, url), Messages::NetworkConnectionToWebProcess::CookieRequestHeaderFieldValue::Reply(result), 0)) return String(); return result; } bool WebPlatformStrategies::getRawCookies(const NetworkStorageSession& session, const URL& firstParty, const URL& url, Vector& rawCookies) { if (!WebProcess::singleton().networkConnection().connection().sendSync(Messages::NetworkConnectionToWebProcess::GetRawCookies(session.sessionID(), firstParty, url), Messages::NetworkConnectionToWebProcess::GetRawCookies::Reply(rawCookies), 0)) return false; return true; } void WebPlatformStrategies::deleteCookie(const NetworkStorageSession& session, const URL& url, const String& cookieName) { WebProcess::singleton().networkConnection().connection().send(Messages::NetworkConnectionToWebProcess::DeleteCookie(session.sessionID(), url, cookieName), 0); } void WebPlatformStrategies::addCookie(const NetworkStorageSession& session, const URL& url, const Cookie& cookie) { WebProcess::singleton().networkConnection().connection().send(Messages::NetworkConnectionToWebProcess::AddCookie(session.sessionID(), url, cookie), 0); } #if PLATFORM(COCOA) // PasteboardStrategy void WebPlatformStrategies::getTypes(Vector& types, const String& pasteboardName) { // First check the overrides. // The purpose of the overrides is to avoid messaging back to the UI process. // Therefore, if there are any overridden types, we return just those. types = WebPasteboardOverrides::sharedPasteboardOverrides().overriddenTypes(pasteboardName); if (!types.isEmpty()) return; WebProcess::singleton().parentProcessConnection()->sendSync(Messages::WebPasteboardProxy::GetPasteboardTypes(pasteboardName), Messages::WebPasteboardProxy::GetPasteboardTypes::Reply(types), 0); } RefPtr WebPlatformStrategies::bufferForType(const String& pasteboardType, const String& pasteboardName) { // First check the overrides. Vector overrideBuffer; if (WebPasteboardOverrides::sharedPasteboardOverrides().getDataForOverride(pasteboardName, pasteboardType, overrideBuffer)) return SharedBuffer::adoptVector(overrideBuffer); // Fallback to messaging the UI process for native pasteboard content. SharedMemory::Handle handle; uint64_t size = 0; WebProcess::singleton().parentProcessConnection()->sendSync(Messages::WebPasteboardProxy::GetPasteboardBufferForType(pasteboardName, pasteboardType), Messages::WebPasteboardProxy::GetPasteboardBufferForType::Reply(handle, size), 0); if (handle.isNull()) return nullptr; RefPtr sharedMemoryBuffer = SharedMemory::map(handle, SharedMemory::Protection::ReadOnly); return SharedBuffer::create(static_cast(sharedMemoryBuffer->data()), size); } void WebPlatformStrategies::getPathnamesForType(Vector& pathnames, const String& pasteboardType, const String& pasteboardName) { WebProcess::singleton().parentProcessConnection()->sendSync(Messages::WebPasteboardProxy::GetPasteboardPathnamesForType(pasteboardName, pasteboardType), Messages::WebPasteboardProxy::GetPasteboardPathnamesForType::Reply(pathnames), 0); } String WebPlatformStrategies::stringForType(const String& pasteboardType, const String& pasteboardName) { String value; WebProcess::singleton().parentProcessConnection()->sendSync(Messages::WebPasteboardProxy::GetPasteboardStringForType(pasteboardName, pasteboardType), Messages::WebPasteboardProxy::GetPasteboardStringForType::Reply(value), 0); return value; } long WebPlatformStrategies::copy(const String& fromPasteboard, const String& toPasteboard) { uint64_t newChangeCount; WebProcess::singleton().parentProcessConnection()->sendSync(Messages::WebPasteboardProxy::PasteboardCopy(fromPasteboard, toPasteboard), Messages::WebPasteboardProxy::PasteboardCopy::Reply(newChangeCount), 0); return newChangeCount; } long WebPlatformStrategies::changeCount(const WTF::String &pasteboardName) { uint64_t changeCount; WebProcess::singleton().parentProcessConnection()->sendSync(Messages::WebPasteboardProxy::GetPasteboardChangeCount(pasteboardName), Messages::WebPasteboardProxy::GetPasteboardChangeCount::Reply(changeCount), 0); return changeCount; } String WebPlatformStrategies::uniqueName() { String pasteboardName; WebProcess::singleton().parentProcessConnection()->sendSync(Messages::WebPasteboardProxy::GetPasteboardUniqueName(), Messages::WebPasteboardProxy::GetPasteboardUniqueName::Reply(pasteboardName), 0); return pasteboardName; } Color WebPlatformStrategies::color(const String& pasteboardName) { Color color; WebProcess::singleton().parentProcessConnection()->sendSync(Messages::WebPasteboardProxy::GetPasteboardColor(pasteboardName), Messages::WebPasteboardProxy::GetPasteboardColor::Reply(color), 0); return color; } URL WebPlatformStrategies::url(const String& pasteboardName) { String urlString; WebProcess::singleton().parentProcessConnection()->sendSync(Messages::WebPasteboardProxy::GetPasteboardURL(pasteboardName), Messages::WebPasteboardProxy::GetPasteboardURL::Reply(urlString), 0); return URL(ParsedURLString, urlString); } long WebPlatformStrategies::addTypes(const Vector& pasteboardTypes, const String& pasteboardName) { uint64_t newChangeCount; WebProcess::singleton().parentProcessConnection()->sendSync(Messages::WebPasteboardProxy::AddPasteboardTypes(pasteboardName, pasteboardTypes), Messages::WebPasteboardProxy::AddPasteboardTypes::Reply(newChangeCount), 0); return newChangeCount; } long WebPlatformStrategies::setTypes(const Vector& pasteboardTypes, const String& pasteboardName) { uint64_t newChangeCount; WebProcess::singleton().parentProcessConnection()->sendSync(Messages::WebPasteboardProxy::SetPasteboardTypes(pasteboardName, pasteboardTypes), Messages::WebPasteboardProxy::SetPasteboardTypes::Reply(newChangeCount), 0); return newChangeCount; } long WebPlatformStrategies::setBufferForType(SharedBuffer* buffer, const String& pasteboardType, const String& pasteboardName) { SharedMemory::Handle handle; if (buffer) { RefPtr sharedMemoryBuffer = SharedMemory::allocate(buffer->size()); // FIXME: Null check prevents crashing, but it is not great that we will have empty pasteboard content for this type, // because we've already set the types. if (sharedMemoryBuffer) { memcpy(sharedMemoryBuffer->data(), buffer->data(), buffer->size()); sharedMemoryBuffer->createHandle(handle, SharedMemory::Protection::ReadOnly); } } uint64_t newChangeCount; WebProcess::singleton().parentProcessConnection()->sendSync(Messages::WebPasteboardProxy::SetPasteboardBufferForType(pasteboardName, pasteboardType, handle, buffer ? buffer->size() : 0), Messages::WebPasteboardProxy::SetPasteboardBufferForType::Reply(newChangeCount), 0); return newChangeCount; } long WebPlatformStrategies::setPathnamesForType(const Vector& pathnames, const String& pasteboardType, const String& pasteboardName) { uint64_t newChangeCount; WebProcess::singleton().parentProcessConnection()->sendSync(Messages::WebPasteboardProxy::SetPasteboardPathnamesForType(pasteboardName, pasteboardType, pathnames), Messages::WebPasteboardProxy::SetPasteboardPathnamesForType::Reply(newChangeCount), 0); return newChangeCount; } long WebPlatformStrategies::setStringForType(const String& string, const String& pasteboardType, const String& pasteboardName) { uint64_t newChangeCount; WebProcess::singleton().parentProcessConnection()->sendSync(Messages::WebPasteboardProxy::SetPasteboardStringForType(pasteboardName, pasteboardType, string), Messages::WebPasteboardProxy::SetPasteboardStringForType::Reply(newChangeCount), 0); return newChangeCount; } #if PLATFORM(IOS) void WebPlatformStrategies::writeToPasteboard(const WebCore::PasteboardWebContent& content, const String& pasteboardName) { WebProcess::singleton().parentProcessConnection()->send(Messages::WebPasteboardProxy::WriteWebContentToPasteboard(content, pasteboardName), 0); } void WebPlatformStrategies::writeToPasteboard(const WebCore::PasteboardImage& image, const String& pasteboardName) { WebProcess::singleton().parentProcessConnection()->send(Messages::WebPasteboardProxy::WriteImageToPasteboard(image, pasteboardName), 0); } void WebPlatformStrategies::writeToPasteboard(const String& pasteboardType, const String& text, const String& pasteboardName) { WebProcess::singleton().parentProcessConnection()->send(Messages::WebPasteboardProxy::WriteStringToPasteboard(pasteboardType, text, pasteboardName), 0); } int WebPlatformStrategies::getPasteboardItemsCount(const String& pasteboardName) { uint64_t itemsCount; WebProcess::singleton().parentProcessConnection()->sendSync(Messages::WebPasteboardProxy::GetPasteboardItemsCount(pasteboardName), Messages::WebPasteboardProxy::GetPasteboardItemsCount::Reply(itemsCount), 0); return itemsCount; } RefPtr WebPlatformStrategies::readBufferFromPasteboard(int index, const String& pasteboardType, const String& pasteboardName) { SharedMemory::Handle handle; uint64_t size = 0; WebProcess::singleton().parentProcessConnection()->sendSync(Messages::WebPasteboardProxy::ReadBufferFromPasteboard(index, pasteboardType, pasteboardName), Messages::WebPasteboardProxy::ReadBufferFromPasteboard::Reply(handle, size), 0); if (handle.isNull()) return nullptr; RefPtr sharedMemoryBuffer = SharedMemory::map(handle, SharedMemory::Protection::ReadOnly); return SharedBuffer::create(static_cast(sharedMemoryBuffer->data()), size); } WebCore::URL WebPlatformStrategies::readURLFromPasteboard(int index, const String& pasteboardType, const String& pasteboardName) { String urlString; WebProcess::singleton().parentProcessConnection()->sendSync(Messages::WebPasteboardProxy::ReadURLFromPasteboard(index, pasteboardType, pasteboardName), Messages::WebPasteboardProxy::ReadURLFromPasteboard::Reply(urlString), 0); return URL(ParsedURLString, urlString); } String WebPlatformStrategies::readStringFromPasteboard(int index, const String& pasteboardType, const String& pasteboardName) { String value; WebProcess::singleton().parentProcessConnection()->sendSync(Messages::WebPasteboardProxy::ReadStringFromPasteboard(index, pasteboardType, pasteboardName), Messages::WebPasteboardProxy::ReadStringFromPasteboard::Reply(value), 0); return value; } #endif // PLATFORM(IOS) #endif // PLATFORM(COCOA) #if PLATFORM(GTK) // PasteboardStrategy void WebPlatformStrategies::writeToClipboard(const String& pasteboardName, const SelectionData& selection) { WebSelectionData selectionData(selection); WebProcess::singleton().parentProcessConnection()->send(Messages::WebPasteboardProxy::WriteToClipboard(pasteboardName, selectionData), 0); } Ref WebPlatformStrategies::readFromClipboard(const String& pasteboardName) { WebSelectionData selection; WebProcess::singleton().parentProcessConnection()->sendSync(Messages::WebPasteboardProxy::ReadFromClipboard(pasteboardName), Messages::WebPasteboardProxy::ReadFromClipboard::Reply(selection), 0); return WTFMove(selection.selectionData); } #endif // PLATFORM(GTK) } // namespace WebKit