Remove CSS_SHAPES feature definition. This should always be on.
[WebKit-https.git] / Source / WebCore / style / StylePendingResources.cpp
1 /*
2  * Copyright (C) 2016 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "StylePendingResources.h"
28
29 #include "CSSCursorImageValue.h"
30 #include "CachedResourceLoader.h"
31 #include "ContentData.h"
32 #include "CursorData.h"
33 #include "CursorList.h"
34 #include "Document.h"
35 #include "RenderStyle.h"
36 #include "SVGURIReference.h"
37 #include "StyleCachedImage.h"
38 #include "StyleGeneratedImage.h"
39 #include "TransformFunctions.h"
40
41 namespace WebCore {
42 namespace Style {
43
44 enum class LoadPolicy { Normal, ShapeOutside };
45 static void loadPendingImage(Document& document, const StyleImage* styleImage, const Element* element, LoadPolicy loadPolicy = LoadPolicy::Normal)
46 {
47     if (!styleImage || !styleImage->isPending())
48         return;
49
50     ResourceLoaderOptions options = CachedResourceLoader::defaultCachedResourceOptions();
51     options.contentSecurityPolicyImposition = element && element->isInUserAgentShadowTree() ? ContentSecurityPolicyImposition::SkipPolicyCheck : ContentSecurityPolicyImposition::DoPolicyCheck;
52
53     // FIXME: Why does shape-outside have different policy than other properties?
54     if (loadPolicy == LoadPolicy::ShapeOutside) {
55         options.mode = FetchOptions::Mode::Cors;
56         options.allowCredentials = DoNotAllowStoredCredentials;
57         options.sameOriginDataURLFlag = SameOriginDataURLFlag::Set;
58     }
59
60     const_cast<StyleImage&>(*styleImage).load(document.cachedResourceLoader(), options);
61 }
62
63 void loadPendingResources(RenderStyle& style, Document& document, const Element* element)
64 {
65     for (auto* backgroundLayer = style.backgroundLayers(); backgroundLayer; backgroundLayer = backgroundLayer->next())
66         loadPendingImage(document, backgroundLayer->image(), element);
67
68     for (auto* contentData = style.contentData(); contentData; contentData = contentData->next()) {
69         if (is<ImageContentData>(*contentData)) {
70             auto& styleImage = downcast<ImageContentData>(*contentData).image();
71             loadPendingImage(document, &styleImage, element);
72         }
73     }
74
75     if (auto* cursorList = style.cursors()) {
76         for (size_t i = 0; i < cursorList->size(); ++i)
77             loadPendingImage(document, cursorList->at(i).image(), element);
78     }
79
80     loadPendingImage(document, style.listStyleImage(), element);
81     loadPendingImage(document, style.borderImageSource(), element);
82     loadPendingImage(document, style.maskBoxImageSource(), element);
83
84     if (auto* reflection = style.boxReflect())
85         loadPendingImage(document, reflection->mask().image(), element);
86
87     for (auto* maskLayer = style.maskLayers(); maskLayer; maskLayer = maskLayer->next())
88         loadPendingImage(document, maskLayer->image(), element);
89
90     if (style.shapeOutside())
91         loadPendingImage(document, style.shapeOutside()->image(), element, LoadPolicy::ShapeOutside);
92 }
93
94 }
95 }