<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[210921] trunk</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/210921">210921</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2017-01-19 01:03:25 -0800 (Thu, 19 Jan 2017)</dd>
</dl>
<h3>Log Message</h3>
<pre>[GTK] Provide API to set proxy settings
https://bugs.webkit.org/show_bug.cgi?id=128674
Reviewed by Michael Catanzaro.
Source/WebCore:
Add SoupNetworkProxySettings struct to store proxy settings.
* platform/network/soup/SoupNetworkProxySettings.h: Added.
(WebCore::SoupNetworkProxySettings::SoupNetworkProxySettings):
(WebCore::SoupNetworkProxySettings::operator=):
(WebCore::SoupNetworkProxySettings::isEmpty):
* platform/network/soup/SoupNetworkSession.cpp:
(WebCore::SoupNetworkSession::SoupNetworkSession): Setup the proxy if user provided proxy settings.
(WebCore::SoupNetworkSession::setupProxy): Set the proxy-resolver property of the SoupSession according to the
global SoupNetworkProxySettings.
(WebCore::SoupNetworkSession::setProxySettingsFromEnvironment): Update the global SoupNetworkProxySettings with
values from environment.
(WebCore::SoupNetworkSession::setProxySettings): Set the global SoupNetworkProxySettings.
* platform/network/soup/SoupNetworkSession.h:
Source/WebKit2:
Add new method webkit_web_context_set_network_proxy_settings() that allows to set proxy settings in a
WebKitWebContext. It receives an enum WebKitNetworkProxyMode with modes Default, NoProxy and Custom, and an
optional WebKitNetworkProxySettings that is used when mode is Custom. WebKitNetworkProxySettings is a simple
boxed type that user can create to set proxy settins with a similar API to GSimpleProxyResolver.
* NetworkProcess/NetworkProcess.h:
* NetworkProcess/NetworkProcess.messages.in: Add SetNetworkProxySettings message.
* NetworkProcess/NetworkProcessCreationParameters.cpp:
(WebKit::NetworkProcessCreationParameters::encode): Encode proxy settings.
(WebKit::NetworkProcessCreationParameters::decode): Decode proxy settings.
* NetworkProcess/NetworkProcessCreationParameters.h:
* NetworkProcess/efl/NetworkProcessMainEfl.cpp: Use SoupNetworkSession::setProxySettingsFromEnvironment().
* NetworkProcess/soup/NetworkProcessSoup.cpp:
(WebKit::NetworkProcess::platformInitializeNetworkProcess): Set proxy settings if provided by the user.
(WebKit::NetworkProcess::setNetworkProxySettings): Set global proxy settings and setup the proxy for all
existing contexts.
* PlatformGTK.cmake: Add new files to compilation.
* Shared/WebCoreArgumentCoders.h:
* Shared/WebProcessCreationParameters.cpp:
(WebKit::WebProcessCreationParameters::encode): Encode proxy settings.
(WebKit::WebProcessCreationParameters::decode): Decode proxy settings.
* Shared/WebProcessCreationParameters.h:
* Shared/soup/WebCoreArgumentCodersSoup.cpp:
(IPC::ArgumentCoder<SoupNetworkProxySettings>::encode): Add encoder implementation for SoupNetworkProxySettings.
(IPC::ArgumentCoder<SoupNetworkProxySettings>::decode): add decoder implementation for SoupNetworkProxySettings.
* UIProcess/API/gtk/WebKitNetworkProxySettings.cpp: Added.
(_WebKitNetworkProxySettings::_WebKitNetworkProxySettings):
(webkitNetworkProxySettingsGetNetworkProxySettings):
(webkit_network_proxy_settings_new): Create a new WebKitNetworkProxySettings with optional default proxy uri and
ignore hosts list.
(webkit_network_proxy_settings_copy):
(webkit_network_proxy_settings_free):
(webkit_network_proxy_settings_add_proxy): Add a proxy uri for a given uri scheme.
* UIProcess/API/gtk/WebKitNetworkProxySettings.h: Added.
* UIProcess/API/gtk/WebKitNetworkProxySettingsPrivate.h: Added.
* UIProcess/API/gtk/WebKitWebContext.cpp:
(webkit_web_context_set_network_proxy_settings): Set proxy settings.
* UIProcess/API/gtk/WebKitWebContext.h:
* UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt: Add new symbols to the documentation.
* UIProcess/API/gtk/docs/webkit2gtk-docs.sgml: Add new section for WebKitNetworkProxySettings.
* UIProcess/API/gtk/webkit2.h: Include WebKitNetworkProxySettings.h.
* UIProcess/WebProcessPool.h: Add m_networkProxySettings and a setter for soup.
* UIProcess/efl/WebProcessPoolEfl.cpp:
(WebKit::WebProcessPool::platformInitializeWebProcess): Set m_networkProxySettings to parameters.
* UIProcess/gtk/WebProcessPoolGtk.cpp:
(WebKit::WebProcessPool::platformInitializeWebProcess): Ditto.
* UIProcess/soup/WebProcessPoolSoup.cpp:
(WebKit::WebProcessPool::platformInitializeNetworkProcess): Ditto.
(WebKit::WebProcessPool::setNetworkProxySettings): Update m_networkProxySettings and notify all processes.
* WebProcess/WebProcess.h:
* WebProcess/WebProcess.messages.in: Add SetNetworkProxySettings message.
* WebProcess/efl/WebProcessMainEfl.cpp: Use SoupNetworkSession::setProxySettingsFromEnvironment().
* WebProcess/soup/WebProcessSoup.cpp:
(WebKit::WebProcess::platformSetCacheModel): Remove comment that is no longer true.
(WebKit::WebProcess::platformInitializeWebProcess): Set proxy settings if provided by the user.
(WebKit::WebProcess::setNetworkProxySettings): Set global proxy settings and setup the proxy for all
existing contexts.
Tools:
Add tests for new proxy settings API.
* TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitWebContext.cpp:
(serverCallback):
(ProxyTest::ProxyTest):
(ProxyTest::~ProxyTest):
(ProxyTest::loadURIAndGetMainResourceData):
(ProxyTest::proxyServerPortAsString):
(testWebContextProxySettings):
(beforeAll):</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworksoupSoupNetworkSessioncpp">trunk/Source/WebCore/platform/network/soup/SoupNetworkSession.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworksoupSoupNetworkSessionh">trunk/Source/WebCore/platform/network/soup/SoupNetworkSession.h</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkProcessh">trunk/Source/WebKit2/NetworkProcess/NetworkProcess.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkProcessmessagesin">trunk/Source/WebKit2/NetworkProcess/NetworkProcess.messages.in</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkProcessCreationParameterscpp">trunk/Source/WebKit2/NetworkProcess/NetworkProcessCreationParameters.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkProcessCreationParametersh">trunk/Source/WebKit2/NetworkProcess/NetworkProcessCreationParameters.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesseflNetworkProcessMainEflcpp">trunk/Source/WebKit2/NetworkProcess/efl/NetworkProcessMainEfl.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesssoupNetworkProcessSoupcpp">trunk/Source/WebKit2/NetworkProcess/soup/NetworkProcessSoup.cpp</a></li>
<li><a href="#trunkSourceWebKit2PlatformGTKcmake">trunk/Source/WebKit2/PlatformGTK.cmake</a></li>
<li><a href="#trunkSourceWebKit2SharedWebCoreArgumentCodersh">trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.h</a></li>
<li><a href="#trunkSourceWebKit2SharedWebProcessCreationParameterscpp">trunk/Source/WebKit2/Shared/WebProcessCreationParameters.cpp</a></li>
<li><a href="#trunkSourceWebKit2SharedWebProcessCreationParametersh">trunk/Source/WebKit2/Shared/WebProcessCreationParameters.h</a></li>
<li><a href="#trunkSourceWebKit2SharedsoupWebCoreArgumentCodersSoupcpp">trunk/Source/WebKit2/Shared/soup/WebCoreArgumentCodersSoup.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitWebContextcpp">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitWebContexth">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkdocswebkit2gtk40sectionstxt">trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkdocswebkit2gtkdocssgml">trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-docs.sgml</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkwebkit2h">trunk/Source/WebKit2/UIProcess/API/gtk/webkit2.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebProcessPoolh">trunk/Source/WebKit2/UIProcess/WebProcessPool.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcesseflWebProcessPoolEflcpp">trunk/Source/WebKit2/UIProcess/efl/WebProcessPoolEfl.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessgtkWebProcessPoolGtkcpp">trunk/Source/WebKit2/UIProcess/gtk/WebProcessPoolGtk.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcesssoupWebProcessPoolSoupcpp">trunk/Source/WebKit2/UIProcess/soup/WebProcessPoolSoup.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebProcessh">trunk/Source/WebKit2/WebProcess/WebProcess.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebProcessmessagesin">trunk/Source/WebKit2/WebProcess/WebProcess.messages.in</a></li>
<li><a href="#trunkSourceWebKit2WebProcesseflWebProcessMainEflcpp">trunk/Source/WebKit2/WebProcess/efl/WebProcessMainEfl.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcesssoupWebProcessSoupcpp">trunk/Source/WebKit2/WebProcess/soup/WebProcessSoup.cpp</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWebKit2GtkTestWebKitWebContextcpp">trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitWebContext.cpp</a></li>
</ul>
<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreplatformnetworksoupSoupNetworkProxySettingsh">trunk/Source/WebCore/platform/network/soup/SoupNetworkProxySettings.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitNetworkProxySettingscpp">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitNetworkProxySettings.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitNetworkProxySettingsh">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitNetworkProxySettings.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitNetworkProxySettingsPrivateh">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitNetworkProxySettingsPrivate.h</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (210920 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2017-01-19 08:59:42 UTC (rev 210920)
+++ trunk/Source/WebCore/ChangeLog        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -1,3 +1,25 @@
</span><ins>+2017-01-19 Carlos Garcia Campos <cgarcia@igalia.com>
+
+ [GTK] Provide API to set proxy settings
+ https://bugs.webkit.org/show_bug.cgi?id=128674
+
+ Reviewed by Michael Catanzaro.
+
+ Add SoupNetworkProxySettings struct to store proxy settings.
+
+ * platform/network/soup/SoupNetworkProxySettings.h: Added.
+ (WebCore::SoupNetworkProxySettings::SoupNetworkProxySettings):
+ (WebCore::SoupNetworkProxySettings::operator=):
+ (WebCore::SoupNetworkProxySettings::isEmpty):
+ * platform/network/soup/SoupNetworkSession.cpp:
+ (WebCore::SoupNetworkSession::SoupNetworkSession): Setup the proxy if user provided proxy settings.
+ (WebCore::SoupNetworkSession::setupProxy): Set the proxy-resolver property of the SoupSession according to the
+ global SoupNetworkProxySettings.
+ (WebCore::SoupNetworkSession::setProxySettingsFromEnvironment): Update the global SoupNetworkProxySettings with
+ values from environment.
+ (WebCore::SoupNetworkSession::setProxySettings): Set the global SoupNetworkProxySettings.
+ * platform/network/soup/SoupNetworkSession.h:
+
</ins><span class="cx"> 2017-01-18 Sam Weinig <sam@webkit.org>
</span><span class="cx">
</span><span class="cx"> [WebIDL] Records should preserve javascript object order
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworksoupSoupNetworkProxySettingshfromrev210920trunkSourceWebKit2NetworkProcesseflNetworkProcessMainEflcpp"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebCore/platform/network/soup/SoupNetworkProxySettings.h (from rev 210920, trunk/Source/WebKit2/NetworkProcess/efl/NetworkProcessMainEfl.cpp) (0 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/soup/SoupNetworkProxySettings.h         (rev 0)
+++ trunk/Source/WebCore/platform/network/soup/SoupNetworkProxySettings.h        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -0,0 +1,69 @@
</span><ins>+/*
+ * Copyright (C) 2017 Igalia S.L.
+ *
+ * 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.
+ */
+
+#pragma once
+
+#include <wtf/HashMap.h>
+#include <wtf/glib/GUniquePtr.h>
+#include <wtf/text/CString.h>
+
+namespace WebCore {
+
+struct SoupNetworkProxySettings {
+ enum class Mode { Default, NoProxy, Custom };
+
+ SoupNetworkProxySettings() = default;
+
+ explicit SoupNetworkProxySettings(Mode proxyMode)
+ : mode(proxyMode)
+ {
+ }
+
+ SoupNetworkProxySettings(const WebCore::SoupNetworkProxySettings& other)
+ : mode(other.mode)
+ , defaultProxyURL(other.defaultProxyURL)
+ , ignoreHosts(g_strdupv(other.ignoreHosts.get()))
+ , proxyMap(other.proxyMap)
+ {
+ }
+
+ SoupNetworkProxySettings& operator=(const WebCore::SoupNetworkProxySettings& other)
+ {
+ mode = other.mode;
+ defaultProxyURL = other.defaultProxyURL;
+ ignoreHosts.reset(g_strdupv(other.ignoreHosts.get()));
+ proxyMap = other.proxyMap;
+ return *this;
+ }
+
+ bool isEmpty() const { return mode == Mode::Custom && defaultProxyURL.isNull() && !ignoreHosts && proxyMap.isEmpty(); }
+
+ Mode mode { Mode::Default };
+ CString defaultProxyURL;
+ GUniquePtr<char*> ignoreHosts;
+ HashMap<CString, CString> proxyMap;
+};
+
+} // namespace WebCore
</ins></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworksoupSoupNetworkSessioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/soup/SoupNetworkSession.cpp (210920 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/soup/SoupNetworkSession.cpp        2017-01-19 08:59:42 UTC (rev 210920)
+++ trunk/Source/WebCore/platform/network/soup/SoupNetworkSession.cpp        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -35,6 +35,7 @@
</span><span class="cx"> #include "GUniquePtrSoup.h"
</span><span class="cx"> #include "Logging.h"
</span><span class="cx"> #include "ResourceHandle.h"
</span><ins>+#include "SoupNetworkProxySettings.h"
</ins><span class="cx"> #include <glib/gstdio.h>
</span><span class="cx"> #include <libsoup/soup.h>
</span><span class="cx"> #include <wtf/HashSet.h>
</span><span class="lines">@@ -46,6 +47,7 @@
</span><span class="cx">
</span><span class="cx"> static bool gIgnoreTLSErrors;
</span><span class="cx"> static CString gInitialAcceptLanguages;
</span><ins>+static SoupNetworkProxySettings gProxySettings;
</ins><span class="cx">
</span><span class="cx"> #if !LOG_DISABLED
</span><span class="cx"> inline static void soupLogPrinter(SoupLogger*, SoupLoggerLogLevel, char direction, const char* data, gpointer)
</span><span class="lines">@@ -149,6 +151,8 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx">
</span><ins>+ if (gProxySettings.mode != SoupNetworkProxySettings::Mode::Default)
+ setupProxy();
</ins><span class="cx"> setupLogger();
</span><span class="cx">
</span><span class="cx"> g_signal_connect(m_soupSession.get(), "authenticate", G_CALLBACK(authenticateCallback), nullptr);
</span><span class="lines">@@ -217,40 +221,64 @@
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void SoupNetworkSession::setHTTPProxy(const char* httpProxy, const char* httpProxyExceptions)
</del><ins>+void SoupNetworkSession::setupProxy()
</ins><span class="cx"> {
</span><del>-#if PLATFORM(EFL)
- // Only for EFL because GTK port uses the default resolver, which uses GIO's proxy resolver.
- GProxyResolver* resolver = nullptr;
- if (httpProxy) {
- gchar** ignoreLists = nullptr;
- if (httpProxyExceptions)
- ignoreLists = g_strsplit(httpProxyExceptions, ",", -1);
-
- resolver = g_simple_proxy_resolver_new(httpProxy, ignoreLists);
-
- g_strfreev(ignoreLists);
</del><ins>+ GRefPtr<GProxyResolver> resolver;
+ switch (gProxySettings.mode) {
+ case SoupNetworkProxySettings::Mode::Default: {
+ GRefPtr<GProxyResolver> currentResolver;
+ g_object_get(m_soupSession.get(), SOUP_SESSION_PROXY_RESOLVER, &currentResolver.outPtr(), nullptr);
+ GProxyResolver* defaultResolver = g_proxy_resolver_get_default();
+ if (currentResolver.get() == defaultResolver)
+ return;
+ resolver = defaultResolver;
+ break;
</ins><span class="cx"> }
</span><ins>+ case SoupNetworkProxySettings::Mode::NoProxy:
+ // Do nothing in this case, resolver is nullptr so that when set it will disable proxies.
+ break;
+ case SoupNetworkProxySettings::Mode::Custom:
+ resolver = adoptGRef(g_simple_proxy_resolver_new(nullptr, nullptr));
+ if (!gProxySettings.defaultProxyURL.isNull())
+ g_simple_proxy_resolver_set_default_proxy(G_SIMPLE_PROXY_RESOLVER(resolver.get()), gProxySettings.defaultProxyURL.data());
+ if (gProxySettings.ignoreHosts)
+ g_simple_proxy_resolver_set_ignore_hosts(G_SIMPLE_PROXY_RESOLVER(resolver.get()), gProxySettings.ignoreHosts.get());
+ for (const auto& iter : gProxySettings.proxyMap)
+ g_simple_proxy_resolver_set_uri_proxy(G_SIMPLE_PROXY_RESOLVER(resolver.get()), iter.key.data(), iter.value.data());
+ break;
+ }
</ins><span class="cx">
</span><del>- g_object_set(m_soupSession.get(), SOUP_SESSION_PROXY_RESOLVER, resolver, nullptr);
-#else
- UNUSED_PARAM(httpProxy);
- UNUSED_PARAM(httpProxyExceptions);
-#endif
</del><ins>+ g_object_set(m_soupSession.get(), SOUP_SESSION_PROXY_RESOLVER, resolver.get(), nullptr);
+ soup_session_abort(m_soupSession.get());
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void SoupNetworkSession::setupHTTPProxyFromEnvironment()
</del><ins>+#if PLATFORM(EFL)
+// FIXME: This function should not exist at all and we don't want to accidentally use it in other ports.
+// The correct way to set proxy settings from the environment is to use a GProxyResolver that does so.
+// It also lacks the rather important https_proxy and ftp_proxy variables, and the uppercase versions of
+// all four variables, all of which you almost surely want to be respected if you're setting http_proxy,
+// and all of which would be supported via the default proxy resolver in non-GNOME/Ubuntu environments
+// (at least, I think that's right). Additionally, it is incorrect for WebKit to respect this environment
+// variable when running in a GNOME or Ubuntu environment, where GNOME proxy configuration should be
+// respected instead. The only reason to retain this function is to not alter the incorrect behavior for EFL.
+void SoupNetworkSession::setProxySettingsFromEnvironment()
</ins><span class="cx"> {
</span><del>-#if PLATFORM(EFL)
</del><span class="cx"> const char* httpProxy = getenv("http_proxy");
</span><span class="cx"> if (!httpProxy)
</span><span class="cx"> return;
</span><span class="cx">
</span><del>- setHTTPProxy(httpProxy, getenv("no_proxy"));
</del><ins>+ gProxySettings.defaultProxyURL = httpProxy;
+ const char* httpProxyExceptions = getenv("no_proxy");
+ if (httpProxyExceptions)
+ gProxySettings.ignoreHosts.reset(g_strsplit(httpProxyExceptions, ",", -1));
+}
</ins><span class="cx"> #endif
</span><ins>+
+void SoupNetworkSession::setProxySettings(const SoupNetworkProxySettings& settings)
+{
+ gProxySettings = settings;
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-
</del><span class="cx"> void SoupNetworkSession::setInitialAcceptLanguages(const CString& languages)
</span><span class="cx"> {
</span><span class="cx"> gInitialAcceptLanguages = languages;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworksoupSoupNetworkSessionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/network/soup/SoupNetworkSession.h (210920 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/soup/SoupNetworkSession.h        2017-01-19 08:59:42 UTC (rev 210920)
+++ trunk/Source/WebCore/platform/network/soup/SoupNetworkSession.h        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -42,6 +42,7 @@
</span><span class="cx">
</span><span class="cx"> class CertificateInfo;
</span><span class="cx"> class ResourceError;
</span><ins>+struct SoupNetworkProxySettings;
</ins><span class="cx">
</span><span class="cx"> class SoupNetworkSession {
</span><span class="cx"> WTF_MAKE_NONCOPYABLE(SoupNetworkSession); WTF_MAKE_FAST_ALLOCATED;
</span><span class="lines">@@ -56,7 +57,11 @@
</span><span class="cx">
</span><span class="cx"> static void clearOldSoupCache(const String& cacheDirectory);
</span><span class="cx">
</span><del>- void setupHTTPProxyFromEnvironment();
</del><ins>+#if PLATFORM(EFL)
+ static void setProxySettingsFromEnvironment();
+#endif
+ static void setProxySettings(const SoupNetworkProxySettings&);
+ void setupProxy();
</ins><span class="cx">
</span><span class="cx"> static void setInitialAcceptLanguages(const CString&);
</span><span class="cx"> void setAcceptLanguages(const CString&);
</span><span class="lines">@@ -66,8 +71,6 @@
</span><span class="cx"> static void allowSpecificHTTPSCertificateForHost(const CertificateInfo&, const String& host);
</span><span class="cx">
</span><span class="cx"> private:
</span><del>- void setHTTPProxy(const char* httpProxy, const char* httpProxyExceptions);
-
</del><span class="cx"> void setupLogger();
</span><span class="cx">
</span><span class="cx"> GRefPtr<SoupSession> m_soupSession;
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (210920 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2017-01-19 08:59:42 UTC (rev 210920)
+++ trunk/Source/WebKit2/ChangeLog        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -1,5 +1,70 @@
</span><span class="cx"> 2017-01-19 Carlos Garcia Campos <cgarcia@igalia.com>
</span><span class="cx">
</span><ins>+ [GTK] Provide API to set proxy settings
+ https://bugs.webkit.org/show_bug.cgi?id=128674
+
+ Reviewed by Michael Catanzaro.
+
+ Add new method webkit_web_context_set_network_proxy_settings() that allows to set proxy settings in a
+ WebKitWebContext. It receives an enum WebKitNetworkProxyMode with modes Default, NoProxy and Custom, and an
+ optional WebKitNetworkProxySettings that is used when mode is Custom. WebKitNetworkProxySettings is a simple
+ boxed type that user can create to set proxy settins with a similar API to GSimpleProxyResolver.
+
+ * NetworkProcess/NetworkProcess.h:
+ * NetworkProcess/NetworkProcess.messages.in: Add SetNetworkProxySettings message.
+ * NetworkProcess/NetworkProcessCreationParameters.cpp:
+ (WebKit::NetworkProcessCreationParameters::encode): Encode proxy settings.
+ (WebKit::NetworkProcessCreationParameters::decode): Decode proxy settings.
+ * NetworkProcess/NetworkProcessCreationParameters.h:
+ * NetworkProcess/efl/NetworkProcessMainEfl.cpp: Use SoupNetworkSession::setProxySettingsFromEnvironment().
+ * NetworkProcess/soup/NetworkProcessSoup.cpp:
+ (WebKit::NetworkProcess::platformInitializeNetworkProcess): Set proxy settings if provided by the user.
+ (WebKit::NetworkProcess::setNetworkProxySettings): Set global proxy settings and setup the proxy for all
+ existing contexts.
+ * PlatformGTK.cmake: Add new files to compilation.
+ * Shared/WebCoreArgumentCoders.h:
+ * Shared/WebProcessCreationParameters.cpp:
+ (WebKit::WebProcessCreationParameters::encode): Encode proxy settings.
+ (WebKit::WebProcessCreationParameters::decode): Decode proxy settings.
+ * Shared/WebProcessCreationParameters.h:
+ * Shared/soup/WebCoreArgumentCodersSoup.cpp:
+ (IPC::ArgumentCoder<SoupNetworkProxySettings>::encode): Add encoder implementation for SoupNetworkProxySettings.
+ (IPC::ArgumentCoder<SoupNetworkProxySettings>::decode): add decoder implementation for SoupNetworkProxySettings.
+ * UIProcess/API/gtk/WebKitNetworkProxySettings.cpp: Added.
+ (_WebKitNetworkProxySettings::_WebKitNetworkProxySettings):
+ (webkitNetworkProxySettingsGetNetworkProxySettings):
+ (webkit_network_proxy_settings_new): Create a new WebKitNetworkProxySettings with optional default proxy uri and
+ ignore hosts list.
+ (webkit_network_proxy_settings_copy):
+ (webkit_network_proxy_settings_free):
+ (webkit_network_proxy_settings_add_proxy): Add a proxy uri for a given uri scheme.
+ * UIProcess/API/gtk/WebKitNetworkProxySettings.h: Added.
+ * UIProcess/API/gtk/WebKitNetworkProxySettingsPrivate.h: Added.
+ * UIProcess/API/gtk/WebKitWebContext.cpp:
+ (webkit_web_context_set_network_proxy_settings): Set proxy settings.
+ * UIProcess/API/gtk/WebKitWebContext.h:
+ * UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt: Add new symbols to the documentation.
+ * UIProcess/API/gtk/docs/webkit2gtk-docs.sgml: Add new section for WebKitNetworkProxySettings.
+ * UIProcess/API/gtk/webkit2.h: Include WebKitNetworkProxySettings.h.
+ * UIProcess/WebProcessPool.h: Add m_networkProxySettings and a setter for soup.
+ * UIProcess/efl/WebProcessPoolEfl.cpp:
+ (WebKit::WebProcessPool::platformInitializeWebProcess): Set m_networkProxySettings to parameters.
+ * UIProcess/gtk/WebProcessPoolGtk.cpp:
+ (WebKit::WebProcessPool::platformInitializeWebProcess): Ditto.
+ * UIProcess/soup/WebProcessPoolSoup.cpp:
+ (WebKit::WebProcessPool::platformInitializeNetworkProcess): Ditto.
+ (WebKit::WebProcessPool::setNetworkProxySettings): Update m_networkProxySettings and notify all processes.
+ * WebProcess/WebProcess.h:
+ * WebProcess/WebProcess.messages.in: Add SetNetworkProxySettings message.
+ * WebProcess/efl/WebProcessMainEfl.cpp: Use SoupNetworkSession::setProxySettingsFromEnvironment().
+ * WebProcess/soup/WebProcessSoup.cpp:
+ (WebKit::WebProcess::platformSetCacheModel): Remove comment that is no longer true.
+ (WebKit::WebProcess::platformInitializeWebProcess): Set proxy settings if provided by the user.
+ (WebKit::WebProcess::setNetworkProxySettings): Set global proxy settings and setup the proxy for all
+ existing contexts.
+
+2017-01-19 Carlos Garcia Campos <cgarcia@igalia.com>
+
</ins><span class="cx"> [GTK] Do not update the backing store state unnecessarily when page visibility changes
</span><span class="cx"> https://bugs.webkit.org/show_bug.cgi?id=167195
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkProcessh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkProcess.h (210920 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkProcess.h        2017-01-19 08:59:42 UTC (rev 210920)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkProcess.h        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -50,6 +50,7 @@
</span><span class="cx"> class SecurityOrigin;
</span><span class="cx"> class SessionID;
</span><span class="cx"> struct SecurityOriginData;
</span><ins>+struct SoupNetworkProxySettings;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> namespace WebKit {
</span><span class="lines">@@ -192,6 +193,7 @@
</span><span class="cx"> #if USE(SOUP)
</span><span class="cx"> void setIgnoreTLSErrors(bool);
</span><span class="cx"> void userPreferredLanguagesChanged(const Vector<String>&);
</span><ins>+ void setNetworkProxySettings(const WebCore::SoupNetworkProxySettings&);
</ins><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> // Platform Helpers
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkProcessmessagesin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkProcess.messages.in (210920 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkProcess.messages.in        2017-01-19 08:59:42 UTC (rev 210920)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkProcess.messages.in        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> #if USE(SOUP)
</span><span class="cx"> SetIgnoreTLSErrors(bool ignoreTLSErrors)
</span><span class="cx"> UserPreferredLanguagesChanged(Vector<String> languages)
</span><ins>+ SetNetworkProxySettings(struct WebCore::SoupNetworkProxySettings settings)
</ins><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> ClearCachedCredentials()
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkProcessCreationParameterscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkProcessCreationParameters.cpp (210920 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkProcessCreationParameters.cpp        2017-01-19 08:59:42 UTC (rev 210920)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkProcessCreationParameters.cpp        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -32,6 +32,10 @@
</span><span class="cx"> #include "ArgumentCodersCF.h"
</span><span class="cx"> #endif
</span><span class="cx">
</span><ins>+#if USE(SOUP)
+#include "WebCoreArgumentCoders.h"
+#endif
+
</ins><span class="cx"> namespace WebKit {
</span><span class="cx">
</span><span class="cx"> NetworkProcessCreationParameters::NetworkProcessCreationParameters()
</span><span class="lines">@@ -89,6 +93,7 @@
</span><span class="cx"> encoder.encodeEnum(cookieAcceptPolicy);
</span><span class="cx"> encoder << ignoreTLSErrors;
</span><span class="cx"> encoder << languages;
</span><ins>+ encoder << proxySettings;
</ins><span class="cx"> #endif
</span><span class="cx"> #if OS(LINUX)
</span><span class="cx"> encoder << memoryPressureMonitorHandle;
</span><span class="lines">@@ -185,6 +190,8 @@
</span><span class="cx"> return false;
</span><span class="cx"> if (!decoder.decode(result.languages))
</span><span class="cx"> return false;
</span><ins>+ if (!decoder.decode(result.proxySettings))
+ return false;
</ins><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> #if OS(LINUX)
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkProcessCreationParametersh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkProcessCreationParameters.h (210920 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkProcessCreationParameters.h        2017-01-19 08:59:42 UTC (rev 210920)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkProcessCreationParameters.h        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx">
</span><span class="cx"> #if USE(SOUP)
</span><span class="cx"> #include "HTTPCookieAcceptPolicy.h"
</span><ins>+#include <WebCore/SoupNetworkProxySettings.h>
</ins><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> namespace IPC {
</span><span class="lines">@@ -101,6 +102,7 @@
</span><span class="cx"> HTTPCookieAcceptPolicy cookieAcceptPolicy;
</span><span class="cx"> bool ignoreTLSErrors;
</span><span class="cx"> Vector<String> languages;
</span><ins>+ WebCore::SoupNetworkProxySettings proxySettings;
</ins><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> #if OS(LINUX)
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesseflNetworkProcessMainEflcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/efl/NetworkProcessMainEfl.cpp (210920 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/efl/NetworkProcessMainEfl.cpp        2017-01-19 08:59:42 UTC (rev 210920)
+++ trunk/Source/WebKit2/NetworkProcess/efl/NetworkProcessMainEfl.cpp        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -30,7 +30,6 @@
</span><span class="cx"> #include "ChildProcessMain.h"
</span><span class="cx"> #include "NetworkProcess.h"
</span><span class="cx"> #include <Ecore.h>
</span><del>-#include <WebCore/NetworkStorageSession.h>
</del><span class="cx"> #include <WebCore/SoupNetworkSession.h>
</span><span class="cx"> #include <libsoup/soup.h>
</span><span class="cx">
</span><span class="lines">@@ -48,7 +47,7 @@
</span><span class="cx"> if (!ecore_main_loop_glib_integrate())
</span><span class="cx"> return false;
</span><span class="cx">
</span><del>- NetworkStorageSession::defaultStorageSession().getOrCreateSoupNetworkSession().setupHTTPProxyFromEnvironment();
</del><ins>+ SoupNetworkSession::setProxySettingsFromEnvironment();
</ins><span class="cx"> return true;
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesssoupNetworkProcessSoupcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/soup/NetworkProcessSoup.cpp (210920 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/soup/NetworkProcessSoup.cpp        2017-01-19 08:59:42 UTC (rev 210920)
+++ trunk/Source/WebKit2/NetworkProcess/soup/NetworkProcessSoup.cpp        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -104,6 +104,9 @@
</span><span class="cx">
</span><span class="cx"> void NetworkProcess::platformInitializeNetworkProcess(const NetworkProcessCreationParameters& parameters)
</span><span class="cx"> {
</span><ins>+ if (parameters.proxySettings.mode != SoupNetworkProxySettings::Mode::Default)
+ setNetworkProxySettings(parameters.proxySettings);
+
</ins><span class="cx"> ASSERT(!parameters.diskCacheDirectory.isEmpty());
</span><span class="cx"> m_diskCacheDirectory = parameters.diskCacheDirectory;
</span><span class="cx">
</span><span class="lines">@@ -161,4 +164,13 @@
</span><span class="cx"> notImplemented();
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void NetworkProcess::setNetworkProxySettings(const SoupNetworkProxySettings& settings)
+{
+ SoupNetworkSession::setProxySettings(settings);
+ NetworkStorageSession::forEach([](const NetworkStorageSession& session) {
+ if (auto* soupSession = session.soupNetworkSession())
+ soupSession->setupProxy();
+ });
+}
+
</ins><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2PlatformGTKcmake"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/PlatformGTK.cmake (210920 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/PlatformGTK.cmake        2017-01-19 08:59:42 UTC (rev 210920)
+++ trunk/Source/WebKit2/PlatformGTK.cmake        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -187,6 +187,9 @@
</span><span class="cx"> UIProcess/API/gtk/WebKitNavigationPolicyDecision.cpp
</span><span class="cx"> UIProcess/API/gtk/WebKitNavigationPolicyDecision.h
</span><span class="cx"> UIProcess/API/gtk/WebKitNavigationPolicyDecisionPrivate.h
</span><ins>+ UIProcess/API/gtk/WebKitNetworkProxySettings.cpp
+ UIProcess/API/gtk/WebKitNetworkProxySettings.h
+ UIProcess/API/gtk/WebKitNetworkProxySettingsPrivate.h
</ins><span class="cx"> UIProcess/API/gtk/WebKitNotification.cpp
</span><span class="cx"> UIProcess/API/gtk/WebKitNotification.h
</span><span class="cx"> UIProcess/API/gtk/WebKitNotificationPermissionRequest.cpp
</span><span class="lines">@@ -527,6 +530,7 @@
</span><span class="cx"> ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitMimeInfo.h
</span><span class="cx"> ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitNavigationAction.h
</span><span class="cx"> ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitNavigationPolicyDecision.h
</span><ins>+ ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitNetworkProxySettings.h
</ins><span class="cx"> ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitNotificationPermissionRequest.h
</span><span class="cx"> ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitNotification.h
</span><span class="cx"> ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitPermissionRequest.h
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedWebCoreArgumentCodersh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.h (210920 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.h        2017-01-19 08:59:42 UTC (rev 210920)
+++ trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.h        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -120,6 +120,12 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx">
</span><ins>+#if USE(SOUP)
+namespace WebCore {
+struct SoupNetworkProxySettings;
+}
+#endif
+
</ins><span class="cx"> #if ENABLE(CONTENT_FILTERING)
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> class ContentFilterUnblockHandler;
</span><span class="lines">@@ -385,6 +391,13 @@
</span><span class="cx"> };
</span><span class="cx"> #endif
</span><span class="cx">
</span><ins>+#if USE(SOUP)
+template<> struct ArgumentCoder<WebCore::SoupNetworkProxySettings> {
+ static void encode(Encoder&, const WebCore::SoupNetworkProxySettings&);
+ static bool decode(Decoder&, WebCore::SoupNetworkProxySettings&);
+};
+#endif
+
</ins><span class="cx"> template<> struct ArgumentCoder<WebCore::CompositionUnderline> {
</span><span class="cx"> static void encode(Encoder&, const WebCore::CompositionUnderline&);
</span><span class="cx"> static bool decode(Decoder&, WebCore::CompositionUnderline&);
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedWebProcessCreationParameterscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/WebProcessCreationParameters.cpp (210920 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/WebProcessCreationParameters.cpp        2017-01-19 08:59:42 UTC (rev 210920)
+++ trunk/Source/WebKit2/Shared/WebProcessCreationParameters.cpp        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -150,6 +150,10 @@
</span><span class="cx"> #if PLATFORM(WAYLAND)
</span><span class="cx"> encoder << waylandCompositorDisplayName;
</span><span class="cx"> #endif
</span><ins>+
+#if USE(SOUP)
+ encoder << proxySettings;
+#endif
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool WebProcessCreationParameters::decode(IPC::Decoder& decoder, WebProcessCreationParameters& parameters)
</span><span class="lines">@@ -317,6 +321,11 @@
</span><span class="cx"> return false;
</span><span class="cx"> #endif
</span><span class="cx">
</span><ins>+#if USE(SOUP)
+ if (!decoder.decode(parameters.proxySettings))
+ return false;
+#endif
+
</ins><span class="cx"> return true;
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedWebProcessCreationParametersh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/WebProcessCreationParameters.h (210920 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/WebProcessCreationParameters.h        2017-01-19 08:59:42 UTC (rev 210920)
+++ trunk/Source/WebKit2/Shared/WebProcessCreationParameters.h        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -42,6 +42,7 @@
</span><span class="cx">
</span><span class="cx"> #if USE(SOUP)
</span><span class="cx"> #include "HTTPCookieAcceptPolicy.h"
</span><ins>+#include <WebCore/SoupNetworkProxySettings.h>
</ins><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> namespace API {
</span><span class="lines">@@ -174,6 +175,10 @@
</span><span class="cx"> #if PLATFORM(WAYLAND)
</span><span class="cx"> String waylandCompositorDisplayName;
</span><span class="cx"> #endif
</span><ins>+
+#if USE(SOUP)
+ WebCore::SoupNetworkProxySettings proxySettings;
+#endif
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedsoupWebCoreArgumentCodersSoupcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/soup/WebCoreArgumentCodersSoup.cpp (210920 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/soup/WebCoreArgumentCodersSoup.cpp        2017-01-19 08:59:42 UTC (rev 210920)
+++ trunk/Source/WebKit2/Shared/soup/WebCoreArgumentCodersSoup.cpp        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx"> #include <WebCore/ResourceError.h>
</span><span class="cx"> #include <WebCore/ResourceRequest.h>
</span><span class="cx"> #include <WebCore/ResourceResponse.h>
</span><ins>+#include <WebCore/SoupNetworkProxySettings.h>
</ins><span class="cx"> #include <wtf/text/CString.h>
</span><span class="cx">
</span><span class="cx"> using namespace WebCore;
</span><span class="lines">@@ -151,6 +152,55 @@
</span><span class="cx"> return true;
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void ArgumentCoder<SoupNetworkProxySettings>::encode(Encoder& encoder, const SoupNetworkProxySettings& settings)
+{
+ ASSERT(!settings.isEmpty());
+ encoder.encodeEnum(settings.mode);
+ if (settings.mode != SoupNetworkProxySettings::Mode::Custom)
+ return;
+
+ encoder << settings.defaultProxyURL;
+ uint32_t ignoreHostsCount = settings.ignoreHosts ? g_strv_length(settings.ignoreHosts.get()) : 0;
+ encoder << ignoreHostsCount;
+ if (ignoreHostsCount) {
+ for (uint32_t i = 0; settings.ignoreHosts.get()[i]; ++i)
+ encoder << CString(settings.ignoreHosts.get()[i]);
+ }
+ encoder << settings.proxyMap;
+}
+
+bool ArgumentCoder<SoupNetworkProxySettings>::decode(Decoder& decoder, SoupNetworkProxySettings& settings)
+{
+ if (!decoder.decodeEnum(settings.mode))
+ return false;
+
+ if (settings.mode != SoupNetworkProxySettings::Mode::Custom)
+ return true;
+
+ if (!decoder.decode(settings.defaultProxyURL))
+ return false;
+
+ uint32_t ignoreHostsCount;
+ if (!decoder.decode(ignoreHostsCount))
+ return false;
+
+ if (ignoreHostsCount) {
+ settings.ignoreHosts.reset(g_new0(char*, ignoreHostsCount + 1));
+ for (uint32_t i = 0; i < ignoreHostsCount; ++i) {
+ CString host;
+ if (!decoder.decode(host))
+ return false;
+
+ settings.ignoreHosts.get()[i] = g_strdup(host.data());
+ }
+ }
+
+ if (!decoder.decode(settings.proxyMap))
+ return false;
+
+ return !settings.isEmpty();
+}
+
</ins><span class="cx"> void ArgumentCoder<ProtectionSpace>::encodePlatformData(Encoder&, const ProtectionSpace&)
</span><span class="cx"> {
</span><span class="cx"> ASSERT_NOT_REACHED();
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitNetworkProxySettingscpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitNetworkProxySettings.cpp (0 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitNetworkProxySettings.cpp         (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitNetworkProxySettings.cpp        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -0,0 +1,170 @@
</span><ins>+/*
+ * Copyright (C) 2017 Igalia S.L.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+#include "WebKitNetworkProxySettings.h"
+
+#include "WebKitNetworkProxySettingsPrivate.h"
+#include <WebCore/SoupNetworkProxySettings.h>
+#include <wtf/text/WTFString.h>
+
+using namespace WebKit;
+using namespace WebCore;
+
+/**
+ * SECTION: WebKitNetworkProxySettings
+ * @Short_description: Network Proxy Settings
+ * @Title: WebKitNetworkProxySettings
+ * @See_also: #WebKitWebContext
+ *
+ * WebKitNetworkProxySettings can be used to provide a custom proxy configuration
+ * to a #WebKitWebContext. You need to call webkit_web_context_set_network_proxy_settings()
+ * with %WEBKIT_NETWORK_PROXY_MODE_CUSTOM and a WebKitNetworkProxySettings.
+ *
+ * Since: 2.16
+ */
+struct _WebKitNetworkProxySettings {
+ _WebKitNetworkProxySettings()
+ : settings(SoupNetworkProxySettings::Mode::Custom)
+ {
+ }
+
+ explicit _WebKitNetworkProxySettings(const SoupNetworkProxySettings& otherSettings)
+ : settings(otherSettings)
+ {
+ }
+
+ SoupNetworkProxySettings settings;
+};
+
+G_DEFINE_BOXED_TYPE(WebKitNetworkProxySettings, webkit_network_proxy_settings, webkit_network_proxy_settings_copy, webkit_network_proxy_settings_free)
+
+const SoupNetworkProxySettings& webkitNetworkProxySettingsGetNetworkProxySettings(WebKitNetworkProxySettings* proxySettings)
+{
+ ASSERT(proxySettings);
+ return proxySettings->settings;
+}
+
+/**
+ * webkit_network_proxy_settings_new:
+ * @default_proxy_uri: (allow-none): the default proxy URI to use, or %NULL.
+ * @ignore_hosts: (allow-none): an optional list of hosts/IP addresses to not use a proxy for.
+ *
+ * Create a new #WebKitNetworkProxySettings with the given @default_proxy_uri and @ignore_hosts.
+ *
+ * The default proxy URI will be used for any URI that doesn't match @ignore_hosts, and doesn't match any
+ * of the schemes added with webkit_network_proxy_settings_add_proxy_for_scheme().
+ * If @default_proxy_uri starts with "socks://", it will be treated as referring to all three of the
+ * socks5, socks4a, and socks4 proxy types.
+ *
+ * @ignore_hosts is a list of hostnames and IP addresses that the resolver should allow direct connections to.
+ * Entries can be in one of 4 formats:
+ * <itemizedlist>
+ * <listitem><para>
+ * A hostname, such as "example.com", ".example.com", or "*.example.com", any of which match "example.com" or
+ * any subdomain of it.
+ * </para></listitem>
+ * <listitem><para>
+ * An IPv4 or IPv6 address, such as "192.168.1.1", which matches only that address.
+ * </para></listitem>
+ * <listitem><para>
+ * A hostname or IP address followed by a port, such as "example.com:80", which matches whatever the hostname or IP
+ * address would match, but only for URLs with the (explicitly) indicated port. In the case of an IPv6 address, the address
+ * part must appear in brackets: "[::1]:443"
+ * </para></listitem>
+ * <listitem><para>
+ * An IP address range, given by a base address and prefix length, such as "fe80::/10", which matches any address in that range.
+ * </para></listitem>
+ * </itemizedlist>
+ *
+ * Note that when dealing with Unicode hostnames, the matching is done against the ASCII form of the name.
+ * Also note that hostname exclusions apply only to connections made to hosts identified by name, and IP address exclusions apply only
+ * to connections made to hosts identified by address. That is, if example.com has an address of 192.168.1.1, and @ignore_hosts
+ * contains only "192.168.1.1", then a connection to "example.com" will use the proxy, and a connection to 192.168.1.1" will not.
+ *
+ * Returns: (transfer full): A new #WebKitNetworkProxySettings.
+ *
+ * Since: 2.16
+ */
+WebKitNetworkProxySettings* webkit_network_proxy_settings_new(const char* defaultProxyURI, const char* const* ignoreHosts)
+{
+ WebKitNetworkProxySettings* proxySettings = static_cast<WebKitNetworkProxySettings*>(fastMalloc(sizeof(WebKitNetworkProxySettings)));
+ new (proxySettings) WebKitNetworkProxySettings;
+ if (defaultProxyURI)
+ proxySettings->settings.defaultProxyURL = defaultProxyURI;
+ if (ignoreHosts)
+ proxySettings->settings.ignoreHosts.reset(g_strdupv(const_cast<char**>(ignoreHosts)));
+ return proxySettings;
+}
+
+/**
+ * webkit_network_proxy_settings_copy:
+ * @proxy_settings: a #WebKitNetworkProxySettings
+ *
+ * Make a copy of the #WebKitNetworkProxySettings.
+ *
+ * Returns: (transfer full): A copy of passed in #WebKitNetworkProxySettings
+ *
+ * Since: 2.16
+ */
+WebKitNetworkProxySettings* webkit_network_proxy_settings_copy(WebKitNetworkProxySettings* proxySettings)
+{
+ g_return_val_if_fail(proxySettings, nullptr);
+
+ WebKitNetworkProxySettings* copy = static_cast<WebKitNetworkProxySettings*>(fastMalloc(sizeof(WebKitNetworkProxySettings)));
+ new (copy) WebKitNetworkProxySettings(webkitNetworkProxySettingsGetNetworkProxySettings(proxySettings));
+ return copy;
+}
+
+/**
+ * webkit_network_proxy_settings_free:
+ * @proxy_settings: A #WebKitNetworkProxySettings
+ *
+ * Free the #WebKitNetworkProxySettings.
+ *
+ * Since: 2.16
+ */
+void webkit_network_proxy_settings_free(WebKitNetworkProxySettings* proxySettings)
+{
+ g_return_if_fail(proxySettings);
+
+ proxySettings->~WebKitNetworkProxySettings();
+ fastFree(proxySettings);
+}
+
+/**
+ * webkit_network_proxy_settings_add_proxy_for_scheme:
+ * @proxy_settings: a #WebKitNetworkProxySettings
+ * @scheme: the URI scheme to add a proxy for
+ * @proxy_uri: the proxy URI to use for @uri_scheme
+ *
+ * Adds a URI-scheme-specific proxy. URIs whose scheme matches @uri_scheme will be proxied via @proxy_uri.
+ * As with the default proxy URI, if @proxy_uri starts with "socks://", it will be treated as referring to
+ * all three of the socks5, socks4a, and socks4 proxy types.
+ *
+ * Since: 2.16
+ */
+void webkit_network_proxy_settings_add_proxy_for_scheme(WebKitNetworkProxySettings* proxySettings, const char* scheme, const char* proxyURI)
+{
+ g_return_if_fail(proxySettings);
+ g_return_if_fail(scheme);
+ g_return_if_fail(proxyURI);
+
+ proxySettings->settings.proxyMap.add(scheme, proxyURI);
+}
</ins></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitNetworkProxySettingsh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitNetworkProxySettings.h (0 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitNetworkProxySettings.h         (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitNetworkProxySettings.h        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -0,0 +1,56 @@
</span><ins>+/*
+ * Copyright (C) 2017 Igalia S.L.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#if !defined(__WEBKIT2_H_INSIDE__) && !defined(WEBKIT2_COMPILATION)
+#error "Only <webkit2/webkit2.h> can be included directly."
+#endif
+
+#ifndef WebKitNetworkProxySettings_h
+#define WebKitNetworkProxySettings_h
+
+#include <glib-object.h>
+#include <webkit2/WebKitDefines.h>
+
+G_BEGIN_DECLS
+
+#define WEBKIT_TYPE_NETWORK_NETWORK_PROXY_SETTINGS (webkit_network_proxy_settings_get_type())
+
+typedef struct _WebKitNetworkProxySettings WebKitNetworkProxySettings;
+
+WEBKIT_API GType
+webkit_network_proxy_settings_get_type (void);
+
+WEBKIT_API WebKitNetworkProxySettings *
+webkit_network_proxy_settings_new (const gchar *default_proxy_uri,
+ const gchar* const *ignore_hosts);
+
+WEBKIT_API WebKitNetworkProxySettings *
+webkit_network_proxy_settings_copy (WebKitNetworkProxySettings *proxy_settings);
+
+WEBKIT_API void
+webkit_network_proxy_settings_free (WebKitNetworkProxySettings *proxy_settings);
+
+WEBKIT_API void
+webkit_network_proxy_settings_add_proxy_for_scheme (WebKitNetworkProxySettings *proxy_settings,
+ const gchar *scheme,
+ const gchar *proxy_uri);
+
+G_END_DECLS
+
+#endif /* WebKitNetworkProxySettings_h */
</ins></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitNetworkProxySettingsPrivateh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitNetworkProxySettingsPrivate.h (0 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitNetworkProxySettingsPrivate.h         (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitNetworkProxySettingsPrivate.h        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -0,0 +1,26 @@
</span><ins>+/*
+ * Copyright (C) 2017 Igalia S.L.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#pragma once
+
+#include "WebKitNetworkProxySettings.h"
+#include "WebKitPrivate.h"
+#include <WebCore/SoupNetworkProxySettings.h>
+
+const WebCore::SoupNetworkProxySettings& webkitNetworkProxySettingsGetNetworkProxySettings(WebKitNetworkProxySettings*);
</ins></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitWebContextcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.cpp (210920 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.cpp        2017-01-19 08:59:42 UTC (rev 210920)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.cpp        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -37,6 +37,7 @@
</span><span class="cx"> #include "WebKitFaviconDatabasePrivate.h"
</span><span class="cx"> #include "WebKitGeolocationProvider.h"
</span><span class="cx"> #include "WebKitInjectedBundleClient.h"
</span><ins>+#include "WebKitNetworkProxySettingsPrivate.h"
</ins><span class="cx"> #include "WebKitNotificationProvider.h"
</span><span class="cx"> #include "WebKitPluginPrivate.h"
</span><span class="cx"> #include "WebKitPrivate.h"
</span><span class="lines">@@ -575,6 +576,47 @@
</span><span class="cx"> websiteDataStore.removeData(websiteDataTypes, std::chrono::system_clock::time_point::min(), [] { });
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+/**
+ * webkit_web_context_set_network_proxy_settings:
+ * @context: a #WebKitWebContext
+ * @proxy_mode: a #WebKitNetworkProxyMode
+ * @proxy_settings: (allow-none): a #WebKitNetworkProxySettings, or %NULL
+ *
+ * Set the network proxy settings to be used by connections started in @context.
+ * By default %WEBKIT_NETWORK_PROXY_MODE_DEFAULT is used, which means that the
+ * system settings will be used (g_proxy_resolver_get_default()).
+ * If you want to override the system default settings, you can either use
+ * %WEBKIT_NETWORK_PROXY_MODE_NO_PROXY to make sure no proxies are used at all,
+ * or %WEBKIT_NETWORK_PROXY_MODE_CUSTOM to provide your own proxy settings.
+ * When @proxy_mode is %WEBKIT_NETWORK_PROXY_MODE_CUSTOM @proxy_settings must be
+ * a valid #WebKitNetworkProxySettings; otherwise, @proxy_settings must be %NULL.
+ *
+ * Since: 2.16
+ */
+void webkit_web_context_set_network_proxy_settings(WebKitWebContext* context, WebKitNetworkProxyMode proxyMode, WebKitNetworkProxySettings* proxySettings)
+{
+ g_return_if_fail(WEBKIT_IS_WEB_CONTEXT(context));
+ g_return_if_fail((proxyMode != WEBKIT_NETWORK_PROXY_MODE_CUSTOM && !proxySettings) || (proxyMode == WEBKIT_NETWORK_PROXY_MODE_CUSTOM && proxySettings));
+
+ WebKitWebContextPrivate* priv = context->priv;
+ switch (proxyMode) {
+ case WEBKIT_NETWORK_PROXY_MODE_DEFAULT:
+ priv->processPool->setNetworkProxySettings({ });
+ break;
+ case WEBKIT_NETWORK_PROXY_MODE_NO_PROXY:
+ priv->processPool->setNetworkProxySettings(WebCore::SoupNetworkProxySettings(WebCore::SoupNetworkProxySettings::Mode::NoProxy));
+ break;
+ case WEBKIT_NETWORK_PROXY_MODE_CUSTOM:
+ const auto& settings = webkitNetworkProxySettingsGetNetworkProxySettings(proxySettings);
+ if (settings.isEmpty()) {
+ g_warning("Invalid attempt to set custom network proxy settings with an empty WebKitNetworkProxySettings. Use "
+ "WEBKIT_NETWORK_PROXY_MODE_NO_PROXY to not use any proxy or WEBKIT_NETWORK_PROXY_MODE_DEFAULT to use the default system settings");
+ } else
+ priv->processPool->setNetworkProxySettings(settings);
+ break;
+ }
+}
+
</ins><span class="cx"> typedef HashMap<DownloadProxy*, GRefPtr<WebKitDownload> > DownloadsMap;
</span><span class="cx">
</span><span class="cx"> static DownloadsMap& downloadsMap()
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitWebContexth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.h (210920 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.h        2017-01-19 08:59:42 UTC (rev 210920)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.h        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> #include <webkit2/WebKitDefines.h>
</span><span class="cx"> #include <webkit2/WebKitDownload.h>
</span><span class="cx"> #include <webkit2/WebKitFaviconDatabase.h>
</span><ins>+#include <webkit2/WebKitNetworkProxySettings.h>
</ins><span class="cx"> #include <webkit2/WebKitSecurityManager.h>
</span><span class="cx"> #include <webkit2/WebKitURISchemeRequest.h>
</span><span class="cx"> #include <webkit2/WebKitWebsiteDataManager.h>
</span><span class="lines">@@ -104,6 +105,22 @@
</span><span class="cx"> } WebKitTLSErrorsPolicy;
</span><span class="cx">
</span><span class="cx"> /**
</span><ins>+ * WebKitNetworkProxyMode:
+ * @WEBKIT_NETWORK_PROXY_MODE_DEFAULT: Use the default proxy of the system.
+ * @WEBKIT_NETWORK_PROXY_MODE_NO_PROXY: Do not use any proxy.
+ * @WEBKIT_NETWORK_PROXY_MODE_CUSTOM: Use custom proxy settings.
+ *
+ * Enum values used to set the network proxy mode.
+ *
+ * Since: 2.16
+ */
+typedef enum {
+ WEBKIT_NETWORK_PROXY_MODE_DEFAULT,
+ WEBKIT_NETWORK_PROXY_MODE_NO_PROXY,
+ WEBKIT_NETWORK_PROXY_MODE_CUSTOM
+} WebKitNetworkProxyMode;
+
+/**
</ins><span class="cx"> * WebKitURISchemeRequestCallback:
</span><span class="cx"> * @request: the #WebKitURISchemeRequest
</span><span class="cx"> * @user_data: user data passed to the callback
</span><span class="lines">@@ -171,6 +188,11 @@
</span><span class="cx"> WEBKIT_API void
</span><span class="cx"> webkit_web_context_clear_cache (WebKitWebContext *context);
</span><span class="cx">
</span><ins>+WEBKIT_API void
+webkit_web_context_set_network_proxy_settings (WebKitWebContext *context,
+ WebKitNetworkProxyMode proxy_mode,
+ WebKitNetworkProxySettings *proxy_settings);
+
</ins><span class="cx"> WEBKIT_API WebKitDownload *
</span><span class="cx"> webkit_web_context_download_uri (WebKitWebContext *context,
</span><span class="cx"> const gchar *uri);
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkdocswebkit2gtk40sectionstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt (210920 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt        2017-01-19 08:59:42 UTC (rev 210920)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -27,6 +27,7 @@
</span><span class="cx"> WebKitCacheModel
</span><span class="cx"> WebKitProcessModel
</span><span class="cx"> WebKitTLSErrorsPolicy
</span><ins>+WebKitNetworkProxyMode
</ins><span class="cx"> webkit_web_context_get_default
</span><span class="cx"> webkit_web_context_new
</span><span class="cx"> webkit_web_context_new_with_website_data_manager
</span><span class="lines">@@ -36,6 +37,7 @@
</span><span class="cx"> webkit_web_context_get_web_process_count_limit
</span><span class="cx"> webkit_web_context_set_web_process_count_limit
</span><span class="cx"> webkit_web_context_clear_cache
</span><ins>+webkit_web_context_set_network_proxy_settings
</ins><span class="cx"> webkit_web_context_download_uri
</span><span class="cx"> webkit_web_context_get_cookie_manager
</span><span class="cx"> webkit_web_context_get_favicon_database
</span><span class="lines">@@ -1258,6 +1260,21 @@
</span><span class="cx"> </SECTION>
</span><span class="cx">
</span><span class="cx"> <SECTION>
</span><ins>+<FILE>WebKitNetworkProxySettings</FILE>
+WebKitNetworkProxySettings
+webkit_network_proxy_settings_new
+webkit_network_proxy_settings_copy
+webkit_network_proxy_settings_free
+webkit_network_proxy_settings_add_proxy_for_scheme
+
+<SUBSECTION Private>
+webkit_network_proxy_settings_get_type
+
+<SUBSECTION Standard>
+WEBKIT_TYPE_NETWORK_NETWORK_PROXY_SETTINGS
+</SECTION>
+
+<SECTION>
</ins><span class="cx"> <FILE>WebKitWebExtension</FILE>
</span><span class="cx"> WebKitWebExtension
</span><span class="cx"> WebKitWebExtensionInitializeFunction
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkdocswebkit2gtkdocssgml"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-docs.sgml (210920 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-docs.sgml        2017-01-19 08:59:42 UTC (rev 210920)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-docs.sgml        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -53,6 +53,7 @@
</span><span class="cx"> <xi:include href="xml/WebKitNotificationPermissionRequest.xml"/>
</span><span class="cx"> <xi:include href="xml/WebKitSecurityOrigin.xml"/>
</span><span class="cx"> <xi:include href="xml/WebKitWebsiteDataManager.xml"/>
</span><ins>+ <xi:include href="xml/WebKitNetworkProxySettings.xml"/>
</ins><span class="cx"> </chapter>
</span><span class="cx">
</span><span class="cx"> <chapter>
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkwebkit2h"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/webkit2.h (210920 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/webkit2.h        2017-01-19 08:59:42 UTC (rev 210920)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/webkit2.h        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -53,6 +53,7 @@
</span><span class="cx"> #include <webkit2/WebKitMimeInfo.h>
</span><span class="cx"> #include <webkit2/WebKitNavigationAction.h>
</span><span class="cx"> #include <webkit2/WebKitNavigationPolicyDecision.h>
</span><ins>+#include <webkit2/WebKitNetworkProxySettings.h>
</ins><span class="cx"> #include <webkit2/WebKitNotification.h>
</span><span class="cx"> #include <webkit2/WebKitNotificationPermissionRequest.h>
</span><span class="cx"> #include <webkit2/WebKitPermissionRequest.h>
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebProcessPoolh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebProcessPool.h (210920 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebProcessPool.h        2017-01-19 08:59:42 UTC (rev 210920)
+++ trunk/Source/WebKit2/UIProcess/WebProcessPool.h        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -62,6 +62,10 @@
</span><span class="cx"> #include "WebMediaSessionFocusManager.h"
</span><span class="cx"> #endif
</span><span class="cx">
</span><ins>+#if USE(SOUP)
+#include <WebCore/SoupNetworkProxySettings.h>
+#endif
+
</ins><span class="cx"> #if PLATFORM(COCOA)
</span><span class="cx"> OBJC_CLASS NSMutableDictionary;
</span><span class="cx"> OBJC_CLASS NSObject;
</span><span class="lines">@@ -221,6 +225,7 @@
</span><span class="cx">
</span><span class="cx"> #if USE(SOUP)
</span><span class="cx"> void setInitialHTTPCookieAcceptPolicy(HTTPCookieAcceptPolicy policy) { m_initialHTTPCookieAcceptPolicy = policy; }
</span><ins>+ void setNetworkProxySettings(const WebCore::SoupNetworkProxySettings&);
</ins><span class="cx"> #endif
</span><span class="cx"> void setEnhancedAccessibility(bool);
</span><span class="cx">
</span><span class="lines">@@ -516,6 +521,7 @@
</span><span class="cx">
</span><span class="cx"> #if USE(SOUP)
</span><span class="cx"> HTTPCookieAcceptPolicy m_initialHTTPCookieAcceptPolicy { HTTPCookieAcceptPolicyOnlyFromMainDocumentDomain };
</span><ins>+ WebCore::SoupNetworkProxySettings m_networkProxySettings;
</ins><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> #if PLATFORM(MAC)
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcesseflWebProcessPoolEflcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/efl/WebProcessPoolEfl.cpp (210920 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/efl/WebProcessPoolEfl.cpp        2017-01-19 08:59:42 UTC (rev 210920)
+++ trunk/Source/WebKit2/UIProcess/efl/WebProcessPoolEfl.cpp        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -93,6 +93,7 @@
</span><span class="cx"> void WebProcessPool::platformInitializeWebProcess(WebProcessCreationParameters& parameters)
</span><span class="cx"> {
</span><span class="cx"> initializeInspectorServer();
</span><ins>+ parameters.proxySettings = m_networkProxySettings;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void WebProcessPool::platformInvalidateContext()
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessgtkWebProcessPoolGtkcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/gtk/WebProcessPoolGtk.cpp (210920 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/gtk/WebProcessPoolGtk.cpp        2017-01-19 08:59:42 UTC (rev 210920)
+++ trunk/Source/WebKit2/UIProcess/gtk/WebProcessPoolGtk.cpp        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -93,6 +93,7 @@
</span><span class="cx"> {
</span><span class="cx"> initInspectorServer();
</span><span class="cx"> parameters.memoryCacheDisabled = m_memoryCacheDisabled || cacheModel() == CacheModelDocumentViewer;
</span><ins>+ parameters.proxySettings = m_networkProxySettings;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void WebProcessPool::platformInvalidateContext()
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcesssoupWebProcessPoolSoupcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/soup/WebProcessPoolSoup.cpp (210920 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/soup/WebProcessPoolSoup.cpp        2017-01-19 08:59:42 UTC (rev 210920)
+++ trunk/Source/WebKit2/UIProcess/soup/WebProcessPoolSoup.cpp        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -30,6 +30,8 @@
</span><span class="cx"> #include "NetworkProcessCreationParameters.h"
</span><span class="cx"> #include "NetworkProcessMessages.h"
</span><span class="cx"> #include "WebCookieManagerProxy.h"
</span><ins>+#include "WebCoreArgumentCoders.h"
+#include "WebProcessMessages.h"
</ins><span class="cx"> #include <WebCore/Language.h>
</span><span class="cx">
</span><span class="cx"> namespace WebKit {
</span><span class="lines">@@ -43,6 +45,7 @@
</span><span class="cx"> for (const auto& scheme : m_urlSchemesRegisteredForCustomProtocols)
</span><span class="cx"> parameters.urlSchemesRegisteredForCustomProtocols.append(scheme);
</span><span class="cx"> parameters.shouldEnableNetworkCacheEfficacyLogging = false;
</span><ins>+ parameters.proxySettings = m_networkProxySettings;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void WebProcessPool::setIgnoreTLSErrors(bool ignoreTLSErrors)
</span><span class="lines">@@ -60,4 +63,12 @@
</span><span class="cx"> m_customProtocolManagerClient = WTFMove(customProtocolManagerClient);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void WebProcessPool::setNetworkProxySettings(const WebCore::SoupNetworkProxySettings& settings)
+{
+ m_networkProxySettings = settings;
+ sendToAllProcesses(Messages::WebProcess::SetNetworkProxySettings(m_networkProxySettings));
+ if (m_networkProcess)
+ m_networkProcess->send(Messages::NetworkProcess::SetNetworkProxySettings(m_networkProxySettings), 0);
</ins><span class="cx"> }
</span><ins>+
+}
</ins></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebProcessh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebProcess.h (210920 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebProcess.h        2017-01-19 08:59:42 UTC (rev 210920)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.h        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -67,6 +67,7 @@
</span><span class="cx"> class UserGestureToken;
</span><span class="cx"> struct PluginInfo;
</span><span class="cx"> struct SecurityOriginData;
</span><ins>+struct SoupNetworkProxySettings;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> namespace WebKit {
</span><span class="lines">@@ -285,6 +286,10 @@
</span><span class="cx"> void gamepadDisconnected(unsigned index);
</span><span class="cx"> #endif
</span><span class="cx">
</span><ins>+#if USE(SOUP)
+ void setNetworkProxySettings(const WebCore::SoupNetworkProxySettings&);
+#endif
+
</ins><span class="cx"> void releasePageCache();
</span><span class="cx">
</span><span class="cx"> void fetchWebsiteData(WebCore::SessionID, OptionSet<WebsiteDataType>, WebsiteData&);
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebProcessmessagesin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebProcess.messages.in (210920 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebProcess.messages.in        2017-01-19 08:59:42 UTC (rev 210920)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.messages.in        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -108,4 +108,8 @@
</span><span class="cx"> GamepadConnected(WebKit::GamepadData gamepadData)
</span><span class="cx"> GamepadDisconnected(unsigned index)
</span><span class="cx"> #endif
</span><ins>+
+#if USE(SOUP)
+ SetNetworkProxySettings(struct WebCore::SoupNetworkProxySettings settings)
+#endif
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcesseflWebProcessMainEflcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/efl/WebProcessMainEfl.cpp (210920 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/efl/WebProcessMainEfl.cpp        2017-01-19 08:59:42 UTC (rev 210920)
+++ trunk/Source/WebKit2/WebProcess/efl/WebProcessMainEfl.cpp        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -32,7 +32,6 @@
</span><span class="cx"> #include <Ecore_Evas.h>
</span><span class="cx"> #include <Edje.h>
</span><span class="cx"> #include <Efreet.h>
</span><del>-#include <WebCore/NetworkStorageSession.h>
</del><span class="cx"> #include <WebCore/SoupNetworkSession.h>
</span><span class="cx"> #include <libsoup/soup.h>
</span><span class="cx">
</span><span class="lines">@@ -99,7 +98,8 @@
</span><span class="cx"> if (!ecore_main_loop_glib_integrate())
</span><span class="cx"> return false;
</span><span class="cx">
</span><del>- NetworkStorageSession::defaultStorageSession().getOrCreateSoupNetworkSession().setupHTTPProxyFromEnvironment();
</del><ins>+ SoupNetworkSession::setProxySettingsFromEnvironment();
+
</ins><span class="cx"> return true;
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcesssoupWebProcessSoupcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/soup/WebProcessSoup.cpp (210920 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/soup/WebProcessSoup.cpp        2017-01-19 08:59:42 UTC (rev 210920)
+++ trunk/Source/WebKit2/WebProcess/soup/WebProcessSoup.cpp        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -29,17 +29,20 @@
</span><span class="cx">
</span><span class="cx"> #include "WebProcessCreationParameters.h"
</span><span class="cx"> #include <WebCore/MemoryCache.h>
</span><ins>+#include <WebCore/NetworkStorageSession.h>
+#include <WebCore/SoupNetworkSession.h>
</ins><span class="cx">
</span><span class="cx"> namespace WebKit {
</span><span class="cx">
</span><span class="cx"> void WebProcess::platformSetCacheModel(CacheModel cacheModel)
</span><span class="cx"> {
</span><del>- // FIXME: this is no longer soup specific, this file should be renamed.
</del><span class="cx"> WebCore::MemoryCache::singleton().setDisabled(cacheModel == CacheModelDocumentViewer);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void WebProcess::platformInitializeWebProcess(WebProcessCreationParameters&&)
</del><ins>+void WebProcess::platformInitializeWebProcess(WebProcessCreationParameters&& parameters)
</ins><span class="cx"> {
</span><ins>+ if (parameters.proxySettings.mode != WebCore::SoupNetworkProxySettings::Mode::Default)
+ setNetworkProxySettings(parameters.proxySettings);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void WebProcess::platformTerminate()
</span><span class="lines">@@ -46,4 +49,13 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void WebProcess::setNetworkProxySettings(const WebCore::SoupNetworkProxySettings& settings)
+{
+ WebCore::SoupNetworkSession::setProxySettings(settings);
+ WebCore::NetworkStorageSession::forEach([](const WebCore::NetworkStorageSession& session) {
+ if (auto* soupSession = session.soupNetworkSession())
+ soupSession->setupProxy();
+ });
+}
+
</ins><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (210920 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2017-01-19 08:59:42 UTC (rev 210920)
+++ trunk/Tools/ChangeLog        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -1,3 +1,21 @@
</span><ins>+2017-01-19 Carlos Garcia Campos <cgarcia@igalia.com>
+
+ [GTK] Provide API to set proxy settings
+ https://bugs.webkit.org/show_bug.cgi?id=128674
+
+ Reviewed by Michael Catanzaro.
+
+ Add tests for new proxy settings API.
+
+ * TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitWebContext.cpp:
+ (serverCallback):
+ (ProxyTest::ProxyTest):
+ (ProxyTest::~ProxyTest):
+ (ProxyTest::loadURIAndGetMainResourceData):
+ (ProxyTest::proxyServerPortAsString):
+ (testWebContextProxySettings):
+ (beforeAll):
+
</ins><span class="cx"> 2017-01-19 Timothy Hatcher <timothy@hatcher.name>
</span><span class="cx">
</span><span class="cx"> Add back my old email address so old commits will still match it.
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWebKit2GtkTestWebKitWebContextcpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitWebContext.cpp (210920 => 210921)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitWebContext.cpp        2017-01-19 08:59:42 UTC (rev 210920)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitWebContext.cpp        2017-01-19 09:03:25 UTC (rev 210921)
</span><span class="lines">@@ -550,6 +550,11 @@
</span><span class="cx"> soup_message_body_append(message->response_body, SOUP_MEMORY_STATIC, "foo", 3);
</span><span class="cx"> soup_message_body_complete(message->response_body);
</span><span class="cx"> soup_message_set_status(message, SOUP_STATUS_OK);
</span><ins>+ } else if (g_str_equal(path, "/echoPort")) {
+ char* port = g_strdup_printf("%u", soup_server_get_port(server));
+ soup_message_body_append(message->response_body, SOUP_MEMORY_TAKE, port, strlen(port));
+ soup_message_body_complete(message->response_body);
+ soup_message_set_status(message, SOUP_STATUS_OK);
</ins><span class="cx"> } else
</span><span class="cx"> soup_message_set_status(message, SOUP_STATUS_NOT_FOUND);
</span><span class="cx"> }
</span><span class="lines">@@ -700,6 +705,90 @@
</span><span class="cx"> webkit_settings_set_allow_file_access_from_file_urls(webkit_web_view_get_settings(test->m_webView), FALSE);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+class ProxyTest : public WebViewTest {
+public:
+ MAKE_GLIB_TEST_FIXTURE(ProxyTest);
+
+ ProxyTest()
+ {
+ // This "proxy server" is actually just a different instance of the main
+ // test server (kServer), listening on a different port. Requests
+ // will not actually be proxied to kServer because proxyServer is not
+ // actually a proxy server. We're testing whether the proxy settings
+ // work, not whether we can write a soup proxy server.
+ m_proxyServer.run(serverCallback);
+ g_assert(m_proxyServer.baseURI());
+ }
+
+ CString loadURIAndGetMainResourceData(const char* uri)
+ {
+ loadURI(uri);
+ waitUntilLoadFinished();
+ size_t dataSize = 0;
+ const char* data = mainResourceData(dataSize);
+ return CString(data, dataSize);
+ }
+
+ GUniquePtr<char> proxyServerPortAsString()
+ {
+ GUniquePtr<char> port(g_strdup_printf("%u", soup_uri_get_port(m_proxyServer.baseURI())));
+ return port;
+ }
+
+ WebKitTestServer m_proxyServer;
+};
+
+static void testWebContextProxySettings(ProxyTest* test, gconstpointer)
+{
+ // Proxy URI is unset by default. Requests to kServer should be received by kServer.
+ GUniquePtr<char> serverPortAsString(g_strdup_printf("%u", soup_uri_get_port(kServer->baseURI())));
+ auto mainResourceData = test->loadURIAndGetMainResourceData(kServer->getURIForPath("/echoPort").data());
+ ASSERT_CMP_CSTRING(mainResourceData, ==, serverPortAsString.get());
+
+ // Set default proxy URI to point to proxyServer. Requests to kServer should be received by proxyServer instead.
+ GUniquePtr<char> proxyURI(soup_uri_to_string(test->m_proxyServer.baseURI(), FALSE));
+ WebKitNetworkProxySettings* settings = webkit_network_proxy_settings_new(proxyURI.get(), nullptr);
+ webkit_web_context_set_network_proxy_settings(test->m_webContext.get(), WEBKIT_NETWORK_PROXY_MODE_CUSTOM, settings);
+ GUniquePtr<char> proxyServerPortAsString = test->proxyServerPortAsString();
+ mainResourceData = test->loadURIAndGetMainResourceData(kServer->getURIForPath("/echoPort").data());
+ ASSERT_CMP_CSTRING(mainResourceData, ==, proxyServerPortAsString.get());
+ webkit_network_proxy_settings_free(settings);
+
+ // Remove the proxy. Requests to kServer should be received by kServer again.
+ webkit_web_context_set_network_proxy_settings(test->m_webContext.get(), WEBKIT_NETWORK_PROXY_MODE_NO_PROXY, nullptr);
+ mainResourceData = test->loadURIAndGetMainResourceData(kServer->getURIForPath("/echoPort").data());
+ ASSERT_CMP_CSTRING(mainResourceData, ==, serverPortAsString.get());
+
+ // Use a default proxy uri, but ignoring requests to localhost.
+ static const char* ignoreHosts[] = { "localhost", nullptr };
+ settings = webkit_network_proxy_settings_new(proxyURI.get(), ignoreHosts);
+ webkit_web_context_set_network_proxy_settings(test->m_webContext.get(), WEBKIT_NETWORK_PROXY_MODE_CUSTOM, settings);
+ mainResourceData = test->loadURIAndGetMainResourceData(kServer->getURIForPath("/echoPort").data());
+ ASSERT_CMP_CSTRING(mainResourceData, ==, proxyServerPortAsString.get());
+ GUniquePtr<char> localhostEchoPortURI(g_strdup_printf("http://localhost:%s/echoPort", serverPortAsString.get()));
+ mainResourceData = test->loadURIAndGetMainResourceData(localhostEchoPortURI.get());
+ ASSERT_CMP_CSTRING(mainResourceData, ==, serverPortAsString.get());
+ webkit_network_proxy_settings_free(settings);
+
+ // Remove the proxy again to ensure next test is not using any previous values.
+ webkit_web_context_set_network_proxy_settings(test->m_webContext.get(), WEBKIT_NETWORK_PROXY_MODE_NO_PROXY, nullptr);
+ mainResourceData = test->loadURIAndGetMainResourceData(kServer->getURIForPath("/echoPort").data());
+ ASSERT_CMP_CSTRING(mainResourceData, ==, serverPortAsString.get());
+
+ // Use scheme specific proxy instead of the default.
+ settings = webkit_network_proxy_settings_new(nullptr, nullptr);
+ webkit_network_proxy_settings_add_proxy_for_scheme(settings, "http", proxyURI.get());
+ webkit_web_context_set_network_proxy_settings(test->m_webContext.get(), WEBKIT_NETWORK_PROXY_MODE_CUSTOM, settings);
+ mainResourceData = test->loadURIAndGetMainResourceData(kServer->getURIForPath("/echoPort").data());
+ ASSERT_CMP_CSTRING(mainResourceData, ==, proxyServerPortAsString.get());
+ webkit_network_proxy_settings_free(settings);
+
+ // Reset to use the default resolver.
+ webkit_web_context_set_network_proxy_settings(test->m_webContext.get(), WEBKIT_NETWORK_PROXY_MODE_DEFAULT, nullptr);
+ mainResourceData = test->loadURIAndGetMainResourceData(kServer->getURIForPath("/echoPort").data());
+ ASSERT_CMP_CSTRING(mainResourceData, ==, serverPortAsString.get());
+}
+
</ins><span class="cx"> void beforeAll()
</span><span class="cx"> {
</span><span class="cx"> kServer = new WebKitTestServer();
</span><span class="lines">@@ -713,6 +802,7 @@
</span><span class="cx"> WebViewTest::add("WebKitWebContext", "languages", testWebContextLanguages);
</span><span class="cx"> SecurityPolicyTest::add("WebKitSecurityManager", "security-policy", testWebContextSecurityPolicy);
</span><span class="cx"> WebViewTest::add("WebKitSecurityManager", "file-xhr", testWebContextSecurityFileXHR);
</span><ins>+ ProxyTest::add("WebKitWebContext", "proxy", testWebContextProxySettings);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void afterAll()
</span></span></pre>
</div>
</div>
</body>
</html>