[Qt][WK2] Setting Download as action for navigation request crashes WebProcess
[WebKit.git] / Source / WebCore / platform / qt / ThirdPartyCookiesQt.cpp
1 /*
2  * Copyright (C) 2011 Robert Hogan <robert@roberthogan.net>
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public License
15  * along with this library; see the file COPYING.LIB.  If not, write to
16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  */
19
20 #include "config.h"
21 #include "ThirdPartyCookiesQt.h"
22
23 #include "Cookie.h"
24 #include "CookieJar.h"
25 #include "Document.h"
26 #include "NetworkingContext.h"
27
28 #include <QList>
29 #include <QNetworkAccessManager>
30 #include <QNetworkCookieJar>
31
32 namespace WebCore {
33
34 #if QT_VERSION >= QT_VERSION_CHECK(4, 8, 0)
35 inline void removeTopLevelDomain(QString* domain, const QString& topLevelDomain)
36 {
37     domain->remove(domain->length() - topLevelDomain.length(), topLevelDomain.length());
38     domain->prepend(QLatin1Char('.'));
39 }
40
41 static bool urlsShareSameDomain(const QUrl& url, const QUrl& firstPartyUrl)
42 {
43     QString firstPartyTLD = firstPartyUrl.topLevelDomain();
44     QString requestTLD = url.topLevelDomain();
45
46     if (firstPartyTLD != requestTLD)
47         return false;
48
49     QString firstPartyDomain = QString(firstPartyUrl.host().toLower());
50     QString requestDomain = QString(url.host().toLower());
51
52     removeTopLevelDomain(&firstPartyDomain, firstPartyTLD);
53     removeTopLevelDomain(&requestDomain, requestTLD);
54
55     if (firstPartyDomain.section(QLatin1Char('.'), -1) == requestDomain.section(QLatin1Char('.'), -1))
56         return true;
57
58     return false;
59 }
60 #endif
61
62 bool thirdPartyCookiePolicyPermits(NetworkingContext* context, const QUrl& url, const QUrl& firstPartyUrl)
63 {
64 #if QT_VERSION >= QT_VERSION_CHECK(4, 8, 0)
65     if (!context)
66         return true;
67
68     if (!context->networkAccessManager())
69         return true;
70
71     QNetworkCookieJar* jar = context->networkAccessManager()->cookieJar();
72     if (!jar)
73         return true;
74
75     if (firstPartyUrl.isEmpty())
76         return true;
77
78     if (urlsShareSameDomain(url, firstPartyUrl))
79         return true;
80
81     return context->thirdPartyCookiePolicyPermission(url);
82 #else
83     return true;
84 #endif
85 }
86
87 }
88 // vim: ts=4 sw=4 et