StyleResolveForDocument.cpp [plain text]
#include "config.h"
#include "StyleResolveForDocument.h"
#include "CSSFontSelector.h"
#include "Document.h"
#include "Frame.h"
#include "FrameView.h"
#include "HTMLIFrameElement.h"
#include "LocaleToScriptMapping.h"
#include "NodeRenderStyle.h"
#include "RenderObject.h"
#include "RenderStyle.h"
#include "RenderView.h"
#include "Settings.h"
#include "StyleFontSizeFunctions.h"
#include "StyleResolver.h"
namespace WebCore {
namespace Style {
PassRef<RenderStyle> resolveForDocument(const Document& document)
{
ASSERT(document.hasLivingRenderTree());
RenderView& renderView = *document.renderView();
auto documentStyle = RenderStyle::create();
documentStyle.get().setDisplay(BLOCK);
documentStyle.get().setRTLOrdering(document.visuallyOrdered() ? VisualOrder : LogicalOrder);
documentStyle.get().setZoom(!document.printing() ? renderView.frame().pageZoomFactor() : 1);
documentStyle.get().setPageScaleTransform(renderView.frame().frameScaleFactor());
documentStyle.get().setLocale(document.contentLanguage());
documentStyle.get().setUserModify(document.inDesignMode() ? READ_WRITE : READ_ONLY);
#if PLATFORM(IOS)
if (document.inDesignMode())
documentStyle.get().setTextSizeAdjust(TextSizeAdjustment(NoTextSizeAdjustment));
#endif
Element* docElement = document.documentElement();
RenderObject* docElementRenderer = docElement ? docElement->renderer() : 0;
if (docElementRenderer) {
RenderObject* bodyRenderer = document.body() ? document.body()->renderer() : 0;
if (bodyRenderer && !document.writingModeSetOnDocumentElement())
documentStyle.get().setWritingMode(bodyRenderer->style().writingMode());
else
documentStyle.get().setWritingMode(docElementRenderer->style().writingMode());
if (bodyRenderer && !document.directionSetOnDocumentElement())
documentStyle.get().setDirection(bodyRenderer->style().direction());
else
documentStyle.get().setDirection(docElementRenderer->style().direction());
}
const Pagination& pagination = renderView.frameView().pagination();
if (pagination.mode != Pagination::Unpaginated) {
documentStyle.get().setColumnStylesFromPaginationMode(pagination.mode);
documentStyle.get().setColumnGap(pagination.gap);
if (renderView.multiColumnFlowThread())
renderView.updateColumnProgressionFromStyle(&documentStyle.get());
}
const Settings& settings = renderView.frame().settings();
FontDescription fontDescription;
fontDescription.setScript(localeToScriptCodeForFontSelection(documentStyle.get().locale()));
fontDescription.setUsePrinterFont(document.printing() || !settings.screenFontSubstitutionEnabled());
fontDescription.setRenderingMode(settings.fontRenderingMode());
const AtomicString& standardFont = settings.standardFontFamily(fontDescription.script());
if (!standardFont.isEmpty()) {
fontDescription.setGenericFamily(FontDescription::StandardFamily);
fontDescription.setOneFamily(standardFont);
}
fontDescription.setKeywordSize(CSSValueMedium - CSSValueXxSmall + 1);
int size = fontSizeForKeyword(CSSValueMedium, false, document);
fontDescription.setSpecifiedSize(size);
bool useSVGZoomRules = document.isSVGDocument();
fontDescription.setComputedSize(computedFontSizeFromSpecifiedSize(size, fontDescription.isAbsoluteSize(), useSVGZoomRules, &documentStyle.get(), document));
FontOrientation fontOrientation;
NonCJKGlyphOrientation glyphOrientation;
documentStyle.get().getFontAndGlyphOrientation(fontOrientation, glyphOrientation);
fontDescription.setOrientation(fontOrientation);
fontDescription.setNonCJKGlyphOrientation(glyphOrientation);
documentStyle.get().setFontDescription(fontDescription);
CSSFontSelector* fontSelector = document.styleResolverIfExists() ? document.styleResolverIfExists()->fontSelector() : 0;
documentStyle.get().font().update(fontSelector);
return documentStyle;
}
}
}