15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 1999 Antti Koivisto (koivisto@kde.org) 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 2001 Dirk Mueller (mueller@kde.org) 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 2006 Alexey Proskuryakov (ap@webkit.org) 6c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012 Apple Inc. All rights reserved. 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/) 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) 9c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * Copyright (C) 2013 Google Inc. All rights reserved. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version. 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful, 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details. 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB. If not, write to 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA. 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/DocumentStyleSheetCollection.h" 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#include "core/css/resolver/StyleResolver.h" 3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h" 3209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/dom/DocumentStyleSheetCollector.h" 3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ProcessingInstruction.h" 349bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#include "core/dom/StyleEngine.h" 3509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/dom/StyleSheetCandidate.h" 365d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "platform/RuntimeEnabledFeatures.h" 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 38c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 408abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)DocumentStyleSheetCollection::DocumentStyleSheetCollection(TreeScope& treeScope) 4109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) : TreeScopeStyleSheetCollection(treeScope) 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ASSERT(treeScope.rootNode() == treeScope.rootNode().document()); 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void DocumentStyleSheetCollection::collectStyleSheetsFromCandidates(StyleEngine* engine, DocumentStyleSheetCollector& collector) 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 48c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) DocumentOrderedList::iterator begin = m_styleSheetCandidateNodes.begin(); 49c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) DocumentOrderedList::iterator end = m_styleSheetCandidateNodes.end(); 50c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) for (DocumentOrderedList::iterator it = begin; it != end; ++it) { 51c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) Node* n = *it; 5209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) StyleSheetCandidate candidate(*n); 5309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 545d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) ASSERT(!candidate.isXSL()); 5509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (candidate.isImport()) { 5609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) Document* document = candidate.importedDocument(); 5709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!document) 5809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) continue; 59d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (collector.hasVisited(document)) 60d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) continue; 61d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) collector.willVisit(document); 6209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) document->styleEngine()->updateStyleSheetsInImport(collector); 6309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) continue; 64e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } 6551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 6609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (candidate.isEnabledAndLoading()) { 6709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // it is loading but we should still decide which style sheet set to use 6809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (candidate.hasPreferrableName(engine->preferredStylesheetSetName())) 6909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) engine->selectStylesheetSetName(candidate.title()); 7009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) continue; 7109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) StyleSheet* sheet = candidate.sheet(); 7409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!sheet) 7509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) continue; 7609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 7709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (candidate.hasPreferrableName(engine->preferredStylesheetSetName())) 7809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) engine->selectStylesheetSetName(candidate.title()); 7909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) collector.appendSheetForList(sheet); 8009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (candidate.canBeActivated(engine->preferredStylesheetSetName())) 8109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) collector.appendActiveStyleSheet(toCSSStyleSheet(sheet)); 8209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 83c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)} 84c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) 8509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void DocumentStyleSheetCollection::collectStyleSheets(StyleEngine* engine, DocumentStyleSheetCollector& collector) 86c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){ 8709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ASSERT(document().styleEngine() == engine); 8809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) collector.appendActiveStyleSheets(engine->injectedAuthorStyleSheets()); 8909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) collector.appendActiveStyleSheets(engine->documentAuthorStyleSheets()); 9009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) collectStyleSheetsFromCandidates(engine, collector); 91a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)} 92a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 935d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void DocumentStyleSheetCollection::updateActiveStyleSheets(StyleEngine* engine, StyleResolverUpdateMode updateMode) 94a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){ 9509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) StyleSheetCollection collection; 9609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ActiveDocumentStyleSheetCollector collector(collection); 9709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) collectStyleSheets(engine, collector); 9851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 9951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) StyleSheetChange change; 10051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) analyzeStyleSheetChange(updateMode, collection, change); 10151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 10251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (change.styleResolverUpdateType == Reconstruct) { 103a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) engine->clearMasterResolver(); 10409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // FIMXE: The following depends on whether StyleRuleFontFace was modified or not. 10509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // No need to always-clear font cache. 10609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) engine->clearFontCache(); 107a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) } else if (StyleResolver* styleResolver = engine->resolver()) { 10851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (change.styleResolverUpdateType != Additive) { 10909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ASSERT(change.styleResolverUpdateType == Reset); 110c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) styleResolver->resetAuthorStyle(treeScope()); 11109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) engine->removeFontFaceRules(change.fontFaceRulesToRemove); 11251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) styleResolver->removePendingAuthorStyleSheets(m_activeAuthorStyleSheets); 11351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) styleResolver->lazyAppendAuthorStyleSheets(0, collection.activeAuthorStyleSheets()); 114c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) } else { 11551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) styleResolver->lazyAppendAuthorStyleSheets(m_activeAuthorStyleSheets.size(), collection.activeAuthorStyleSheets()); 116e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } 117e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } 1185d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (change.requiresFullStyleRecalc) 1195d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) document().setNeedsStyleRecalc(SubtreeStyleChange); 1205d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 12151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) collection.swap(*this); 12209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 123c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) updateUsesRemUnits(); 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 127