<!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&lt;SoupNetworkProxySettings&gt;::encode): Add encoder implementation for SoupNetworkProxySettings.
(IPC::ArgumentCoder&lt;SoupNetworkProxySettings&gt;::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  &lt;cgarcia@igalia.com&gt;
+
+        [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  &lt;sam@webkit.org&gt;
</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 &lt;wtf/HashMap.h&gt;
+#include &lt;wtf/glib/GUniquePtr.h&gt;
+#include &lt;wtf/text/CString.h&gt;
+
+namespace WebCore {
+
+struct SoupNetworkProxySettings {
+    enum class Mode { Default, NoProxy, Custom };
+
+    SoupNetworkProxySettings() = default;
+
+    explicit SoupNetworkProxySettings(Mode proxyMode)
+        : mode(proxyMode)
+    {
+    }
+
+    SoupNetworkProxySettings(const WebCore::SoupNetworkProxySettings&amp; other)
+        : mode(other.mode)
+        , defaultProxyURL(other.defaultProxyURL)
+        , ignoreHosts(g_strdupv(other.ignoreHosts.get()))
+        , proxyMap(other.proxyMap)
+    {
+    }
+
+    SoupNetworkProxySettings&amp; operator=(const WebCore::SoupNetworkProxySettings&amp; 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 &amp;&amp; defaultProxyURL.isNull() &amp;&amp; !ignoreHosts &amp;&amp; proxyMap.isEmpty(); }
+
+    Mode mode { Mode::Default };
+    CString defaultProxyURL;
+    GUniquePtr&lt;char*&gt; ignoreHosts;
+    HashMap&lt;CString, CString&gt; 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 &quot;GUniquePtrSoup.h&quot;
</span><span class="cx"> #include &quot;Logging.h&quot;
</span><span class="cx"> #include &quot;ResourceHandle.h&quot;
</span><ins>+#include &quot;SoupNetworkProxySettings.h&quot;
</ins><span class="cx"> #include &lt;glib/gstdio.h&gt;
</span><span class="cx"> #include &lt;libsoup/soup.h&gt;
</span><span class="cx"> #include &lt;wtf/HashSet.h&gt;
</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(), &quot;authenticate&quot;, 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, &quot;,&quot;, -1);
-
-        resolver = g_simple_proxy_resolver_new(httpProxy, ignoreLists);
-
-        g_strfreev(ignoreLists);
</del><ins>+    GRefPtr&lt;GProxyResolver&gt; resolver;
+    switch (gProxySettings.mode) {
+    case SoupNetworkProxySettings::Mode::Default: {
+        GRefPtr&lt;GProxyResolver&gt; currentResolver;
+        g_object_get(m_soupSession.get(), SOUP_SESSION_PROXY_RESOLVER, &amp;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&amp; 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(&quot;http_proxy&quot;);
</span><span class="cx">     if (!httpProxy)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    setHTTPProxy(httpProxy, getenv(&quot;no_proxy&quot;));
</del><ins>+    gProxySettings.defaultProxyURL = httpProxy;
+    const char* httpProxyExceptions = getenv(&quot;no_proxy&quot;);
+    if (httpProxyExceptions)
+        gProxySettings.ignoreHosts.reset(g_strsplit(httpProxyExceptions, &quot;,&quot;, -1));
+}
</ins><span class="cx"> #endif
</span><ins>+
+void SoupNetworkSession::setProxySettings(const SoupNetworkProxySettings&amp; settings)
+{
+    gProxySettings = settings;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-
</del><span class="cx"> void SoupNetworkSession::setInitialAcceptLanguages(const CString&amp; 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&amp; cacheDirectory);
</span><span class="cx"> 
</span><del>-    void setupHTTPProxyFromEnvironment();
</del><ins>+#if PLATFORM(EFL)
+    static void setProxySettingsFromEnvironment();
+#endif
+    static void setProxySettings(const SoupNetworkProxySettings&amp;);
+    void setupProxy();
</ins><span class="cx"> 
</span><span class="cx">     static void setInitialAcceptLanguages(const CString&amp;);
</span><span class="cx">     void setAcceptLanguages(const CString&amp;);
</span><span class="lines">@@ -66,8 +71,6 @@
</span><span class="cx">     static void allowSpecificHTTPSCertificateForHost(const CertificateInfo&amp;, const String&amp; 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&lt;SoupSession&gt; 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  &lt;cgarcia@igalia.com&gt;
</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&lt;SoupNetworkProxySettings&gt;::encode): Add encoder implementation for SoupNetworkProxySettings.
+        (IPC::ArgumentCoder&lt;SoupNetworkProxySettings&gt;::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  &lt;cgarcia@igalia.com&gt;
+
</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&lt;String&gt;&amp;);
</span><ins>+    void setNetworkProxySettings(const WebCore::SoupNetworkProxySettings&amp;);
</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&lt;String&gt; 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 &quot;ArgumentCodersCF.h&quot;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+#if USE(SOUP)
+#include &quot;WebCoreArgumentCoders.h&quot;
+#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 &lt;&lt; ignoreTLSErrors;
</span><span class="cx">     encoder &lt;&lt; languages;
</span><ins>+    encoder &lt;&lt; proxySettings;
</ins><span class="cx"> #endif
</span><span class="cx"> #if OS(LINUX)
</span><span class="cx">     encoder &lt;&lt; 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 &quot;HTTPCookieAcceptPolicy.h&quot;
</span><ins>+#include &lt;WebCore/SoupNetworkProxySettings.h&gt;
</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&lt;String&gt; 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 &quot;ChildProcessMain.h&quot;
</span><span class="cx"> #include &quot;NetworkProcess.h&quot;
</span><span class="cx"> #include &lt;Ecore.h&gt;
</span><del>-#include &lt;WebCore/NetworkStorageSession.h&gt;
</del><span class="cx"> #include &lt;WebCore/SoupNetworkSession.h&gt;
</span><span class="cx"> #include &lt;libsoup/soup.h&gt;
</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&amp; 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&amp; settings)
+{
+    SoupNetworkSession::setProxySettings(settings);
+    NetworkStorageSession::forEach([](const NetworkStorageSession&amp; session) {
+        if (auto* soupSession = session.soupNetworkSession())
+            soupSession-&gt;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&lt;&gt; struct ArgumentCoder&lt;WebCore::SoupNetworkProxySettings&gt; {
+    static void encode(Encoder&amp;, const WebCore::SoupNetworkProxySettings&amp;);
+    static bool decode(Decoder&amp;, WebCore::SoupNetworkProxySettings&amp;);
+};
+#endif
+
</ins><span class="cx"> template&lt;&gt; struct ArgumentCoder&lt;WebCore::CompositionUnderline&gt; {
</span><span class="cx">     static void encode(Encoder&amp;, const WebCore::CompositionUnderline&amp;);
</span><span class="cx">     static bool decode(Decoder&amp;, WebCore::CompositionUnderline&amp;);
</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 &lt;&lt; waylandCompositorDisplayName;
</span><span class="cx"> #endif
</span><ins>+
+#if USE(SOUP)
+    encoder &lt;&lt; proxySettings;
+#endif
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool WebProcessCreationParameters::decode(IPC::Decoder&amp; decoder, WebProcessCreationParameters&amp; 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 &quot;HTTPCookieAcceptPolicy.h&quot;
</span><ins>+#include &lt;WebCore/SoupNetworkProxySettings.h&gt;
</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 &lt;WebCore/ResourceError.h&gt;
</span><span class="cx"> #include &lt;WebCore/ResourceRequest.h&gt;
</span><span class="cx"> #include &lt;WebCore/ResourceResponse.h&gt;
</span><ins>+#include &lt;WebCore/SoupNetworkProxySettings.h&gt;
</ins><span class="cx"> #include &lt;wtf/text/CString.h&gt;
</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&lt;SoupNetworkProxySettings&gt;::encode(Encoder&amp; encoder, const SoupNetworkProxySettings&amp; settings)
+{
+    ASSERT(!settings.isEmpty());
+    encoder.encodeEnum(settings.mode);
+    if (settings.mode != SoupNetworkProxySettings::Mode::Custom)
+        return;
+
+    encoder &lt;&lt; settings.defaultProxyURL;
+    uint32_t ignoreHostsCount = settings.ignoreHosts ? g_strv_length(settings.ignoreHosts.get()) : 0;
+    encoder &lt;&lt; ignoreHostsCount;
+    if (ignoreHostsCount) {
+        for (uint32_t i = 0; settings.ignoreHosts.get()[i]; ++i)
+            encoder &lt;&lt; CString(settings.ignoreHosts.get()[i]);
+    }
+    encoder &lt;&lt; settings.proxyMap;
+}
+
+bool ArgumentCoder&lt;SoupNetworkProxySettings&gt;::decode(Decoder&amp; decoder, SoupNetworkProxySettings&amp; 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 &lt; 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&lt;ProtectionSpace&gt;::encodePlatformData(Encoder&amp;, const ProtectionSpace&amp;)
</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 &quot;config.h&quot;
+#include &quot;WebKitNetworkProxySettings.h&quot;
+
+#include &quot;WebKitNetworkProxySettingsPrivate.h&quot;
+#include &lt;WebCore/SoupNetworkProxySettings.h&gt;
+#include &lt;wtf/text/WTFString.h&gt;
+
+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&amp; 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&amp; webkitNetworkProxySettingsGetNetworkProxySettings(WebKitNetworkProxySettings* proxySettings)
+{
+    ASSERT(proxySettings);
+    return proxySettings-&gt;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 &quot;socks://&quot;, 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:
+ * &lt;itemizedlist&gt;
+ * &lt;listitem&gt;&lt;para&gt;
+ * A hostname, such as &quot;example.com&quot;, &quot;.example.com&quot;, or &quot;*.example.com&quot;, any of which match &quot;example.com&quot; or
+ * any subdomain of it.
+ * &lt;/para&gt;&lt;/listitem&gt;
+ * &lt;listitem&gt;&lt;para&gt;
+ * An IPv4 or IPv6 address, such as &quot;192.168.1.1&quot;, which matches only that address.
+ * &lt;/para&gt;&lt;/listitem&gt;
+ * &lt;listitem&gt;&lt;para&gt;
+ * A hostname or IP address followed by a port, such as &quot;example.com:80&quot;, 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: &quot;[::1]:443&quot;
+ * &lt;/para&gt;&lt;/listitem&gt;
+ * &lt;listitem&gt;&lt;para&gt;
+ * An IP address range, given by a base address and prefix length, such as &quot;fe80::/10&quot;, which matches any address in that range.
+ * &lt;/para&gt;&lt;/listitem&gt;
+ * &lt;/itemizedlist&gt;
+ *
+ * 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 &quot;192.168.1.1&quot;, then a connection to &quot;example.com&quot; will use the proxy, and a connection to 192.168.1.1&quot; 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&lt;WebKitNetworkProxySettings*&gt;(fastMalloc(sizeof(WebKitNetworkProxySettings)));
+    new (proxySettings) WebKitNetworkProxySettings;
+    if (defaultProxyURI)
+        proxySettings-&gt;settings.defaultProxyURL = defaultProxyURI;
+    if (ignoreHosts)
+        proxySettings-&gt;settings.ignoreHosts.reset(g_strdupv(const_cast&lt;char**&gt;(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&lt;WebKitNetworkProxySettings*&gt;(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-&gt;~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 &quot;socks://&quot;, 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-&gt;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__) &amp;&amp; !defined(WEBKIT2_COMPILATION)
+#error &quot;Only &lt;webkit2/webkit2.h&gt; can be included directly.&quot;
+#endif
+
+#ifndef WebKitNetworkProxySettings_h
+#define WebKitNetworkProxySettings_h
+
+#include &lt;glib-object.h&gt;
+#include &lt;webkit2/WebKitDefines.h&gt;
+
+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 &quot;WebKitNetworkProxySettings.h&quot;
+#include &quot;WebKitPrivate.h&quot;
+#include &lt;WebCore/SoupNetworkProxySettings.h&gt;
+
+const WebCore::SoupNetworkProxySettings&amp; 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 &quot;WebKitFaviconDatabasePrivate.h&quot;
</span><span class="cx"> #include &quot;WebKitGeolocationProvider.h&quot;
</span><span class="cx"> #include &quot;WebKitInjectedBundleClient.h&quot;
</span><ins>+#include &quot;WebKitNetworkProxySettingsPrivate.h&quot;
</ins><span class="cx"> #include &quot;WebKitNotificationProvider.h&quot;
</span><span class="cx"> #include &quot;WebKitPluginPrivate.h&quot;
</span><span class="cx"> #include &quot;WebKitPrivate.h&quot;
</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 &amp;&amp; !proxySettings) || (proxyMode == WEBKIT_NETWORK_PROXY_MODE_CUSTOM &amp;&amp; proxySettings));
+
+    WebKitWebContextPrivate* priv = context-&gt;priv;
+    switch (proxyMode) {
+    case WEBKIT_NETWORK_PROXY_MODE_DEFAULT:
+        priv-&gt;processPool-&gt;setNetworkProxySettings({ });
+        break;
+    case WEBKIT_NETWORK_PROXY_MODE_NO_PROXY:
+        priv-&gt;processPool-&gt;setNetworkProxySettings(WebCore::SoupNetworkProxySettings(WebCore::SoupNetworkProxySettings::Mode::NoProxy));
+        break;
+    case WEBKIT_NETWORK_PROXY_MODE_CUSTOM:
+        const auto&amp; settings = webkitNetworkProxySettingsGetNetworkProxySettings(proxySettings);
+        if (settings.isEmpty()) {
+            g_warning(&quot;Invalid attempt to set custom network proxy settings with an empty WebKitNetworkProxySettings. Use &quot;
+                &quot;WEBKIT_NETWORK_PROXY_MODE_NO_PROXY to not use any proxy or WEBKIT_NETWORK_PROXY_MODE_DEFAULT to use the default system settings&quot;);
+        } else
+            priv-&gt;processPool-&gt;setNetworkProxySettings(settings);
+        break;
+    }
+}
+
</ins><span class="cx"> typedef HashMap&lt;DownloadProxy*, GRefPtr&lt;WebKitDownload&gt; &gt; DownloadsMap;
</span><span class="cx"> 
</span><span class="cx"> static DownloadsMap&amp; 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 &lt;webkit2/WebKitDefines.h&gt;
</span><span class="cx"> #include &lt;webkit2/WebKitDownload.h&gt;
</span><span class="cx"> #include &lt;webkit2/WebKitFaviconDatabase.h&gt;
</span><ins>+#include &lt;webkit2/WebKitNetworkProxySettings.h&gt;
</ins><span class="cx"> #include &lt;webkit2/WebKitSecurityManager.h&gt;
</span><span class="cx"> #include &lt;webkit2/WebKitURISchemeRequest.h&gt;
</span><span class="cx"> #include &lt;webkit2/WebKitWebsiteDataManager.h&gt;
</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"> &lt;/SECTION&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;SECTION&gt;
</span><ins>+&lt;FILE&gt;WebKitNetworkProxySettings&lt;/FILE&gt;
+WebKitNetworkProxySettings
+webkit_network_proxy_settings_new
+webkit_network_proxy_settings_copy
+webkit_network_proxy_settings_free
+webkit_network_proxy_settings_add_proxy_for_scheme
+
+&lt;SUBSECTION Private&gt;
+webkit_network_proxy_settings_get_type
+
+&lt;SUBSECTION Standard&gt;
+WEBKIT_TYPE_NETWORK_NETWORK_PROXY_SETTINGS
+&lt;/SECTION&gt;
+
+&lt;SECTION&gt;
</ins><span class="cx"> &lt;FILE&gt;WebKitWebExtension&lt;/FILE&gt;
</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">     &lt;xi:include href=&quot;xml/WebKitNotificationPermissionRequest.xml&quot;/&gt;
</span><span class="cx">     &lt;xi:include href=&quot;xml/WebKitSecurityOrigin.xml&quot;/&gt;
</span><span class="cx">     &lt;xi:include href=&quot;xml/WebKitWebsiteDataManager.xml&quot;/&gt;
</span><ins>+    &lt;xi:include href=&quot;xml/WebKitNetworkProxySettings.xml&quot;/&gt;
</ins><span class="cx">   &lt;/chapter&gt;
</span><span class="cx"> 
</span><span class="cx">   &lt;chapter&gt;
</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 &lt;webkit2/WebKitMimeInfo.h&gt;
</span><span class="cx"> #include &lt;webkit2/WebKitNavigationAction.h&gt;
</span><span class="cx"> #include &lt;webkit2/WebKitNavigationPolicyDecision.h&gt;
</span><ins>+#include &lt;webkit2/WebKitNetworkProxySettings.h&gt;
</ins><span class="cx"> #include &lt;webkit2/WebKitNotification.h&gt;
</span><span class="cx"> #include &lt;webkit2/WebKitNotificationPermissionRequest.h&gt;
</span><span class="cx"> #include &lt;webkit2/WebKitPermissionRequest.h&gt;
</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 &quot;WebMediaSessionFocusManager.h&quot;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+#if USE(SOUP)
+#include &lt;WebCore/SoupNetworkProxySettings.h&gt;
+#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&amp;);
</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&amp; 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 &quot;NetworkProcessCreationParameters.h&quot;
</span><span class="cx"> #include &quot;NetworkProcessMessages.h&quot;
</span><span class="cx"> #include &quot;WebCookieManagerProxy.h&quot;
</span><ins>+#include &quot;WebCoreArgumentCoders.h&quot;
+#include &quot;WebProcessMessages.h&quot;
</ins><span class="cx"> #include &lt;WebCore/Language.h&gt;
</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&amp; 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&amp; settings)
+{
+    m_networkProxySettings = settings;
+    sendToAllProcesses(Messages::WebProcess::SetNetworkProxySettings(m_networkProxySettings));
+    if (m_networkProcess)
+        m_networkProcess-&gt;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&amp;);
+#endif
+
</ins><span class="cx">     void releasePageCache();
</span><span class="cx"> 
</span><span class="cx">     void fetchWebsiteData(WebCore::SessionID, OptionSet&lt;WebsiteDataType&gt;, WebsiteData&amp;);
</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 &lt;Ecore_Evas.h&gt;
</span><span class="cx"> #include &lt;Edje.h&gt;
</span><span class="cx"> #include &lt;Efreet.h&gt;
</span><del>-#include &lt;WebCore/NetworkStorageSession.h&gt;
</del><span class="cx"> #include &lt;WebCore/SoupNetworkSession.h&gt;
</span><span class="cx"> #include &lt;libsoup/soup.h&gt;
</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 &quot;WebProcessCreationParameters.h&quot;
</span><span class="cx"> #include &lt;WebCore/MemoryCache.h&gt;
</span><ins>+#include &lt;WebCore/NetworkStorageSession.h&gt;
+#include &lt;WebCore/SoupNetworkSession.h&gt;
</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&amp;&amp;)
</del><ins>+void WebProcess::platformInitializeWebProcess(WebProcessCreationParameters&amp;&amp; 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&amp; settings)
+{
+    WebCore::SoupNetworkSession::setProxySettings(settings);
+    WebCore::NetworkStorageSession::forEach([](const WebCore::NetworkStorageSession&amp; session) {
+        if (auto* soupSession = session.soupNetworkSession())
+            soupSession-&gt;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  &lt;cgarcia@igalia.com&gt;
+
+        [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  &lt;timothy@hatcher.name&gt;
</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-&gt;response_body, SOUP_MEMORY_STATIC, &quot;foo&quot;, 3);
</span><span class="cx">         soup_message_body_complete(message-&gt;response_body);
</span><span class="cx">         soup_message_set_status(message, SOUP_STATUS_OK);
</span><ins>+    } else if (g_str_equal(path, &quot;/echoPort&quot;)) {
+        char* port = g_strdup_printf(&quot;%u&quot;, soup_server_get_port(server));
+        soup_message_body_append(message-&gt;response_body, SOUP_MEMORY_TAKE, port, strlen(port));
+        soup_message_body_complete(message-&gt;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-&gt;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 &quot;proxy server&quot; 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&lt;char&gt; proxyServerPortAsString()
+    {
+        GUniquePtr&lt;char&gt; port(g_strdup_printf(&quot;%u&quot;, 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&lt;char&gt; serverPortAsString(g_strdup_printf(&quot;%u&quot;, soup_uri_get_port(kServer-&gt;baseURI())));
+    auto mainResourceData = test-&gt;loadURIAndGetMainResourceData(kServer-&gt;getURIForPath(&quot;/echoPort&quot;).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&lt;char&gt; proxyURI(soup_uri_to_string(test-&gt;m_proxyServer.baseURI(), FALSE));
+    WebKitNetworkProxySettings* settings = webkit_network_proxy_settings_new(proxyURI.get(), nullptr);
+    webkit_web_context_set_network_proxy_settings(test-&gt;m_webContext.get(), WEBKIT_NETWORK_PROXY_MODE_CUSTOM, settings);
+    GUniquePtr&lt;char&gt; proxyServerPortAsString = test-&gt;proxyServerPortAsString();
+    mainResourceData = test-&gt;loadURIAndGetMainResourceData(kServer-&gt;getURIForPath(&quot;/echoPort&quot;).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-&gt;m_webContext.get(), WEBKIT_NETWORK_PROXY_MODE_NO_PROXY, nullptr);
+    mainResourceData = test-&gt;loadURIAndGetMainResourceData(kServer-&gt;getURIForPath(&quot;/echoPort&quot;).data());
+    ASSERT_CMP_CSTRING(mainResourceData, ==, serverPortAsString.get());
+
+    // Use a default proxy uri, but ignoring requests to localhost.
+    static const char* ignoreHosts[] = { &quot;localhost&quot;, nullptr };
+    settings = webkit_network_proxy_settings_new(proxyURI.get(), ignoreHosts);
+    webkit_web_context_set_network_proxy_settings(test-&gt;m_webContext.get(), WEBKIT_NETWORK_PROXY_MODE_CUSTOM, settings);
+    mainResourceData = test-&gt;loadURIAndGetMainResourceData(kServer-&gt;getURIForPath(&quot;/echoPort&quot;).data());
+    ASSERT_CMP_CSTRING(mainResourceData, ==, proxyServerPortAsString.get());
+    GUniquePtr&lt;char&gt; localhostEchoPortURI(g_strdup_printf(&quot;http://localhost:%s/echoPort&quot;, serverPortAsString.get()));
+    mainResourceData = test-&gt;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-&gt;m_webContext.get(), WEBKIT_NETWORK_PROXY_MODE_NO_PROXY, nullptr);
+    mainResourceData = test-&gt;loadURIAndGetMainResourceData(kServer-&gt;getURIForPath(&quot;/echoPort&quot;).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, &quot;http&quot;, proxyURI.get());
+    webkit_web_context_set_network_proxy_settings(test-&gt;m_webContext.get(), WEBKIT_NETWORK_PROXY_MODE_CUSTOM, settings);
+    mainResourceData = test-&gt;loadURIAndGetMainResourceData(kServer-&gt;getURIForPath(&quot;/echoPort&quot;).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-&gt;m_webContext.get(), WEBKIT_NETWORK_PROXY_MODE_DEFAULT, nullptr);
+    mainResourceData = test-&gt;loadURIAndGetMainResourceData(kServer-&gt;getURIForPath(&quot;/echoPort&quot;).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(&quot;WebKitWebContext&quot;, &quot;languages&quot;, testWebContextLanguages);
</span><span class="cx">     SecurityPolicyTest::add(&quot;WebKitSecurityManager&quot;, &quot;security-policy&quot;, testWebContextSecurityPolicy);
</span><span class="cx">     WebViewTest::add(&quot;WebKitSecurityManager&quot;, &quot;file-xhr&quot;, testWebContextSecurityFileXHR);
</span><ins>+    ProxyTest::add(&quot;WebKitWebContext&quot;, &quot;proxy&quot;, testWebContextProxySettings);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void afterAll()
</span></span></pre>
</div>
</div>

</body>
</html>