10617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen/*
20617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * Copyright (C) 2010 Apple Inc. All Rights Reserved.
30617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen *
40617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * Redistribution and use in source and binary forms, with or without
50617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * modification, are permitted provided that the following conditions
60617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * are met:
70617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * 1. Redistributions of source code must retain the above copyright
80617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen *    notice, this list of conditions and the following disclaimer.
90617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * 2. Redistributions in binary form must reproduce the above copyright
100617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen *    notice, this list of conditions and the following disclaimer in the
110617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen *    documentation and/or other materials provided with the distribution.
120617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen *
130617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * THIS SOFTWARE IS PROVIDED BY APPLE, INC. ``AS IS'' AND ANY
140617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
150617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
160617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
170617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
180617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
190617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
200617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
210617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
220617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
230617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
240617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen *
250617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen */
260617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#include "config.h"
270617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#include "SchemeRegistry.h"
280617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
290617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsennamespace WebCore {
300617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
310617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenstatic URLSchemesMap& localURLSchemes()
320617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
330617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    DEFINE_STATIC_LOCAL(URLSchemesMap, localSchemes, ());
340617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
350617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (localSchemes.isEmpty()) {
360617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        localSchemes.add("file");
370617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#if PLATFORM(MAC)
380617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        localSchemes.add("applewebdata");
390617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#endif
400617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#if PLATFORM(QT)
410617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        localSchemes.add("qrc");
420617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#endif
430617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    }
440617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
450617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    return localSchemes;
460617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
470617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic URLSchemesMap& displayIsolatedURLSchemes()
4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    DEFINE_STATIC_LOCAL(URLSchemesMap, displayIsolatedSchemes, ());
5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return displayIsolatedSchemes;
5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
540617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenstatic URLSchemesMap& secureSchemes()
550617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
560617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    DEFINE_STATIC_LOCAL(URLSchemesMap, secureSchemes, ());
570617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
580617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (secureSchemes.isEmpty()) {
590617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        secureSchemes.add("https");
600617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        secureSchemes.add("about");
610617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        secureSchemes.add("data");
620617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    }
630617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
640617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    return secureSchemes;
650617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
660617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
670617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenstatic URLSchemesMap& schemesWithUniqueOrigins()
680617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
690617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    DEFINE_STATIC_LOCAL(URLSchemesMap, schemesWithUniqueOrigins, ());
700617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
710617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    // This is a willful violation of HTML5.
720617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    // See https://bugs.webkit.org/show_bug.cgi?id=11885
730617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (schemesWithUniqueOrigins.isEmpty())
740617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        schemesWithUniqueOrigins.add("data");
750617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
760617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    return schemesWithUniqueOrigins;
770617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
780617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
790617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenstatic URLSchemesMap& emptyDocumentSchemes()
800617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
810617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    DEFINE_STATIC_LOCAL(URLSchemesMap, emptyDocumentSchemes, ());
820617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
830617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (emptyDocumentSchemes.isEmpty())
840617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        emptyDocumentSchemes.add("about");
850617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
860617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    return emptyDocumentSchemes;
870617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
880617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
892fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic URLSchemesMap& canDisplayOnlyIfCanRequestSchemes()
902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    DEFINE_STATIC_LOCAL(URLSchemesMap, canDisplayOnlyIfCanRequestSchemes, ());
922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(BLOB) || ENABLE(FILE_SYSTEM)
942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (canDisplayOnlyIfCanRequestSchemes.isEmpty()) {
952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(BLOB)
962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        canDisplayOnlyIfCanRequestSchemes.add("blob");
972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(FILE_SYSTEM)
992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        canDisplayOnlyIfCanRequestSchemes.add("filesystem");
1002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
1012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
1022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif // ENABLE(BLOB) || ENABLE(FILE_SYSTEM)
1032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return canDisplayOnlyIfCanRequestSchemes;
1052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1070617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenvoid SchemeRegistry::registerURLSchemeAsLocal(const String& scheme)
1080617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    localURLSchemes().add(scheme);
1100617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
1110617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
1120617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenvoid SchemeRegistry::removeURLSchemeRegisteredAsLocal(const String& scheme)
1130617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
1140617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (scheme == "file")
1150617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        return;
1160617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#if PLATFORM(MAC)
1170617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (scheme == "applewebdata")
1180617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        return;
1190617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#endif
12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    localURLSchemes().remove(scheme);
1210617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
1220617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochconst URLSchemesMap& SchemeRegistry::localSchemes()
1240617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return localURLSchemes();
1260617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
1270617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
1280617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenbool SchemeRegistry::shouldTreatURLSchemeAsLocal(const String& scheme)
1290617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
1300617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (scheme.isEmpty())
1310617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        return false;
13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return localURLSchemes().contains(scheme);
1330617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
1340617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
1350617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenvoid SchemeRegistry::registerURLSchemeAsNoAccess(const String& scheme)
1360617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
1370617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    schemesWithUniqueOrigins().add(scheme);
1380617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
1390617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
1400617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenbool SchemeRegistry::shouldTreatURLSchemeAsNoAccess(const String& scheme)
1410617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
1422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (scheme.isEmpty())
1432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
1440617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    return schemesWithUniqueOrigins().contains(scheme);
1450617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
1460617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
14765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid SchemeRegistry::registerURLSchemeAsDisplayIsolated(const String& scheme)
14865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    displayIsolatedURLSchemes().add(scheme);
15065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
15165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool SchemeRegistry::shouldTreatURLSchemeAsDisplayIsolated(const String& scheme)
15365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
1542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (scheme.isEmpty())
1552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
15665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return displayIsolatedURLSchemes().contains(scheme);
15765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
15865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1590617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenvoid SchemeRegistry::registerURLSchemeAsSecure(const String& scheme)
1600617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
1610617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    secureSchemes().add(scheme);
1620617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
1630617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
1640617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenbool SchemeRegistry::shouldTreatURLSchemeAsSecure(const String& scheme)
1650617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
1662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (scheme.isEmpty())
1672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
1680617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    return secureSchemes().contains(scheme);
1690617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
1700617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
1710617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenvoid SchemeRegistry::registerURLSchemeAsEmptyDocument(const String& scheme)
1720617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
1730617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    emptyDocumentSchemes().add(scheme);
1740617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
1750617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
1760617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenbool SchemeRegistry::shouldLoadURLSchemeAsEmptyDocument(const String& scheme)
1770617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
1782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (scheme.isEmpty())
1792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
1800617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    return emptyDocumentSchemes().contains(scheme);
1810617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
1820617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
1832fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockbool SchemeRegistry::canDisplayOnlyIfCanRequest(const String& scheme)
1842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
1852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (scheme.isEmpty())
1862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return false;
1872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return canDisplayOnlyIfCanRequestSchemes().contains(scheme);
1882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1902fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid SchemeRegistry::registerAsCanDisplayOnlyIfCanRequest(const String& scheme)
1912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
1922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    canDisplayOnlyIfCanRequestSchemes().add(scheme);
1932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1950617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen} // namespace WebCore
196