Move locale information into FontDescription
[WebKit-https.git] / Source / WebCore / style / StyleResolveForDocument.cpp
1 /*
2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3  *           (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com)
4  * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com)
5  * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights reserved.
6  * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org>
7  * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org>
8  * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
9  * Copyright (c) 2011, Code Aurora Forum. All rights reserved.
10  * Copyright (C) Research In Motion Limited 2011. All rights reserved.
11  * Copyright (C) 2012 Google Inc. All rights reserved.
12  *
13  * This library is free software; you can redistribute it and/or
14  * modify it under the terms of the GNU Library General Public
15  * License as published by the Free Software Foundation; either
16  * version 2 of the License, or (at your option) any later version.
17  *
18  * This library is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21  * Library General Public License for more details.
22  *
23  * You should have received a copy of the GNU Library General Public License
24  * along with this library; see the file COPYING.LIB.  If not, write to
25  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
26  * Boston, MA 02110-1301, USA.
27  */
28
29 #include "config.h"
30 #include "StyleResolveForDocument.h"
31
32 #include "CSSFontSelector.h"
33 #include "Document.h"
34 #include "Frame.h"
35 #include "FrameView.h"
36 #include "HTMLIFrameElement.h"
37 #include "LocaleToScriptMapping.h"
38 #include "NodeRenderStyle.h"
39 #include "RenderObject.h"
40 #include "RenderStyle.h"
41 #include "RenderView.h"
42 #include "Settings.h"
43 #include "StyleFontSizeFunctions.h"
44 #include "StyleResolver.h"
45
46 namespace WebCore {
47
48 namespace Style {
49
50 Ref<RenderStyle> resolveForDocument(const Document& document)
51 {
52     ASSERT(document.hasLivingRenderTree());
53
54     RenderView& renderView = *document.renderView();
55
56     auto documentStyle = RenderStyle::create();
57
58     documentStyle.get().setDisplay(BLOCK);
59     documentStyle.get().setRTLOrdering(document.visuallyOrdered() ? VisualOrder : LogicalOrder);
60     documentStyle.get().setZoom(!document.printing() ? renderView.frame().pageZoomFactor() : 1);
61     documentStyle.get().setPageScaleTransform(renderView.frame().frameScaleFactor());
62     FontCascadeDescription documentFontDescription = documentStyle.get().fontDescription();
63     documentFontDescription.setLocale(document.contentLanguage());
64     documentStyle.get().setFontDescription(WTF::move(documentFontDescription));
65
66     // This overrides any -webkit-user-modify inherited from the parent iframe.
67     documentStyle.get().setUserModify(document.inDesignMode() ? READ_WRITE : READ_ONLY);
68 #if PLATFORM(IOS)
69     if (document.inDesignMode())
70         documentStyle.get().setTextSizeAdjust(TextSizeAdjustment(NoTextSizeAdjustment));
71 #endif
72
73     Element* docElement = document.documentElement();
74     RenderObject* docElementRenderer = docElement ? docElement->renderer() : nullptr;
75     if (docElementRenderer) {
76         // Use the direction and writing-mode of the body to set the
77         // viewport's direction and writing-mode unless the property is set on the document element.
78         // If there is no body, then use the document element.
79         auto* body = document.bodyOrFrameset();
80         RenderObject* bodyRenderer = body ? body->renderer() : nullptr;
81         if (bodyRenderer && !document.writingModeSetOnDocumentElement())
82             documentStyle.get().setWritingMode(bodyRenderer->style().writingMode());
83         else
84             documentStyle.get().setWritingMode(docElementRenderer->style().writingMode());
85         if (bodyRenderer && !document.directionSetOnDocumentElement())
86             documentStyle.get().setDirection(bodyRenderer->style().direction());
87         else
88             documentStyle.get().setDirection(docElementRenderer->style().direction());
89     }
90
91     const Pagination& pagination = renderView.frameView().pagination();
92     if (pagination.mode != Pagination::Unpaginated) {
93         documentStyle.get().setColumnStylesFromPaginationMode(pagination.mode);
94         documentStyle.get().setColumnGap(pagination.gap);
95         if (renderView.multiColumnFlowThread())
96             renderView.updateColumnProgressionFromStyle(documentStyle.get());
97     }
98
99     const Settings& settings = renderView.frame().settings();
100
101     FontCascadeDescription fontDescription;
102     fontDescription.setLocale(document.contentLanguage());
103     fontDescription.setRenderingMode(settings.fontRenderingMode());
104     fontDescription.setOneFamily(standardFamily);
105
106     fontDescription.setKeywordSizeFromIdentifier(CSSValueMedium);
107     int size = fontSizeForKeyword(CSSValueMedium, false, document);
108     fontDescription.setSpecifiedSize(size);
109     bool useSVGZoomRules = document.isSVGDocument();
110     fontDescription.setComputedSize(computedFontSizeFromSpecifiedSize(size, fontDescription.isAbsoluteSize(), useSVGZoomRules, documentStyle.ptr(), document));
111
112     FontOrientation fontOrientation;
113     NonCJKGlyphOrientation glyphOrientation;
114     std::tie(fontOrientation, glyphOrientation) = documentStyle.get().fontAndGlyphOrientation();
115     fontDescription.setOrientation(fontOrientation);
116     fontDescription.setNonCJKGlyphOrientation(glyphOrientation);
117
118     documentStyle.get().setFontDescription(fontDescription);
119
120     documentStyle.get().fontCascade().update(&const_cast<Document&>(document).fontSelector());
121
122     return documentStyle;
123 }
124
125 }
126 }