Title: [223966] trunk/Source/WebKit
Revision
223966
Author
[email protected]
Date
2017-10-25 11:38:48 -0700 (Wed, 25 Oct 2017)

Log Message

[WinCairo] Add WebKit platform files for wincairo webkit
https://bugs.webkit.org/show_bug.cgi?id=178000

Patch by Yousuke Kimoto <[email protected]> on 2017-10-25
Reviewed by Alex Christensen.

* Platform/Module.h:
* Platform/SharedMemory.h:
(WebKit::SharedMemory::handle const):
* Platform/win/LoggingWin.cpp: Added. It is based on Source/WebCore/platform/win/LoggingWin.cpp
(WebKit::logLevelString):
* Platform/win/ModuleWin.cpp: Added.
(WebKit::Module::load):
(WebKit::Module::unload):
(WebKit::Module::platformFunctionPointer const):
* Platform/win/SharedMemoryWin.cpp: Added.
(WebKit::SharedMemory::Handle::Handle):
(WebKit::SharedMemory::Handle::~Handle):
(WebKit::SharedMemory::Handle::isNull const):
(WebKit::SharedMemory::Handle::encode const):
(WebKit::SharedMemory::Handle::clear):
(WebKit::getDuplicatedHandle):
(WebKit::SharedMemory::Handle::decode):
(WebKit::protectAttribute):
(WebKit::SharedMemory::allocate):
(WebKit::SharedMemory::create):
(WebKit::accessRights):
(WebKit::SharedMemory::map):
(WebKit::SharedMemory::adopt):
(WebKit::SharedMemory::~SharedMemory):
(WebKit::SharedMemory::createHandle):
(WebKit::SharedMemory::systemPageSize):
* PlatformWin.cmake:

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (223965 => 223966)


--- trunk/Source/WebKit/ChangeLog	2017-10-25 18:32:46 UTC (rev 223965)
+++ trunk/Source/WebKit/ChangeLog	2017-10-25 18:38:48 UTC (rev 223966)
@@ -1,3 +1,38 @@
+2017-10-25  Yousuke Kimoto  <[email protected]>
+
+        [WinCairo] Add WebKit platform files for wincairo webkit
+        https://bugs.webkit.org/show_bug.cgi?id=178000
+
+        Reviewed by Alex Christensen.
+
+        * Platform/Module.h:
+        * Platform/SharedMemory.h:
+        (WebKit::SharedMemory::handle const):
+        * Platform/win/LoggingWin.cpp: Added. It is based on Source/WebCore/platform/win/LoggingWin.cpp
+        (WebKit::logLevelString):
+        * Platform/win/ModuleWin.cpp: Added.
+        (WebKit::Module::load):
+        (WebKit::Module::unload):
+        (WebKit::Module::platformFunctionPointer const):
+        * Platform/win/SharedMemoryWin.cpp: Added.
+        (WebKit::SharedMemory::Handle::Handle):
+        (WebKit::SharedMemory::Handle::~Handle):
+        (WebKit::SharedMemory::Handle::isNull const):
+        (WebKit::SharedMemory::Handle::encode const):
+        (WebKit::SharedMemory::Handle::clear):
+        (WebKit::getDuplicatedHandle):
+        (WebKit::SharedMemory::Handle::decode):
+        (WebKit::protectAttribute):
+        (WebKit::SharedMemory::allocate):
+        (WebKit::SharedMemory::create):
+        (WebKit::accessRights):
+        (WebKit::SharedMemory::map):
+        (WebKit::SharedMemory::adopt):
+        (WebKit::SharedMemory::~SharedMemory):
+        (WebKit::SharedMemory::createHandle):
+        (WebKit::SharedMemory::systemPageSize):
+        * PlatformWin.cmake:
+
 2017-10-25  Chris Dumez  <[email protected]>
 
         Add support for unregistering a service worker

Modified: trunk/Source/WebKit/Platform/Module.h (223965 => 223966)


--- trunk/Source/WebKit/Platform/Module.h	2017-10-25 18:32:46 UTC (rev 223965)
+++ trunk/Source/WebKit/Platform/Module.h	2017-10-25 18:38:48 UTC (rev 223966)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2017 Sony Interactive Entertainment Inc.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -23,8 +24,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef Module_h
-#define Module_h
+#pragma once
 
 #include <wtf/Noncopyable.h>
 #include <wtf/text/WTFString.h>
@@ -64,6 +64,9 @@
     void* platformFunctionPointer(const char* functionName) const;
 
     String m_path;
+#if PLATFORM(WIN)
+    HMODULE m_module;
+#endif
 #if USE(CF)
     RetainPtr<CFBundleRef> m_bundle;
 #if !defined(__LP64__)
@@ -80,5 +83,3 @@
 }
 
 }
-
-#endif

Modified: trunk/Source/WebKit/Platform/SharedMemory.h (223965 => 223966)


--- trunk/Source/WebKit/Platform/SharedMemory.h	2017-10-25 18:32:46 UTC (rev 223965)
+++ trunk/Source/WebKit/Platform/SharedMemory.h	2017-10-25 18:38:48 UTC (rev 223966)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2017 Sony Interactive Entertainment Inc.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -23,8 +24,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef SharedMemory_h
-#define SharedMemory_h
+#pragma once
 
 #include <wtf/Forward.h>
 #include <wtf/Noncopyable.h>
@@ -79,6 +79,9 @@
 #elif OS(DARWIN)
         mutable mach_port_t m_port;
         size_t m_size;
+#elif OS(WINDOWS)
+        mutable HANDLE m_handle;
+        size_t m_size;
 #endif
     };
 
@@ -88,6 +91,9 @@
 #if USE(UNIX_DOMAIN_SOCKETS)
     static RefPtr<SharedMemory> wrapMap(void*, size_t, int fileDescriptor);
 #endif
+#if OS(WINDOWS)
+    static RefPtr<SharedMemory> adopt(HANDLE, size_t, Protection);
+#endif
 
     ~SharedMemory();
 
@@ -100,6 +106,10 @@
         return m_data;
     }
 
+#if OS(WINDOWS)
+    HANDLE handle() const { return m_handle; }
+#endif
+
     // Return the system page size in bytes.
     static unsigned systemPageSize();
 
@@ -119,9 +129,9 @@
     bool m_isWrappingMap { false };
 #elif OS(DARWIN)
     mach_port_t m_port;
+#elif OS(WINDOWS)
+    HANDLE m_handle;
 #endif
 };
 
 };
-
-#endif // SharedMemory_h

Copied: trunk/Source/WebKit/Platform/win/LoggingWin.cpp (from rev 223965, trunk/Source/WebKit/Platform/Module.h) (0 => 223966)


--- trunk/Source/WebKit/Platform/win/LoggingWin.cpp	                        (rev 0)
+++ trunk/Source/WebKit/Platform/win/LoggingWin.cpp	2017-10-25 18:38:48 UTC (rev 223966)
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2008, 2013 Apple Inc. All Rights Reserved.
+ * Copyright (C) 2017 Sony Interactive Entertainment Inc.
+ *
+ * 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 "Logging.h"
+
+#if !LOG_DISABLED || !RELEASE_LOG_DISABLED
+
+#include <wtf/StdLibExtras.h>
+#include <wtf/text/WTFString.h>
+
+namespace WebKit {
+
+static char* const loggingEnvironmentVariable = "WebKitLogging";
+
+String logLevelString()
+{
+    DWORD length = GetEnvironmentVariableA(loggingEnvironmentVariable, 0, 0);
+    if (!length)
+        return emptyString();
+
+    auto buffer = std::make_unique<char[]>(length);
+
+    if (!GetEnvironmentVariableA(loggingEnvironmentVariable, buffer.get(), length))
+        return emptyString();
+
+    return String(buffer.get());
+}
+
+} // namespace WebKit
+
+#endif // !LOG_DISABLED || !RELEASE_LOG_DISABLED

Copied: trunk/Source/WebKit/Platform/win/ModuleWin.cpp (from rev 223965, trunk/Source/WebKit/Platform/Module.h) (0 => 223966)


--- trunk/Source/WebKit/Platform/win/ModuleWin.cpp	                        (rev 0)
+++ trunk/Source/WebKit/Platform/win/ModuleWin.cpp	2017-10-25 18:38:48 UTC (rev 223966)
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2017 Sony Interactive Entertainment Inc.
+ *
+ * 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 "Module.h"
+
+#include <shlwapi.h>
+#include <wtf/text/CString.h>
+
+namespace WebKit {
+
+bool Module::load()
+{
+    ASSERT(!::PathIsRelativeW(m_path.charactersWithNullTermination().data()));
+    m_module = ::LoadLibraryExW(m_path.charactersWithNullTermination().data(), 0, LOAD_WITH_ALTERED_SEARCH_PATH);
+    return m_module;
+}
+
+void Module::unload()
+{
+    if (!m_module)
+        return;
+    ::FreeLibrary(m_module);
+    m_module = 0;
+}
+
+void* Module::platformFunctionPointer(const char* functionName) const
+{
+    if (!m_module)
+        return 0;
+    return ::GetProcAddress(m_module, functionName);
+}
+
+}

Added: trunk/Source/WebKit/Platform/win/SharedMemoryWin.cpp (0 => 223966)


--- trunk/Source/WebKit/Platform/win/SharedMemoryWin.cpp	                        (rev 0)
+++ trunk/Source/WebKit/Platform/win/SharedMemoryWin.cpp	2017-10-25 18:38:48 UTC (rev 223966)
@@ -0,0 +1,242 @@
+/*
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2017 Sony Interactive Entertainment Inc.
+ *
+ * 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 "SharedMemory.h"
+
+#include "Decoder.h"
+#include "Encoder.h"
+#include <wtf/RefPtr.h>
+
+namespace WebKit {
+
+SharedMemory::Handle::Handle()
+    : m_handle(0)
+    , m_size(0)
+{
+}
+
+SharedMemory::Handle::~Handle()
+{
+    clear();
+}
+
+bool SharedMemory::Handle::isNull() const
+{
+    return !m_handle;
+}
+
+void SharedMemory::Handle::encode(IPC::Encoder& encoder) const
+{
+    encoder << static_cast<uint64_t>(m_size);
+
+    // Hand off ownership of our HANDLE to the receiving process. It will close it for us.
+    // FIXME: If the receiving process crashes before it receives the memory, the memory will be
+    // leaked. See <http://webkit.org/b/47502>.
+    encoder << reinterpret_cast<uint64_t>(m_handle);
+    m_handle = 0;
+
+    // Send along our PID so that the receiving process can duplicate the HANDLE for its own use.
+    encoder << static_cast<uint32_t>(::GetCurrentProcessId());
+}
+
+void SharedMemory::Handle::clear()
+{
+    if (!m_handle)
+        return;
+
+    ::CloseHandle(m_handle);
+    m_handle = 0;
+}
+
+static bool getDuplicatedHandle(HANDLE sourceHandle, DWORD sourcePID, HANDLE& duplicatedHandle)
+{
+    duplicatedHandle = 0;
+    if (!sourceHandle)
+        return true;
+
+    HANDLE sourceProcess = ::OpenProcess(PROCESS_DUP_HANDLE, FALSE, sourcePID);
+    if (!sourceProcess)
+        return false;
+
+    // Copy the handle into our process and close the handle that the sending process created for us.
+    BOOL success = ::DuplicateHandle(sourceProcess, sourceHandle, ::GetCurrentProcess(), &duplicatedHandle, 0, FALSE, DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE);
+    ASSERT_WITH_MESSAGE(success, "::DuplicateHandle failed with error %lu", ::GetLastError());
+
+    ::CloseHandle(sourceProcess);
+
+    return success;
+}
+
+bool SharedMemory::Handle::decode(IPC::Decoder& decoder, Handle& handle)
+{
+    ASSERT_ARG(handle, !handle.m_handle);
+    ASSERT_ARG(handle, !handle.m_size);
+
+    uint64_t size;
+    if (!decoder.decode(size))
+        return false;
+
+    uint64_t sourceHandle;
+    if (!decoder.decode(sourceHandle))
+        return false;
+
+    uint32_t sourcePID;
+    if (!decoder.decode(sourcePID))
+        return false;
+
+    HANDLE duplicatedHandle;
+    if (!getDuplicatedHandle(reinterpret_cast<HANDLE>(sourceHandle), sourcePID, duplicatedHandle))
+        return false;
+
+    handle.m_handle = duplicatedHandle;
+    handle.m_size = size;
+    return true;
+}
+
+static DWORD protectAttribute(SharedMemory::Protection protection)
+{
+    switch (protection) {
+    case SharedMemory::Protection::ReadOnly:
+        return PAGE_READONLY;
+    case SharedMemory::Protection::ReadWrite:
+        return PAGE_READWRITE;
+    }
+
+    ASSERT_NOT_REACHED();
+    return 0;
+}
+
+RefPtr<SharedMemory> SharedMemory::allocate(size_t size)
+{
+    return SharedMemory::create(nullptr, size, SharedMemory::Protection::ReadWrite);
+}
+
+RefPtr<SharedMemory> SharedMemory::create(void* address, size_t size, Protection protection)
+{
+    HANDLE handle = ::CreateFileMappingW(INVALID_HANDLE_VALUE, 0, protectAttribute(protection), 0, size, 0);
+    if (!handle)
+        return nullptr;
+
+    void* baseAddress = ::MapViewOfFileEx(handle, FILE_MAP_ALL_ACCESS, 0, 0, size, address);
+    if (!baseAddress) {
+        ::CloseHandle(handle);
+        return nullptr;
+    }
+
+    RefPtr<SharedMemory> memory = adoptRef(new SharedMemory);
+    memory->m_size = size;
+    memory->m_data = baseAddress;
+    memory->m_handle = handle;
+
+    return memory;
+}
+
+static DWORD accessRights(SharedMemory::Protection protection)
+{
+    switch (protection) {
+    case SharedMemory::Protection::ReadOnly:
+        return FILE_MAP_READ;
+    case SharedMemory::Protection::ReadWrite:
+        return FILE_MAP_READ | FILE_MAP_WRITE;
+    }
+
+    ASSERT_NOT_REACHED();
+    return 0;
+}
+
+RefPtr<SharedMemory> SharedMemory::map(const Handle& handle, Protection protection)
+{
+    RefPtr<SharedMemory> memory = adopt(handle.m_handle, handle.m_size, protection);
+    if (!memory)
+        return nullptr;
+
+    // The SharedMemory object now owns the HANDLE.
+    handle.m_handle = 0;
+
+    return memory;
+}
+
+RefPtr<SharedMemory> SharedMemory::adopt(HANDLE handle, size_t size, Protection protection)
+{
+    if (!handle)
+        return nullptr;
+
+    DWORD desiredAccess = accessRights(protection);
+
+    void* baseAddress = ::MapViewOfFile(handle, desiredAccess, 0, 0, size);
+    ASSERT_WITH_MESSAGE(baseAddress, "::MapViewOfFile failed with error %lu", ::GetLastError());
+    if (!baseAddress)
+        return nullptr;
+
+    RefPtr<SharedMemory> memory = adoptRef(new SharedMemory);
+    memory->m_size = size;
+    memory->m_data = baseAddress;
+    memory->m_handle = handle;
+
+    return memory;
+}
+
+SharedMemory::~SharedMemory()
+{
+    ASSERT(m_data);
+    ASSERT(m_handle);
+
+    ::UnmapViewOfFile(m_data);
+    ::CloseHandle(m_handle);
+}
+
+bool SharedMemory::createHandle(Handle& handle, Protection protection)
+{
+    ASSERT_ARG(handle, !handle.m_handle);
+    ASSERT_ARG(handle, !handle.m_size);
+
+    HANDLE processHandle = ::GetCurrentProcess();
+
+    HANDLE duplicatedHandle;
+    if (!::DuplicateHandle(processHandle, m_handle, processHandle, &duplicatedHandle, accessRights(protection), FALSE, 0))
+        return false;
+
+    handle.m_handle = duplicatedHandle;
+    handle.m_size = m_size;
+    return true;
+}
+
+unsigned SharedMemory::systemPageSize()
+{
+    static unsigned pageSize = 0;
+
+    if (!pageSize) {
+        SYSTEM_INFO systemInfo;
+        ::GetSystemInfo(&systemInfo);
+        pageSize = systemInfo.dwPageSize;
+    }
+
+    return pageSize;
+}
+
+
+} // namespace WebKit

Modified: trunk/Source/WebKit/PlatformWin.cmake (223965 => 223966)


--- trunk/Source/WebKit/PlatformWin.cmake	2017-10-25 18:32:46 UTC (rev 223965)
+++ trunk/Source/WebKit/PlatformWin.cmake	2017-10-25 18:38:48 UTC (rev 223966)
@@ -17,6 +17,10 @@
     NetworkProcess/win/NetworkProcessMainWin.cpp
     NetworkProcess/win/SystemProxyWin.cpp
 
+    Platform/win/LoggingWin.cpp
+    Platform/win/ModuleWin.cpp
+    Platform/win/SharedMemoryWin.cpp
+
     Shared/Authentication/curl/AuthenticationManagerCurl.cpp
 
     Shared/curl/WebCoreArgumentCodersCurl.cpp
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to