[CSS Shapes] CORS-enabled fetch for shape image values
[WebKit-https.git] / Source / WebCore / rendering / shapes / ShapeInfo.cpp
1 /*
2  * Copyright (C) 2012 Adobe Systems Incorporated. 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  *
8  * 1. Redistributions of source code must retain the above
9  *    copyright notice, this list of conditions and the following
10  *    disclaimer.
11  * 2. Redistributions in binary form must reproduce the above
12  *    copyright notice, this list of conditions and the following
13  *    disclaimer in the documentation and/or other materials
14  *    provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER "AS IS" AND ANY
17  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
20  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
21  * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
25  * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
26  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  */
29
30 #include "config.h"
31 #include "ShapeInfo.h"
32
33 #if ENABLE(CSS_SHAPES)
34
35 #include "RenderBlock.h"
36 #include "RenderBox.h"
37 #include "RenderRegion.h"
38 #include "RenderStyle.h"
39 #include "Shape.h"
40
41 namespace WebCore {
42
43
44 bool checkShapeImageOrigin(Document& document, CachedImage& cachedImage)
45 {
46     if (cachedImage.isOriginClean(document.securityOrigin()))
47         return true;
48
49     const URL& url = cachedImage.url();
50     String urlString = url.isNull() ? "''" : url.stringCenterEllipsizedToLength();
51     document.addConsoleMessage(SecurityMessageSource, ErrorMessageLevel, "Unsafe attempt to load URL " + urlString + ".");
52
53     return false;
54 }
55
56 template<class RenderType>
57 const Shape* ShapeInfo<RenderType>::computedShape() const
58 {
59     if (Shape* shape = m_shape.get())
60         return shape;
61
62     WritingMode writingMode = m_renderer->style()->writingMode();
63     Length margin = m_renderer->style()->shapeMargin();
64     Length padding = m_renderer->style()->shapePadding();
65     float shapeImageThreshold = m_renderer->style()->shapeImageThreshold();
66     const ShapeValue* shapeValue = this->shapeValue();
67     ASSERT(shapeValue);
68
69     switch (shapeValue->type()) {
70     case ShapeValue::Shape:
71         ASSERT(shapeValue->shape());
72         m_shape = Shape::createShape(shapeValue->shape(), m_shapeLogicalSize, writingMode, margin, padding);
73         break;
74     case ShapeValue::Image:
75         ASSERT(shapeValue->image());
76         m_shape = Shape::createShape(shapeValue->image(), shapeImageThreshold, m_shapeLogicalSize, writingMode, margin, padding);
77         break;
78     default:
79         ASSERT_NOT_REACHED();
80     }
81
82     ASSERT(m_shape);
83     return m_shape.get();
84 }
85
86 template<class RenderType>
87 SegmentList ShapeInfo<RenderType>::computeSegmentsForLine(LayoutUnit lineTop, LayoutUnit lineHeight) const
88 {
89     ASSERT(lineHeight >= 0);
90     SegmentList segments;
91
92     getIntervals((lineTop - logicalTopOffset()), std::min(lineHeight, shapeLogicalBottom() - lineTop), segments);
93
94     for (size_t i = 0; i < segments.size(); i++) {
95         segments[i].logicalLeft += logicalLeftOffset();
96         segments[i].logicalRight += logicalLeftOffset();
97     }
98
99     return segments;
100 }
101
102 template class ShapeInfo<RenderBlock>;
103 template class ShapeInfo<RenderBox>;
104 }
105 #endif