15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010, Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorCSSAgent.h" 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "CSSPropertyNames.h" 2906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "FetchInitiatorTypeNames.h" 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "InspectorTypeBuilder.h" 317757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "StylePropertyShorthand.h" 321fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch#include "bindings/v8/ExceptionState.h" 331fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch#include "bindings/v8/ExceptionStatePlaceholder.h" 3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSComputedStyleDeclaration.h" 3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSImportRule.h" 36521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "core/css/CSSMediaRule.h" 3793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "core/css/CSSParser.h" 3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSRule.h" 3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSRuleList.h" 4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSStyleRule.h" 4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSStyleSheet.h" 42521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "core/css/MediaList.h" 4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/StylePropertySet.h" 4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/StyleRule.h" 4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/StyleSheet.h" 46521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "core/css/StyleSheetContents.h" 4753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/StyleSheetList.h" 4881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#include "core/css/resolver/StyleResolver.h" 4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/NamedFlow.h" 5053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/NamedFlowCollection.h" 5153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Node.h" 5253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/NodeList.h" 5306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/fetch/CSSStyleSheetResource.h" 5406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/fetch/ResourceClient.h" 5506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/fetch/ResourceFetcher.h" 5606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/fetch/StyleSheetResourceClient.h" 5753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLHeadElement.h" 5853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorHistory.h" 5981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#include "core/inspector/InspectorPageAgent.h" 6006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/inspector/InspectorResourceAgent.h" 6153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorState.h" 6253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InstrumentingAgents.h" 6393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "core/loader/DocumentLoader.h" 6451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/frame/Frame.h" 6551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/page/Page.h" 66e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/rendering/InlineTextBox.h" 67e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/rendering/RenderObject.h" 6853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderRegion.h" 69e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/rendering/RenderText.h" 70e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/rendering/RenderTextFragment.h" 71a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/fonts/Font.h" 7219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)#include "platform/fonts/GlyphBuffer.h" 73a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/fonts/WidthIterator.h" 74a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/text/TextRun.h" 75591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/CurrentTime.h" 76591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/CString.h" 77591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/StringConcatenate.h" 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace CSSAgentState { 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char cssAgentEnabled[] = "cssAgentEnabled"; 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)typedef WebCore::InspectorBackendDispatcher::CSSCommandHandler::EnableCallback EnableCallback; 8406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum ForcePseudoClassFlags { 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PseudoNone = 0, 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PseudoHover = 1 << 0, 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PseudoFocus = 1 << 1, 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PseudoActive = 1 << 2, 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PseudoVisited = 1 << 3 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)class StyleSheetAppender { 9653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)public: 9751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) StyleSheetAppender(Vector<CSSStyleSheet*>& result) 9851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) : m_result(result) { } 9953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 10053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) void run(CSSStyleSheet* styleSheet) 10153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) { 10253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_result.append(styleSheet); 10353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (unsigned i = 0, size = styleSheet->length(); i < size; ++i) { 10453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) CSSRule* rule = styleSheet->item(i); 10553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (rule->type() == CSSRule::IMPORT_RULE) { 10606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) CSSStyleSheet* importedStyleSheet = toCSSImportRule(rule)->styleSheet(); 10753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (importedStyleSheet) 10853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) run(importedStyleSheet); 10953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 11053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 11153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 11253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 11353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)private: 11453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) Vector<CSSStyleSheet*>& m_result; 11553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}; 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 117591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochstatic unsigned computePseudoClassMask(JSONArray* pseudoClassArray) 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1193c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch DEFINE_STATIC_LOCAL(String, active, ("active")); 1203c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch DEFINE_STATIC_LOCAL(String, hover, ("hover")); 1213c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch DEFINE_STATIC_LOCAL(String, focus, ("focus")); 1223c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch DEFINE_STATIC_LOCAL(String, visited, ("visited")); 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!pseudoClassArray || !pseudoClassArray->length()) 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return PseudoNone; 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned result = PseudoNone; 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t i = 0; i < pseudoClassArray->length(); ++i) { 128591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch RefPtr<JSONValue> pseudoClassValue = pseudoClassArray->get(i); 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String pseudoClass; 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool success = pseudoClassValue->asString(&pseudoClass); 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!success) 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (pseudoClass == active) 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result |= PseudoActive; 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (pseudoClass == hover) 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result |= PseudoHover; 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (pseudoClass == focus) 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result |= PseudoFocus; 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (pseudoClass == visited) 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result |= PseudoVisited; 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class UpdateRegionLayoutTask { 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) UpdateRegionLayoutTask(InspectorCSSAgent*); 14953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) void scheduleFor(NamedFlow*, int documentNodeId); 15053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) void unschedule(NamedFlow*); 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void reset(); 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void onTimer(Timer<UpdateRegionLayoutTask>*); 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorCSSAgent* m_cssAgent; 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Timer<UpdateRegionLayoutTask> m_timer; 15753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) HashMap<NamedFlow*, int> m_namedFlows; 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)UpdateRegionLayoutTask::UpdateRegionLayoutTask(InspectorCSSAgent* cssAgent) 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_cssAgent(cssAgent) 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_timer(this, &UpdateRegionLayoutTask::onTimer) 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void UpdateRegionLayoutTask::scheduleFor(NamedFlow* namedFlow, int documentNodeId) 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_namedFlows.add(namedFlow, documentNodeId); 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_timer.isActive()) 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_timer.startOneShot(0); 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void UpdateRegionLayoutTask::unschedule(NamedFlow* namedFlow) 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_namedFlows.remove(namedFlow); 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void UpdateRegionLayoutTask::reset() 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_timer.stop(); 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_namedFlows.clear(); 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void UpdateRegionLayoutTask::onTimer(Timer<UpdateRegionLayoutTask>*) 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The timer is stopped on m_cssAgent destruction, so this method will never be called after m_cssAgent has been destroyed. 18853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) Vector<std::pair<NamedFlow*, int> > namedFlows; 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 19053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (HashMap<NamedFlow*, int>::iterator it = m_namedFlows.begin(), end = m_namedFlows.end(); it != end; ++it) 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) namedFlows.append(std::make_pair(it->key, it->value)); 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned i = 0, size = namedFlows.size(); i < size; ++i) { 19453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) NamedFlow* namedFlow = namedFlows.at(i).first; 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int documentNodeId = namedFlows.at(i).second; 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_namedFlows.contains(namedFlow)) { 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_cssAgent->regionLayoutUpdated(namedFlow, documentNodeId); 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_namedFlows.remove(namedFlow); 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_namedFlows.isEmpty() && !m_timer.isActive()) 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_timer.startOneShot(0); 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 207591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochclass ChangeRegionOversetTask { 208591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochpublic: 209591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch ChangeRegionOversetTask(InspectorCSSAgent*); 210591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch void scheduleFor(NamedFlow*, int documentNodeId); 211591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch void unschedule(NamedFlow*); 212591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch void reset(); 213591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch void onTimer(Timer<ChangeRegionOversetTask>*); 214591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 215591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochprivate: 216591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch InspectorCSSAgent* m_cssAgent; 217591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch Timer<ChangeRegionOversetTask> m_timer; 218591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch HashMap<NamedFlow*, int> m_namedFlows; 219591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch}; 220591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 221591b958dee2cf159d33a0b931e6231072eaf38d5Ben MurdochChangeRegionOversetTask::ChangeRegionOversetTask(InspectorCSSAgent* cssAgent) 222591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch : m_cssAgent(cssAgent) 223591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch , m_timer(this, &ChangeRegionOversetTask::onTimer) 224591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 225591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 226591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 227591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid ChangeRegionOversetTask::scheduleFor(NamedFlow* namedFlow, int documentNodeId) 228591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 229591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_namedFlows.add(namedFlow, documentNodeId); 230591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 231591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (!m_timer.isActive()) 232591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_timer.startOneShot(0); 233591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 234591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 235591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid ChangeRegionOversetTask::unschedule(NamedFlow* namedFlow) 236591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 237591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_namedFlows.remove(namedFlow); 238591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 239591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 240591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid ChangeRegionOversetTask::reset() 241591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 242591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_timer.stop(); 243591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_namedFlows.clear(); 244591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 245591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 246591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid ChangeRegionOversetTask::onTimer(Timer<ChangeRegionOversetTask>*) 247591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 248591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch // The timer is stopped on m_cssAgent destruction, so this method will never be called after m_cssAgent has been destroyed. 249591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch for (HashMap<NamedFlow*, int>::iterator it = m_namedFlows.begin(), end = m_namedFlows.end(); it != end; ++it) 250591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_cssAgent->regionOversetChanged(it->key, it->value); 251591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 252591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_namedFlows.clear(); 253591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 254591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class InspectorCSSAgent::StyleSheetAction : public InspectorHistory::Action { 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WTF_MAKE_NONCOPYABLE(StyleSheetAction); 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) StyleSheetAction(const String& name, InspectorStyleSheet* styleSheet) 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : InspectorHistory::Action(name) 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_styleSheet(styleSheet) 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected: 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<InspectorStyleSheet> m_styleSheet; 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)class InspectorCSSAgent::EnableResourceClient : public StyleSheetResourceClient { 26906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)public: 27006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) EnableResourceClient(InspectorCSSAgent*, const Vector<InspectorStyleSheet*>&, PassRefPtr<EnableCallback>); 27106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 27206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) virtual void setCSSStyleSheet(const String&, const KURL&, const String&, const CSSStyleSheetResource*) OVERRIDE; 27306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 27406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)private: 27506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) RefPtr<EnableCallback> m_callback; 27606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) InspectorCSSAgent* m_cssAgent; 27706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) int m_pendingResources; 27806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) Vector<InspectorStyleSheet*> m_styleSheets; 27906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)}; 28006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 28106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)InspectorCSSAgent::EnableResourceClient::EnableResourceClient(InspectorCSSAgent* cssAgent, const Vector<InspectorStyleSheet*>& styleSheets, PassRefPtr<EnableCallback> callback) 28206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) : m_callback(callback) 28306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) , m_cssAgent(cssAgent) 28406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) , m_pendingResources(styleSheets.size()) 28506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) , m_styleSheets(styleSheets) 28606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles){ 28706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) for (size_t i = 0; i < styleSheets.size(); ++i) { 28806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) InspectorStyleSheet* styleSheet = styleSheets.at(i); 28906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) Document* document = styleSheet->ownerDocument(); 2901e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) FetchRequest request(ResourceRequest(styleSheet->finalURL()), FetchInitiatorTypeNames::internal); 29106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) ResourcePtr<Resource> resource = document->fetcher()->fetchCSSStyleSheet(request); 29206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) resource->addClient(this); 29306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) } 29406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)} 29506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 29606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)void InspectorCSSAgent::EnableResourceClient::setCSSStyleSheet(const String&, const KURL& url, const String&, const CSSStyleSheetResource* resource) 29706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles){ 29806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) const_cast<CSSStyleSheetResource*>(resource)->removeClient(this); 29906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) --m_pendingResources; 30006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) if (m_pendingResources) 30106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) return; 30206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 30306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) // enable always succeeds. 30406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) if (m_callback->isActive()) 30506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) m_cssAgent->wasEnabled(m_callback.release()); 30606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) delete this; 30706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)} 30806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class InspectorCSSAgent::SetStyleSheetTextAction : public InspectorCSSAgent::StyleSheetAction { 3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WTF_MAKE_NONCOPYABLE(SetStyleSheetTextAction); 3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SetStyleSheetTextAction(InspectorStyleSheet* styleSheet, const String& text) 3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : InspectorCSSAgent::StyleSheetAction("SetStyleSheetText", styleSheet) 3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_text(text) 3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 31851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) virtual bool perform(ExceptionState& exceptionState) 3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_styleSheet->getText(&m_oldText)) 3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 32251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return redo(exceptionState); 3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 32551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) virtual bool undo(ExceptionState& exceptionState) 3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 32751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (m_styleSheet->setText(m_oldText, exceptionState)) { 3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_styleSheet->reparseStyleSheet(m_oldText); 3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 33451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) virtual bool redo(ExceptionState& exceptionState) 3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 33651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (m_styleSheet->setText(m_text, exceptionState)) { 3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_styleSheet->reparseStyleSheet(m_text); 3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual String mergeId() 3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return String::format("SetStyleSheetText %s", m_styleSheet->id().utf8().data()); 3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void merge(PassOwnPtr<Action> action) 3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(action->mergeId() == mergeId()); 3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SetStyleSheetTextAction* other = static_cast<SetStyleSheetTextAction*>(action.get()); 3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_text = other->m_text; 3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String m_text; 3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String m_oldText; 3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 36153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)class InspectorCSSAgent::SetStyleTextAction : public InspectorCSSAgent::StyleSheetAction { 36253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) WTF_MAKE_NONCOPYABLE(SetStyleTextAction); 36353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)public: 36453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) SetStyleTextAction(InspectorStyleSheet* styleSheet, const InspectorCSSId& cssId, const String& text) 36553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) : InspectorCSSAgent::StyleSheetAction("SetPropertyText", styleSheet) 36653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) , m_cssId(cssId) 36753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) , m_text(text) 36853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) { 36953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 37053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 37153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) virtual String toString() 37253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) { 37353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return mergeId() + ": " + m_oldText + " -> " + m_text; 37453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 37553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 37651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) virtual bool perform(ExceptionState& exceptionState) 37753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) { 37851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return redo(exceptionState); 37953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 38053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 38151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) virtual bool undo(ExceptionState& exceptionState) 38253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) { 38353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) String placeholder; 38451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return m_styleSheet->setStyleText(m_cssId, m_oldText, &placeholder, exceptionState); 38553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 38653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 38751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) virtual bool redo(ExceptionState& exceptionState) 38853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) { 38951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return m_styleSheet->setStyleText(m_cssId, m_text, &m_oldText, exceptionState); 39053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 39153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 39253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) virtual String mergeId() 39353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) { 39453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return String::format("SetStyleText %s:%u", m_cssId.styleSheetId().utf8().data(), m_cssId.ordinal()); 39553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 39653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 39753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) virtual void merge(PassOwnPtr<Action> action) 39853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) { 39953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) ASSERT(action->mergeId() == mergeId()); 40053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 40153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) SetStyleTextAction* other = static_cast<SetStyleTextAction*>(action.get()); 40253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_text = other->m_text; 40353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 40453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 40553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)private: 40653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) InspectorCSSId m_cssId; 40753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) String m_text; 40853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) String m_oldText; 40953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}; 41053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class InspectorCSSAgent::SetPropertyTextAction : public InspectorCSSAgent::StyleSheetAction { 4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WTF_MAKE_NONCOPYABLE(SetPropertyTextAction); 4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SetPropertyTextAction(InspectorStyleSheet* styleSheet, const InspectorCSSId& cssId, unsigned propertyIndex, const String& text, bool overwrite) 4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : InspectorCSSAgent::StyleSheetAction("SetPropertyText", styleSheet) 4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_cssId(cssId) 4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_propertyIndex(propertyIndex) 4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_text(text) 4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_overwrite(overwrite) 4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual String toString() 4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return mergeId() + ": " + m_oldText + " -> " + m_text; 4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 42851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) virtual bool perform(ExceptionState& exceptionState) 4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 43051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return redo(exceptionState); 4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 43351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) virtual bool undo(ExceptionState& exceptionState) 4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String placeholder; 43651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return m_styleSheet->setPropertyText(m_cssId, m_propertyIndex, m_overwrite ? m_oldText : "", true, &placeholder, exceptionState); 4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 43951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) virtual bool redo(ExceptionState& exceptionState) 4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String oldText; 44251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) bool result = m_styleSheet->setPropertyText(m_cssId, m_propertyIndex, m_text, m_overwrite, &oldText, exceptionState); 4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_oldText = oldText.stripWhiteSpace(); 4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: remove this once the model handles this case. 4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_oldText.endsWith(';')) 4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_oldText.append(';'); 4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; 4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual String mergeId() 4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return String::format("SetPropertyText %s:%u:%s", m_styleSheet->id().utf8().data(), m_propertyIndex, m_overwrite ? "true" : "false"); 4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void merge(PassOwnPtr<Action> action) 4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(action->mergeId() == mergeId()); 4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SetPropertyTextAction* other = static_cast<SetPropertyTextAction*>(action.get()); 4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_text = other->m_text; 4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorCSSId m_cssId; 4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned m_propertyIndex; 4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String m_text; 4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String m_oldText; 4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool m_overwrite; 4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class InspectorCSSAgent::TogglePropertyAction : public InspectorCSSAgent::StyleSheetAction { 4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WTF_MAKE_NONCOPYABLE(TogglePropertyAction); 4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) TogglePropertyAction(InspectorStyleSheet* styleSheet, const InspectorCSSId& cssId, unsigned propertyIndex, bool disable) 4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : InspectorCSSAgent::StyleSheetAction("ToggleProperty", styleSheet) 4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_cssId(cssId) 4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_propertyIndex(propertyIndex) 4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_disable(disable) 4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 48251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) virtual bool perform(ExceptionState& exceptionState) 4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 48451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return redo(exceptionState); 4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 48751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) virtual bool undo(ExceptionState& exceptionState) 4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 48951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return m_styleSheet->toggleProperty(m_cssId, m_propertyIndex, !m_disable, exceptionState); 4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 49251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) virtual bool redo(ExceptionState& exceptionState) 4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 49451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return m_styleSheet->toggleProperty(m_cssId, m_propertyIndex, m_disable, exceptionState); 4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorCSSId m_cssId; 4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned m_propertyIndex; 5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool m_disable; 5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class InspectorCSSAgent::SetRuleSelectorAction : public InspectorCSSAgent::StyleSheetAction { 5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WTF_MAKE_NONCOPYABLE(SetRuleSelectorAction); 5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SetRuleSelectorAction(InspectorStyleSheet* styleSheet, const InspectorCSSId& cssId, const String& selector) 5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : InspectorCSSAgent::StyleSheetAction("SetRuleSelector", styleSheet) 5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_cssId(cssId) 5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_selector(selector) 5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 51351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) virtual bool perform(ExceptionState& exceptionState) 5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 51551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) m_oldSelector = m_styleSheet->ruleSelector(m_cssId, exceptionState); 51651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (exceptionState.hadException()) 5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 51851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return redo(exceptionState); 5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 52151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) virtual bool undo(ExceptionState& exceptionState) 5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 52351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return m_styleSheet->setRuleSelector(m_cssId, m_oldSelector, exceptionState); 5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 52651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) virtual bool redo(ExceptionState& exceptionState) 5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 52851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return m_styleSheet->setRuleSelector(m_cssId, m_selector, exceptionState); 5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorCSSId m_cssId; 5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String m_selector; 5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String m_oldSelector; 5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class InspectorCSSAgent::AddRuleAction : public InspectorCSSAgent::StyleSheetAction { 5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WTF_MAKE_NONCOPYABLE(AddRuleAction); 5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) AddRuleAction(InspectorStyleSheet* styleSheet, const String& selector) 5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : InspectorCSSAgent::StyleSheetAction("AddRule", styleSheet) 5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_selector(selector) 5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 54651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) virtual bool perform(ExceptionState& exceptionState) 5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 54851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return redo(exceptionState); 5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 55151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) virtual bool undo(ExceptionState& exceptionState) 5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 55351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return m_styleSheet->deleteRule(m_newId, exceptionState); 5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 55651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) virtual bool redo(ExceptionState& exceptionState) 5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 55851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) CSSStyleRule* cssStyleRule = m_styleSheet->addRule(m_selector, exceptionState); 55951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (exceptionState.hadException()) 5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_newId = m_styleSheet->ruleId(cssStyleRule); 5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorCSSId newRuleId() { return m_newId; } 5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorCSSId m_newId; 5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String m_selector; 5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String m_oldSelector; 5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// static 5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)CSSStyleRule* InspectorCSSAgent::asCSSStyleRule(CSSRule* rule) 5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 576521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (!rule || rule->type() != CSSRule::STYLE_RULE) 5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 57806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) return toCSSStyleRule(rule); 5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 581591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochtemplate <typename CharType, size_t bufferLength> 582591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochstatic size_t vendorPrefixLowerCase(const CharType* string, size_t stringLength, char (&buffer)[bufferLength]) 58393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){ 584591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch static const char lowerCaseOffset = 'a' - 'A'; 585591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 586591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (string[0] != '-') 587591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return 0; 588591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 589591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch for (size_t i = 0; i < stringLength - 1; i++) { 590591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch CharType c = string[i + 1]; 591591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (c == '-') 592591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return i; 593591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (i == bufferLength) 594591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch break; 595591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (c < 'A' || c > 'z') 596591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch break; 597591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (c >= 'a') 598591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch buffer[i] = c; 599591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch else if (c <= 'Z') 600591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch buffer[i] = c + lowerCaseOffset; 601591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch else 602591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch break; 60393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) } 604591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return 0; 605591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 606591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 60706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)InspectorCSSAgent::InspectorCSSAgent(InstrumentingAgents* instrumentingAgents, InspectorCompositeState* state, InspectorDOMAgent* domAgent, InspectorPageAgent* pageAgent, InspectorResourceAgent* resourceAgent) 6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : InspectorBaseAgent<InspectorCSSAgent>("CSS", instrumentingAgents, state) 6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_frontend(0) 6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_domAgent(domAgent) 61181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) , m_pageAgent(pageAgent) 61206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) , m_resourceAgent(resourceAgent) 6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_lastStyleSheetId(1) 61451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) , m_styleSheetsPendingMutation(0) 61551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) , m_styleDeclarationPendingMutation(false) 61653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) , m_creatingViaInspectorStyleSheet(false) 6177757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch , m_isSettingStyleSheetText(false) 6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_domAgent->setDOMListener(this); 6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)InspectorCSSAgent::~InspectorCSSAgent() 6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_domAgent); 6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) reset(); 6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::setFrontend(InspectorFrontend* frontend) 6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_frontend); 6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_frontend = frontend->css(); 6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::clearFrontend() 6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_frontend); 6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_frontend = 0; 6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) resetNonPersistentData(); 6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::discardAgent() 6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_domAgent->setDOMListener(0); 6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_domAgent = 0; 6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::restore() 6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 64906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) if (m_state->getBoolean(CSSAgentState::cssAgentEnabled)) 65006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) wasEnabled(0); 6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::reset() 6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_idToInspectorStyleSheet.clear(); 6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_cssStyleSheetToInspectorStyleSheet.clear(); 6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_nodeToInspectorStyleSheet.clear(); 6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_documentToInspectorStyleSheet.clear(); 6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) resetNonPersistentData(); 6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::resetNonPersistentData() 6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_namedFlowCollectionsRequested.clear(); 6655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_updateRegionLayoutTask) 6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_updateRegionLayoutTask->reset(); 667591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (m_changeRegionOversetTask) 668591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_changeRegionOversetTask->reset(); 6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) resetPseudoStates(); 6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 67206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)void InspectorCSSAgent::enable(ErrorString*, PassRefPtr<EnableCallback> prpCallback) 6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_state->setBoolean(CSSAgentState::cssAgentEnabled, true); 67553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 67606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) Vector<InspectorStyleSheet*> styleSheets; 67706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) collectAllStyleSheets(styleSheets); 67806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 67906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) // Re-issue stylesheet requets for resources that are no longer in memory cache. 68006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) Vector<InspectorStyleSheet*> styleSheetsToFetch; 68106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) HashSet<String> urlsToFetch; 68206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) for (size_t i = 0; i < styleSheets.size(); ++i) { 68306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) InspectorStyleSheet* styleSheet = styleSheets.at(i); 68406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) String url = styleSheet->finalURL(); 68506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) if (urlsToFetch.contains(url)) 68606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) continue; 68706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) CSSStyleSheet* pageStyleSheet = styleSheet->pageStyleSheet(); 68806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) if (pageStyleSheet->isInline() || !pageStyleSheet->contents()->loadCompleted()) 68906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) continue; 69006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) Document* document = styleSheet->ownerDocument(); 69106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) if (!document) 69206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) continue; 69306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) Resource* cachedResource = document->fetcher()->cachedResource(url); 69406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) if (cachedResource) 69506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) continue; 69606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) urlsToFetch.add(styleSheet->finalURL()); 69706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) styleSheetsToFetch.append(styleSheet); 69806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) } 69906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 70006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) if (styleSheetsToFetch.isEmpty()) { 70106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) wasEnabled(prpCallback); 70281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) return; 70306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) } 70406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) new EnableResourceClient(this, styleSheetsToFetch, prpCallback); 70506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)} 70606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 70706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)void InspectorCSSAgent::wasEnabled(PassRefPtr<EnableCallback> callback) 70806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles){ 70906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) if (!m_state->getBoolean(CSSAgentState::cssAgentEnabled)) { 71006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) // We were disabled while fetching resources. 71106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) return; 71206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) } 71306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 71453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) Vector<InspectorStyleSheet*> styleSheets; 71553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) collectAllStyleSheets(styleSheets); 71653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (size_t i = 0; i < styleSheets.size(); ++i) 71793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) m_frontend->styleSheetAdded(styleSheets.at(i)->buildObjectForStyleSheetInfo()); 71806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 719f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) // More styleSheetAdded events will be generated below. 72006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) m_instrumentingAgents->setInspectorCSSAgent(this); 721f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) Vector<Document*> documents = m_domAgent->documents(); 722f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) for (Vector<Document*>::iterator it = documents.begin(); it != documents.end(); ++it) 723f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) (*it)->styleEngine()->updateActiveStyleSheets(FullStyleUpdate); 724f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) 725f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (callback) 726f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) callback->sendSuccess(); 7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::disable(ErrorString*) 7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_instrumentingAgents->setInspectorCSSAgent(0); 7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_state->setBoolean(CSSAgentState::cssAgentEnabled, false); 7335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 73593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)void InspectorCSSAgent::didCommitLoad(Frame* frame, DocumentLoader* loader) 73693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){ 73793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (loader->frame() != frame->page()->mainFrame()) 73893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return; 73993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 74093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) reset(); 74193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 74293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::mediaQueryResultChanged() 7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_frontend) 7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_frontend->mediaQueryResultChanged(); 7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 74953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorCSSAgent::didCreateNamedFlow(Document* document, NamedFlow* namedFlow) 7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int documentNodeId = documentNodeWithRequestedFlowsId(document); 7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!documentNodeId) 7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ErrorString errorString; 7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_frontend->namedFlowCreated(buildObjectForNamedFlow(&errorString, namedFlow, documentNodeId)); 7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 75953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorCSSAgent::willRemoveNamedFlow(Document* document, NamedFlow* namedFlow) 7605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int documentNodeId = documentNodeWithRequestedFlowsId(document); 7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!documentNodeId) 7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_updateRegionLayoutTask) 7665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_updateRegionLayoutTask->unschedule(namedFlow); 7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_frontend->namedFlowRemoved(documentNodeId, namedFlow->name().string()); 7695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 77151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void InspectorCSSAgent::willMutateRules() 77251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 77351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) ++m_styleSheetsPendingMutation; 77451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 77551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 77651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void InspectorCSSAgent::didMutateRules(CSSStyleSheet* styleSheet) 77751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 77851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) --m_styleSheetsPendingMutation; 77951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) ASSERT(m_styleSheetsPendingMutation >= 0); 78051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 78151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (!styleSheetEditInProgress()) { 78251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) Document* owner = styleSheet->ownerDocument(); 78351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (owner) 78451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) owner->modifiedStyleSheet(styleSheet, RecalcStyleDeferred, FullStyleUpdate); 78551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) } 78651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 78751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 78851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void InspectorCSSAgent::willMutateStyle() 78951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 79051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) m_styleDeclarationPendingMutation = true; 79151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 79251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 79351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void InspectorCSSAgent::didMutateStyle(CSSStyleDeclaration* style, bool isInlineStyle) 79451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 79551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) ASSERT(m_styleDeclarationPendingMutation); 79651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) m_styleDeclarationPendingMutation = false; 79751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (!styleSheetEditInProgress() && !isInlineStyle) { 79851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) CSSStyleSheet* parentSheet = style->parentStyleSheet(); 79951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) Document* owner = parentSheet ? parentSheet->ownerDocument() : 0; 80051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (owner) 80151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) owner->modifiedStyleSheet(parentSheet, RecalcStyleDeferred, FullStyleUpdate); 80251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) } 80351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 80451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 80553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorCSSAgent::didUpdateRegionLayout(Document* document, NamedFlow* namedFlow) 8065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 8075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int documentNodeId = documentNodeWithRequestedFlowsId(document); 8085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!documentNodeId) 8095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 8105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_updateRegionLayoutTask) 8125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_updateRegionLayoutTask = adoptPtr(new UpdateRegionLayoutTask(this)); 8135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_updateRegionLayoutTask->scheduleFor(namedFlow, documentNodeId); 8145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 81653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorCSSAgent::regionLayoutUpdated(NamedFlow* namedFlow, int documentNodeId) 8175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 81853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (namedFlow->flowState() == NamedFlow::FlowStateNull) 8195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 8205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ErrorString errorString; 82253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) RefPtr<NamedFlow> protector(namedFlow); 8235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_frontend->regionLayoutUpdated(buildObjectForNamedFlow(&errorString, namedFlow, documentNodeId)); 8255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 827591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid InspectorCSSAgent::didChangeRegionOverset(Document* document, NamedFlow* namedFlow) 828591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 829591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch int documentNodeId = documentNodeWithRequestedFlowsId(document); 830591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (!documentNodeId) 831591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return; 832591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 833591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (!m_changeRegionOversetTask) 834591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_changeRegionOversetTask = adoptPtr(new ChangeRegionOversetTask(this)); 835591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_changeRegionOversetTask->scheduleFor(namedFlow, documentNodeId); 836591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 837591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 838591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid InspectorCSSAgent::regionOversetChanged(NamedFlow* namedFlow, int documentNodeId) 839591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 840591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (namedFlow->flowState() == NamedFlow::FlowStateNull) 841591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return; 842591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 843591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch ErrorString errorString; 844591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch RefPtr<NamedFlow> protector(namedFlow); 845591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 846591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_frontend->regionOversetChanged(buildObjectForNamedFlow(&errorString, namedFlow, documentNodeId)); 847591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 848591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 8497757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdochvoid InspectorCSSAgent::activeStyleSheetsUpdated(Document* document, const StyleSheetVector& newSheets) 85053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){ 85151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (styleSheetEditInProgress()) 8527757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch return; 85351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 85453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) HashSet<CSSStyleSheet*> removedSheets; 85553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (CSSStyleSheetToInspectorStyleSheet::iterator it = m_cssStyleSheetToInspectorStyleSheet.begin(); it != m_cssStyleSheetToInspectorStyleSheet.end(); ++it) { 85681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) if (it->value->canBind() && (!it->key->ownerDocument() || it->key->ownerDocument() == document)) 85753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) removedSheets.add(it->key); 85853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 85953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 86053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) Vector<CSSStyleSheet*> newSheetsVector; 86153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (size_t i = 0, size = newSheets.size(); i < size; ++i) { 86253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) StyleSheet* newSheet = newSheets.at(i).get(); 86353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (newSheet->isCSSStyleSheet()) { 86451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) StyleSheetAppender appender(newSheetsVector); 86551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) appender.run(toCSSStyleSheet(newSheet)); 86653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 86753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 86853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 86953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) HashSet<CSSStyleSheet*> addedSheets; 87053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (size_t i = 0; i < newSheetsVector.size(); ++i) { 87153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) CSSStyleSheet* newCSSSheet = newSheetsVector.at(i); 87253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (removedSheets.contains(newCSSSheet)) 87353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) removedSheets.remove(newCSSSheet); 87453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) else 87553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) addedSheets.add(newCSSSheet); 87653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 87753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 87853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (HashSet<CSSStyleSheet*>::iterator it = removedSheets.begin(); it != removedSheets.end(); ++it) { 87953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) RefPtr<InspectorStyleSheet> inspectorStyleSheet = m_cssStyleSheetToInspectorStyleSheet.get(*it); 88053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) ASSERT(inspectorStyleSheet); 88153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (m_idToInspectorStyleSheet.contains(inspectorStyleSheet->id())) { 88253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) String id = unbindStyleSheet(inspectorStyleSheet.get()); 88353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (m_frontend) 88453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_frontend->styleSheetRemoved(id); 88553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 88653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 887fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch 88853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (HashSet<CSSStyleSheet*>::iterator it = addedSheets.begin(); it != addedSheets.end(); ++it) { 88953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (!m_cssStyleSheetToInspectorStyleSheet.contains(*it)) { 89051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) InspectorStyleSheet* newStyleSheet = bindStyleSheet(*it); 89153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (m_frontend) 89293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) m_frontend->styleSheetAdded(newStyleSheet->buildObjectForStyleSheetInfo()); 89353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 89453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 89553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} 89653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 89781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)void InspectorCSSAgent::frameDetachedFromParent(Frame* frame) 89881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles){ 89981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) Document* document = frame->document(); 90081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) if (!document) 90181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) return; 9027757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch StyleSheetVector newSheets; 90381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) activeStyleSheetsUpdated(document, newSheets); 90481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)} 90581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 9065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool InspectorCSSAgent::forcePseudoState(Element* element, CSSSelector::PseudoType pseudoType) 9075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 9085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_nodeIdToForcedPseudoState.isEmpty()) 9095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 9105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int nodeId = m_domAgent->boundNodeId(element); 9125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!nodeId) 9135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 9145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NodeIdToForcedPseudoState::iterator it = m_nodeIdToForcedPseudoState.find(nodeId); 9165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (it == m_nodeIdToForcedPseudoState.end()) 9175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 9185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned forcedPseudoState = it->value; 9205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (pseudoType) { 9215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case CSSSelector::PseudoActive: 9225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return forcedPseudoState & PseudoActive; 9235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case CSSSelector::PseudoFocus: 9245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return forcedPseudoState & PseudoFocus; 9255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case CSSSelector::PseudoHover: 9265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return forcedPseudoState & PseudoHover; 9275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case CSSSelector::PseudoVisited: 9285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return forcedPseudoState & PseudoVisited; 9295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 9305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 9315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 9335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::getMatchedStylesForNode(ErrorString* errorString, int nodeId, const bool* includePseudo, const bool* includeInherited, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::RuleMatch> >& matchedCSSRules, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::PseudoIdMatches> >& pseudoIdMatches, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::InheritedStyleEntry> >& inheritedEntries) 9355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 9365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Element* element = elementForId(errorString, nodeId); 9375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!element) 9385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 9395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9409bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) Element* originalElement = element; 9419bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) PseudoId elementPseudoId = element->pseudoId(); 9429bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) if (elementPseudoId) 9439bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) element = element->parentOrShadowHostElement(); 9449bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 94551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) Document* ownerDocument = element->ownerDocument(); 94651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) // A non-active document has no styles. 94751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (!ownerDocument->isActive()) 94851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return; 94951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 95051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) // FIXME: It's really gross for the inspector to reach in and access StyleResolver 95151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) // directly here. We need to provide the Inspector better APIs to get this information 95251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) // without grabbing at internal style classes! 95351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 9545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Matched rules. 955a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) StyleResolver& styleResolver = ownerDocument->ensureStyleResolver(); 95619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) // FIXME: This code should not pass DoNotIncludeStyleSheetInCSSOMWrapper. All CSSOMWrappers should always have a parent sheet or rule. 957a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) RefPtr<CSSRuleList> matchedRules = styleResolver.pseudoCSSRulesForElement(element, elementPseudoId, StyleResolver::AllCSSRules, DoNotIncludeStyleSheetInCSSOMWrapper); 9589bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) matchedCSSRules = buildArrayForMatchedRuleList(matchedRules.get(), styleResolver, originalElement); 9595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Pseudo elements. 9619bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) if (!elementPseudoId && (!includePseudo || *includePseudo)) { 9625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::Array<TypeBuilder::CSS::PseudoIdMatches> > pseudoElements = TypeBuilder::Array<TypeBuilder::CSS::PseudoIdMatches>::create(); 9635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (PseudoId pseudoId = FIRST_PUBLIC_PSEUDOID; pseudoId < AFTER_LAST_INTERNAL_PSEUDOID; pseudoId = static_cast<PseudoId>(pseudoId + 1)) { 964a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) RefPtr<CSSRuleList> matchedRules = styleResolver.pseudoCSSRulesForElement(element, pseudoId, StyleResolver::AllCSSRules, DoNotIncludeStyleSheetInCSSOMWrapper); 9655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (matchedRules && matchedRules->length()) { 9665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::CSS::PseudoIdMatches> matches = TypeBuilder::CSS::PseudoIdMatches::create() 9675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) .setPseudoId(static_cast<int>(pseudoId)) 9685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) .setMatches(buildArrayForMatchedRuleList(matchedRules.get(), styleResolver, element)); 9695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pseudoElements->addItem(matches.release()); 9705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pseudoIdMatches = pseudoElements.release(); 9745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Inherited styles. 9779bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) if (!elementPseudoId && (!includeInherited || *includeInherited)) { 9785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::Array<TypeBuilder::CSS::InheritedStyleEntry> > entries = TypeBuilder::Array<TypeBuilder::CSS::InheritedStyleEntry>::create(); 9795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Element* parentElement = element->parentElement(); 9805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (parentElement) { 981a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) StyleResolver& parentStyleResolver = parentElement->ownerDocument()->ensureStyleResolver(); 982a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) RefPtr<CSSRuleList> parentMatchedRules = parentStyleResolver.cssRulesForElement(parentElement, StyleResolver::AllCSSRules, DoNotIncludeStyleSheetInCSSOMWrapper); 9835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::CSS::InheritedStyleEntry> entry = TypeBuilder::CSS::InheritedStyleEntry::create() 9845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) .setMatchedCSSRules(buildArrayForMatchedRuleList(parentMatchedRules.get(), styleResolver, parentElement)); 9855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (parentElement->style() && parentElement->style()->length()) { 9865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorStyleSheetForInlineStyle* styleSheet = asInspectorStyleSheet(parentElement); 9875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (styleSheet) 9885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) entry->setInlineStyle(styleSheet->buildObjectForStyle(styleSheet->styleForId(InspectorCSSId(styleSheet->id(), 0)))); 9895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) entries->addItem(entry.release()); 9925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) parentElement = parentElement->parentElement(); 9935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) inheritedEntries = entries.release(); 9965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 9985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::getInlineStylesForNode(ErrorString* errorString, int nodeId, RefPtr<TypeBuilder::CSS::CSSStyle>& inlineStyle, RefPtr<TypeBuilder::CSS::CSSStyle>& attributesStyle) 10005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 10015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Element* element = elementForId(errorString, nodeId); 10025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!element) 10035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 10045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorStyleSheetForInlineStyle* styleSheet = asInspectorStyleSheet(element); 10065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!styleSheet) 10075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 10085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) inlineStyle = styleSheet->buildObjectForStyle(element->style()); 10105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::CSS::CSSStyle> attributes = buildObjectForAttributesStyle(element); 10115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) attributesStyle = attributes ? attributes.release() : 0; 10125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 10135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::getComputedStyleForNode(ErrorString* errorString, int nodeId, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSComputedStyleProperty> >& style) 10155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1016e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) Node* node = m_domAgent->assertNode(errorString, nodeId); 1017e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (!node) 10185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 10195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1020e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) RefPtr<CSSComputedStyleDeclaration> computedStyleInfo = CSSComputedStyleDeclaration::create(node, true); 10215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<InspectorStyle> inspectorStyle = InspectorStyle::create(InspectorCSSId(), computedStyleInfo, 0); 10225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) style = inspectorStyle->buildArrayForComputedStyle(); 10235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 10245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 102551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void InspectorCSSAgent::collectPlatformFontsForRenderer(RenderText* renderer, HashCountedSet<String>* fontStats) 1026e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){ 1027e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) for (InlineTextBox* box = renderer->firstTextBox(); box; box = box->nextTextBox()) { 1028e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) RenderStyle* style = renderer->style(box->isFirstLineStyle()); 1029e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) const Font& font = style->font(); 1030e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) TextRun run = box->constructTextRunForInspector(style, font); 1031e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) WidthIterator it(&font, run, 0, false); 1032e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) GlyphBuffer glyphBuffer; 1033e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) it.advance(run.length(), &glyphBuffer); 103451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) for (unsigned i = 0; i < glyphBuffer.size(); ++i) { 1035e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) String familyName = glyphBuffer.fontDataAt(i)->platformData().fontFamilyName(); 1036f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) if (familyName.isNull()) 1037f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) familyName = ""; 103851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) fontStats->add(familyName); 1039e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } 1040e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } 1041e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)} 1042e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 1043e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)void InspectorCSSAgent::getPlatformFontsForNode(ErrorString* errorString, int nodeId, 1044c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) String* cssFamilyName, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::PlatformFontUsage> >& platformFonts) 1045e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){ 1046e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) Node* node = m_domAgent->assertNode(errorString, nodeId); 1047e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (!node) 1048e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) return; 1049c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) 1050c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) RefPtr<CSSComputedStyleDeclaration> computedStyleInfo = CSSComputedStyleDeclaration::create(node, true); 1051c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) *cssFamilyName = computedStyleInfo->getPropertyValue(CSSPropertyFontFamily); 1052c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) 1053e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) Vector<Node*> textNodes; 1054e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (node->nodeType() == Node::TEXT_NODE) { 1055e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (node->renderer()) 1056e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) textNodes.append(node); 1057e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } else { 1058e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) for (Node* child = node->firstChild(); child; child = child->nextSibling()) { 1059e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (child->nodeType() == Node::TEXT_NODE && child->renderer()) 1060e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) textNodes.append(child); 1061e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } 1062e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } 1063e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 106451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) HashCountedSet<String> fontStats; 1065e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) for (size_t i = 0; i < textNodes.size(); ++i) { 1066e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) RenderText* renderer = toRenderText(textNodes[i]->renderer()); 1067e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) collectPlatformFontsForRenderer(renderer, &fontStats); 1068e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (renderer->isTextFragment()) { 1069e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) RenderTextFragment* textFragment = toRenderTextFragment(renderer); 1070e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (textFragment->firstLetter()) { 1071e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) RenderObject* firstLetter = textFragment->firstLetter(); 1072e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) for (RenderObject* current = firstLetter->firstChild(); current; current = current->nextSibling()) { 1073e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (current->isText()) 1074e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) collectPlatformFontsForRenderer(toRenderText(current), &fontStats); 1075e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } 1076e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } 1077e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } 1078e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } 1079e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 1080c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) platformFonts = TypeBuilder::Array<TypeBuilder::CSS::PlatformFontUsage>::create(); 108151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) for (HashCountedSet<String>::iterator it = fontStats.begin(), end = fontStats.end(); it != end; ++it) { 1082e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) RefPtr<TypeBuilder::CSS::PlatformFontUsage> platformFont = TypeBuilder::CSS::PlatformFontUsage::create() 1083e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) .setFamilyName(it->key) 1084e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) .setGlyphCount(it->value); 1085c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) platformFonts->addItem(platformFont); 1086e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) } 1087e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)} 1088e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 10895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::getAllStyleSheets(ErrorString*, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSStyleSheetHeader> >& styleInfos) 10905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 10915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) styleInfos = TypeBuilder::Array<TypeBuilder::CSS::CSSStyleSheetHeader>::create(); 109253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) Vector<InspectorStyleSheet*> styleSheets; 109353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) collectAllStyleSheets(styleSheets); 109453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (size_t i = 0; i < styleSheets.size(); ++i) 109593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) styleInfos->addItem(styleSheets.at(i)->buildObjectForStyleSheetInfo()); 10965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 10975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::getStyleSheet(ErrorString* errorString, const String& styleSheetId, RefPtr<TypeBuilder::CSS::CSSStyleSheetBody>& styleSheetObject) 10995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 11005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorStyleSheet* inspectorStyleSheet = assertStyleSheetForId(errorString, styleSheetId); 11015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!inspectorStyleSheet) 11025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 11035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1104521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) Document* doc = inspectorStyleSheet->pageStyleSheet() ? inspectorStyleSheet->pageStyleSheet()->ownerDocument() : 0; 1105a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) if (!doc) 1106521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return; 1107521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 1108521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) RefPtr<TypeBuilder::CSS::CSSStyleSheetBody> result = TypeBuilder::CSS::CSSStyleSheetBody::create() 1109521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) .setStyleSheetId(styleSheetId) 1110a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) .setRules(buildArrayForRuleList(inspectorStyleSheet->pageStyleSheet()->rules().get(), doc->ensureStyleResolver())); 1111521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 1112521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) bool success = inspectorStyleSheet->fillObjectForStyleSheet(result); 1113521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (success) 1114521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) styleSheetObject = result; 11155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::getStyleSheetText(ErrorString* errorString, const String& styleSheetId, String* result) 11185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 11195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorStyleSheet* inspectorStyleSheet = assertStyleSheetForId(errorString, styleSheetId); 11205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!inspectorStyleSheet) 11215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 11225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) inspectorStyleSheet->getText(result); 11245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::setStyleSheetText(ErrorString* errorString, const String& styleSheetId, const String& text) 11275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 11285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorStyleSheet* inspectorStyleSheet = assertStyleSheetForId(errorString, styleSheetId); 11295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!inspectorStyleSheet) 11305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 11315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 113251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) TrackExceptionState exceptionState; 113351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) m_domAgent->history()->perform(adoptPtr(new SetStyleSheetTextAction(inspectorStyleSheet, text)), exceptionState); 113451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) *errorString = InspectorDOMAgent::toErrorString(exceptionState); 11355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1137591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid InspectorCSSAgent::setStyleText(ErrorString* errorString, const RefPtr<JSONObject>& fullStyleId, const String& text, RefPtr<TypeBuilder::CSS::CSSStyle>& result) 113853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){ 113953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) InspectorCSSId compoundId(fullStyleId); 114053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) ASSERT(!compoundId.isEmpty()); 114153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 114253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) InspectorStyleSheet* inspectorStyleSheet = assertStyleSheetForId(errorString, compoundId.styleSheetId()); 114353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (!inspectorStyleSheet) 114453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return; 114553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 114651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) TrackExceptionState exceptionState; 114751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) m_domAgent->history()->perform(adoptPtr(new SetStyleTextAction(inspectorStyleSheet, compoundId, text)), exceptionState); 114851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (!exceptionState.hadException()) 114953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) result = inspectorStyleSheet->buildObjectForStyle(inspectorStyleSheet->styleForId(compoundId)); 115051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) *errorString = InspectorDOMAgent::toErrorString(exceptionState); 115153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} 115253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 1153591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid InspectorCSSAgent::setPropertyText(ErrorString* errorString, const RefPtr<JSONObject>& fullStyleId, int propertyIndex, const String& text, bool overwrite, RefPtr<TypeBuilder::CSS::CSSStyle>& result) 11545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 11555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorCSSId compoundId(fullStyleId); 11565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!compoundId.isEmpty()); 11575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorStyleSheet* inspectorStyleSheet = assertStyleSheetForId(errorString, compoundId.styleSheetId()); 11595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!inspectorStyleSheet) 11605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 11615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 116251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) TrackExceptionState exceptionState; 116351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) bool success = m_domAgent->history()->perform(adoptPtr(new SetPropertyTextAction(inspectorStyleSheet, compoundId, propertyIndex, text, overwrite)), exceptionState); 11645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (success) 11655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result = inspectorStyleSheet->buildObjectForStyle(inspectorStyleSheet->styleForId(compoundId)); 116651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) *errorString = InspectorDOMAgent::toErrorString(exceptionState); 11675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1169591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid InspectorCSSAgent::toggleProperty(ErrorString* errorString, const RefPtr<JSONObject>& fullStyleId, int propertyIndex, bool disable, RefPtr<TypeBuilder::CSS::CSSStyle>& result) 11705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 11715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorCSSId compoundId(fullStyleId); 11725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!compoundId.isEmpty()); 11735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorStyleSheet* inspectorStyleSheet = assertStyleSheetForId(errorString, compoundId.styleSheetId()); 11755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!inspectorStyleSheet) 11765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 11775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 117851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) TrackExceptionState exceptionState; 117951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) bool success = m_domAgent->history()->perform(adoptPtr(new TogglePropertyAction(inspectorStyleSheet, compoundId, propertyIndex, disable)), exceptionState); 11805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (success) 11815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result = inspectorStyleSheet->buildObjectForStyle(inspectorStyleSheet->styleForId(compoundId)); 118251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) *errorString = InspectorDOMAgent::toErrorString(exceptionState); 11835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1185591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid InspectorCSSAgent::setRuleSelector(ErrorString* errorString, const RefPtr<JSONObject>& fullRuleId, const String& selector, RefPtr<TypeBuilder::CSS::CSSRule>& result) 11865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 11875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorCSSId compoundId(fullRuleId); 11885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!compoundId.isEmpty()); 11895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorStyleSheet* inspectorStyleSheet = assertStyleSheetForId(errorString, compoundId.styleSheetId()); 11915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!inspectorStyleSheet) 11925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 11935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 119451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) TrackExceptionState exceptionState; 119551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) bool success = m_domAgent->history()->perform(adoptPtr(new SetRuleSelectorAction(inspectorStyleSheet, compoundId, selector)), exceptionState); 11965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1197521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (success) { 1198521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) CSSStyleRule* rule = inspectorStyleSheet->ruleForId(compoundId); 1199521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) result = inspectorStyleSheet->buildObjectForRule(rule, buildMediaListChain(rule)); 1200521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 120151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) *errorString = InspectorDOMAgent::toErrorString(exceptionState); 12025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 12035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::addRule(ErrorString* errorString, const int contextNodeId, const String& selector, RefPtr<TypeBuilder::CSS::CSSRule>& result) 12055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 12065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node* node = m_domAgent->assertNode(errorString, contextNodeId); 12075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!node) 12085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 12095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12108abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) InspectorStyleSheet* inspectorStyleSheet = viaInspectorStyleSheet(&node->document(), true); 12115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!inspectorStyleSheet) { 12125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *errorString = "No target stylesheet found"; 12135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 12145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 121651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) TrackExceptionState exceptionState; 12175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) OwnPtr<AddRuleAction> action = adoptPtr(new AddRuleAction(inspectorStyleSheet, selector)); 12185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) AddRuleAction* rawAction = action.get(); 121951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) bool success = m_domAgent->history()->perform(action.release(), exceptionState); 12205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!success) { 122151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) *errorString = InspectorDOMAgent::toErrorString(exceptionState); 12225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 12235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorCSSId ruleId = rawAction->newRuleId(); 12265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CSSStyleRule* rule = inspectorStyleSheet->ruleForId(ruleId); 1227521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) result = inspectorStyleSheet->buildObjectForRule(rule, buildMediaListChain(rule)); 12285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 12295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::getSupportedCSSProperties(ErrorString*, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSPropertyInfo> >& cssProperties) 12315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 12325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSPropertyInfo> > properties = TypeBuilder::Array<TypeBuilder::CSS::CSSPropertyInfo>::create(); 12335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (int i = firstCSSProperty; i <= lastCSSProperty; ++i) { 12345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CSSPropertyID id = convertToCSSPropertyID(i); 12355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::CSS::CSSPropertyInfo> property = TypeBuilder::CSS::CSSPropertyInfo::create() 12365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) .setName(getPropertyNameString(id)); 12375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const StylePropertyShorthand& shorthand = shorthandForProperty(id); 12395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!shorthand.length()) { 12405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) properties->addItem(property.release()); 12415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 12425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::Array<String> > longhands = TypeBuilder::Array<String>::create(); 12445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned j = 0; j < shorthand.length(); ++j) { 12455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CSSPropertyID longhandID = shorthand.properties()[j]; 12465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) longhands->addItem(getPropertyNameString(longhandID)); 12475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) property->setLonghands(longhands); 12495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) properties->addItem(property.release()); 12505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cssProperties = properties.release(); 12525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 12535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1254591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid InspectorCSSAgent::forcePseudoState(ErrorString* errorString, int nodeId, const RefPtr<JSONArray>& forcedPseudoClasses) 12555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 12565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Element* element = m_domAgent->assertElement(errorString, nodeId); 12575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!element) 12585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 12595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned forcedPseudoState = computePseudoClassMask(forcedPseudoClasses.get()); 12615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NodeIdToForcedPseudoState::iterator it = m_nodeIdToForcedPseudoState.find(nodeId); 12625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned currentForcedPseudoState = it == m_nodeIdToForcedPseudoState.end() ? 0 : it->value; 12635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool needStyleRecalc = forcedPseudoState != currentForcedPseudoState; 12645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!needStyleRecalc) 12655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 12665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (forcedPseudoState) 12685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_nodeIdToForcedPseudoState.set(nodeId, forcedPseudoState); 12695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 12705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_nodeIdToForcedPseudoState.remove(nodeId); 127183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch element->ownerDocument()->setNeedsStyleRecalc(); 12725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 12735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::getNamedFlowCollection(ErrorString* errorString, int documentNodeId, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::NamedFlow> >& result) 12755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 12765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Document* document = m_domAgent->assertDocument(errorString, documentNodeId); 12775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!document) 12785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 12795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_namedFlowCollectionsRequested.add(documentNodeId); 12815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 128253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) Vector<RefPtr<NamedFlow> > namedFlowsVector = document->namedFlows()->namedFlows(); 12835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::Array<TypeBuilder::CSS::NamedFlow> > namedFlows = TypeBuilder::Array<TypeBuilder::CSS::NamedFlow>::create(); 12845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 128553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (Vector<RefPtr<NamedFlow> >::iterator it = namedFlowsVector.begin(); it != namedFlowsVector.end(); ++it) 12865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) namedFlows->addItem(buildObjectForNamedFlow(errorString, it->get(), documentNodeId)); 12875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result = namedFlows.release(); 12895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 12905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12910019e4eead4d990e4304c54a9028aca9122fb256Ben MurdochPassRefPtr<TypeBuilder::CSS::CSSMedia> InspectorCSSAgent::buildMediaObject(const MediaList* media, MediaListSource mediaListSource, const String& sourceURL, CSSStyleSheet* parentStyleSheet) 1292521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){ 1293521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) // Make certain compilers happy by initializing |source| up-front. 1294521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) TypeBuilder::CSS::CSSMedia::Source::Enum source = TypeBuilder::CSS::CSSMedia::Source::InlineSheet; 1295521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) switch (mediaListSource) { 1296521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) case MediaListSourceMediaRule: 1297521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) source = TypeBuilder::CSS::CSSMedia::Source::MediaRule; 1298521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) break; 1299521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) case MediaListSourceImportRule: 1300521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) source = TypeBuilder::CSS::CSSMedia::Source::ImportRule; 1301521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) break; 1302521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) case MediaListSourceLinkedSheet: 1303521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) source = TypeBuilder::CSS::CSSMedia::Source::LinkedSheet; 1304521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) break; 1305521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) case MediaListSourceInlineSheet: 1306521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) source = TypeBuilder::CSS::CSSMedia::Source::InlineSheet; 1307521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) break; 1308521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 1309521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 1310521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) RefPtr<TypeBuilder::CSS::CSSMedia> mediaObject = TypeBuilder::CSS::CSSMedia::create() 1311521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) .setText(media->mediaText()) 1312521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) .setSource(source); 1313521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 13140019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (parentStyleSheet && mediaListSource != MediaListSourceLinkedSheet) { 13150019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (InspectorStyleSheet* inspectorStyleSheet = m_cssStyleSheetToInspectorStyleSheet.get(parentStyleSheet)) 13160019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch mediaObject->setParentStyleSheetId(inspectorStyleSheet->id()); 13170019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch } 1318521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (!sourceURL.isEmpty()) { 1319521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) mediaObject->setSourceURL(sourceURL); 1320521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 1321521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) CSSRule* parentRule = media->parentRule(); 1322521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (!parentRule) 1323521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return mediaObject.release(); 1324fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch InspectorStyleSheet* inspectorStyleSheet = bindStyleSheet(parentRule->parentStyleSheet()); 1325521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) RefPtr<TypeBuilder::CSS::SourceRange> mediaRange = inspectorStyleSheet->ruleHeaderSourceRange(parentRule); 1326521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (mediaRange) 1327521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) mediaObject->setRange(mediaRange); 1328521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 1329521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return mediaObject.release(); 1330521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)} 1331521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 1332521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSMedia> > InspectorCSSAgent::buildMediaListChain(CSSRule* rule) 1333521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){ 1334521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (!rule) 1335521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return 0; 1336521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) RefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSMedia> > mediaArray = TypeBuilder::Array<TypeBuilder::CSS::CSSMedia>::create(); 1337521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) bool hasItems = false; 1338521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) MediaList* mediaList; 1339521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) CSSRule* parentRule = rule; 1340521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) String sourceURL; 1341521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) while (parentRule) { 1342521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) CSSStyleSheet* parentStyleSheet = 0; 1343521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) bool isMediaRule = true; 1344521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (parentRule->type() == CSSRule::MEDIA_RULE) { 1345a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) CSSMediaRule* mediaRule = toCSSMediaRule(parentRule); 1346521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) mediaList = mediaRule->media(); 1347521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) parentStyleSheet = mediaRule->parentStyleSheet(); 1348521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } else if (parentRule->type() == CSSRule::IMPORT_RULE) { 134906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) CSSImportRule* importRule = toCSSImportRule(parentRule); 1350521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) mediaList = importRule->media(); 1351521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) parentStyleSheet = importRule->parentStyleSheet(); 1352521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) isMediaRule = false; 1353521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } else { 1354521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) mediaList = 0; 1355521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 1356521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 1357521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (parentStyleSheet) { 1358521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) sourceURL = parentStyleSheet->contents()->baseURL(); 1359521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (sourceURL.isEmpty()) 1360521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) sourceURL = InspectorDOMAgent::documentURLString(parentStyleSheet->ownerDocument()); 1361521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } else { 1362521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) sourceURL = ""; 1363521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 1364521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 1365521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (mediaList && mediaList->length()) { 13660019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch mediaArray->addItem(buildMediaObject(mediaList, isMediaRule ? MediaListSourceMediaRule : MediaListSourceImportRule, sourceURL, parentStyleSheet)); 1367521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) hasItems = true; 1368521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 1369521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 1370521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (parentRule->parentRule()) { 1371521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) parentRule = parentRule->parentRule(); 1372521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } else { 1373521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) CSSStyleSheet* styleSheet = parentRule->parentStyleSheet(); 1374521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) while (styleSheet) { 1375521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) mediaList = styleSheet->media(); 1376521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (mediaList && mediaList->length()) { 1377521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) Document* doc = styleSheet->ownerDocument(); 1378521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (doc) 1379521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) sourceURL = doc->url(); 1380521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) else if (!styleSheet->contents()->baseURL().isEmpty()) 1381521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) sourceURL = styleSheet->contents()->baseURL(); 1382521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) else 1383521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) sourceURL = ""; 13840019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch mediaArray->addItem(buildMediaObject(mediaList, styleSheet->ownerNode() ? MediaListSourceLinkedSheet : MediaListSourceInlineSheet, sourceURL, styleSheet)); 1385521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) hasItems = true; 1386521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 1387521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) parentRule = styleSheet->ownerRule(); 1388521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (parentRule) 1389521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) break; 1390521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) styleSheet = styleSheet->parentStyleSheet(); 1391521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 1392521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 1393521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 1394521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return hasItems ? mediaArray : 0; 1395521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)} 1396521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 13975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)InspectorStyleSheetForInlineStyle* InspectorCSSAgent::asInspectorStyleSheet(Element* element) 13985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 13995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NodeToInspectorStyleSheet::iterator it = m_nodeToInspectorStyleSheet.find(element); 1400fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch if (it != m_nodeToInspectorStyleSheet.end()) 1401fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch return it->value.get(); 14025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1403fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch CSSStyleDeclaration* style = element->isStyledElement() ? element->style() : 0; 1404fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch if (!style) 1405fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch return 0; 14065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1407fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch String newStyleSheetId = String::number(m_lastStyleSheetId++); 140806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) RefPtr<InspectorStyleSheetForInlineStyle> inspectorStyleSheet = InspectorStyleSheetForInlineStyle::create(m_pageAgent, m_resourceAgent, newStyleSheetId, element, TypeBuilder::CSS::StyleSheetOrigin::Regular, this); 1409fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch m_idToInspectorStyleSheet.set(newStyleSheetId, inspectorStyleSheet); 1410fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch m_nodeToInspectorStyleSheet.set(element, inspectorStyleSheet); 1411fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch return inspectorStyleSheet.get(); 14125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 14135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element* InspectorCSSAgent::elementForId(ErrorString* errorString, int nodeId) 14155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 14165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node* node = m_domAgent->nodeForId(nodeId); 14175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!node) { 14185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *errorString = "No node with given id found"; 14195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 14205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1421fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch if (!node->isElementNode()) { 14225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *errorString = "Not an element node"; 14235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 14245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return toElement(node); 14265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 14275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int InspectorCSSAgent::documentNodeWithRequestedFlowsId(Document* document) 14295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 14305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int documentNodeId = m_domAgent->boundNodeId(document); 14315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!documentNodeId || !m_namedFlowCollectionsRequested.contains(documentNodeId)) 14325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 14335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return documentNodeId; 14355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 14365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 143753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorCSSAgent::collectAllStyleSheets(Vector<InspectorStyleSheet*>& result) 143853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){ 143953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) Vector<Document*> documents = m_domAgent->documents(); 144053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (Vector<Document*>::iterator it = documents.begin(); it != documents.end(); ++it) { 144153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) StyleSheetList* list = (*it)->styleSheets(); 144253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (unsigned i = 0; i < list->length(); ++i) { 144353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) StyleSheet* styleSheet = list->item(i); 144453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (styleSheet->isCSSStyleSheet()) 144551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) collectStyleSheets(toCSSStyleSheet(styleSheet), result); 144653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 144753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 144853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} 144953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 145053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorCSSAgent::collectStyleSheets(CSSStyleSheet* styleSheet, Vector<InspectorStyleSheet*>& result) 14515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 145251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) InspectorStyleSheet* inspectorStyleSheet = bindStyleSheet(styleSheet); 145353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) result.append(inspectorStyleSheet); 14545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned i = 0, size = styleSheet->length(); i < size; ++i) { 14555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CSSRule* rule = styleSheet->item(i); 1456926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (rule->type() == CSSRule::IMPORT_RULE) { 145706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) CSSStyleSheet* importedStyleSheet = toCSSImportRule(rule)->styleSheet(); 14585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (importedStyleSheet) 14595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) collectStyleSheets(importedStyleSheet, result); 14605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 14635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)InspectorStyleSheet* InspectorCSSAgent::bindStyleSheet(CSSStyleSheet* styleSheet) 14655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 14665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<InspectorStyleSheet> inspectorStyleSheet = m_cssStyleSheetToInspectorStyleSheet.get(styleSheet); 14675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!inspectorStyleSheet) { 14685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String id = String::number(m_lastStyleSheetId++); 14695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Document* document = styleSheet->ownerDocument(); 147006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) inspectorStyleSheet = InspectorStyleSheet::create(m_pageAgent, m_resourceAgent, id, styleSheet, detectOrigin(styleSheet, document), InspectorDOMAgent::documentURLString(document), this); 14715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_idToInspectorStyleSheet.set(id, inspectorStyleSheet); 14725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_cssStyleSheetToInspectorStyleSheet.set(styleSheet, inspectorStyleSheet); 147353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (m_creatingViaInspectorStyleSheet) 147453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_documentToInspectorStyleSheet.add(document, inspectorStyleSheet); 14755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return inspectorStyleSheet.get(); 14775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 14785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 147953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)String InspectorCSSAgent::unbindStyleSheet(InspectorStyleSheet* inspectorStyleSheet) 148053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){ 148153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) String id = inspectorStyleSheet->id(); 148253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_idToInspectorStyleSheet.remove(id); 148353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (inspectorStyleSheet->pageStyleSheet()) 148453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_cssStyleSheetToInspectorStyleSheet.remove(inspectorStyleSheet->pageStyleSheet()); 148553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return id; 148653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} 148753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 14885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)InspectorStyleSheet* InspectorCSSAgent::viaInspectorStyleSheet(Document* document, bool createIfAbsent) 14895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 14905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!document) { 14915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!createIfAbsent); 14925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 14935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1495926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!document->isHTMLDocument() && !document->isSVGDocument()) 1496926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return 0; 1497926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 14985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<InspectorStyleSheet> inspectorStyleSheet = m_documentToInspectorStyleSheet.get(document); 14995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (inspectorStyleSheet || !createIfAbsent) 15005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return inspectorStyleSheet.get(); 15015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 150251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) TrackExceptionState exceptionState; 150351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) RefPtr<Element> styleElement = document->createElement("style", exceptionState); 150451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (!exceptionState.hadException()) 150551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) styleElement->setAttribute("type", "text/css", exceptionState); 150651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (!exceptionState.hadException()) { 15075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ContainerNode* targetNode; 15085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // HEAD is absent in ImageDocuments, for example. 15095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (document->head()) 15105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) targetNode = document->head(); 15115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (document->body()) 15125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) targetNode = document->body(); 15135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 15145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 15155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InlineStyleOverrideScope overrideScope(document); 151753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_creatingViaInspectorStyleSheet = true; 151851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) targetNode->appendChild(styleElement, exceptionState); 151953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // At this point the added stylesheet will get bound through the updateActiveStyleSheets() invocation. 152053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // We just need to pick the respective InspectorStyleSheet from m_documentToInspectorStyleSheet. 152153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_creatingViaInspectorStyleSheet = false; 15225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 152351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (exceptionState.hadException()) 15245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 1525926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 152681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) return m_documentToInspectorStyleSheet.get(document); 15275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 15285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)InspectorStyleSheet* InspectorCSSAgent::assertStyleSheetForId(ErrorString* errorString, const String& styleSheetId) 15305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 15315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IdToInspectorStyleSheet::iterator it = m_idToInspectorStyleSheet.find(styleSheetId); 15325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (it == m_idToInspectorStyleSheet.end()) { 15335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *errorString = "No style sheet with given id found"; 15345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 15355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return it->value.get(); 15375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 15385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TypeBuilder::CSS::StyleSheetOrigin::Enum InspectorCSSAgent::detectOrigin(CSSStyleSheet* pageStyleSheet, Document* ownerDocument) 15405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 154153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (m_creatingViaInspectorStyleSheet) 154253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return TypeBuilder::CSS::StyleSheetOrigin::Inspector; 154353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 15445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) TypeBuilder::CSS::StyleSheetOrigin::Enum origin = TypeBuilder::CSS::StyleSheetOrigin::Regular; 15455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (pageStyleSheet && !pageStyleSheet->ownerNode() && pageStyleSheet->href().isEmpty()) 15465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) origin = TypeBuilder::CSS::StyleSheetOrigin::User_agent; 15475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (pageStyleSheet && pageStyleSheet->ownerNode() && pageStyleSheet->ownerNode()->nodeName() == "#document") 15485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) origin = TypeBuilder::CSS::StyleSheetOrigin::User; 15495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else { 15505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorStyleSheet* viaInspectorStyleSheetForOwner = viaInspectorStyleSheet(ownerDocument, false); 15515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (viaInspectorStyleSheetForOwner && pageStyleSheet == viaInspectorStyleSheetForOwner->pageStyleSheet()) 15525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) origin = TypeBuilder::CSS::StyleSheetOrigin::Inspector; 15535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return origin; 15555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 15565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1557a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)PassRefPtr<TypeBuilder::CSS::CSSRule> InspectorCSSAgent::buildObjectForRule(CSSStyleRule* rule, StyleResolver& styleResolver) 15585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 15595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!rule) 15605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 15615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 156219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) // CSSRules returned by StyleResolver::cssRulesForElement lack parent pointers since that infomation is not cheaply available. 15635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Since the inspector wants to walk the parent chain, we construct the full wrappers here. 156419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) // FIXME: This could be factored better. StyleResolver::cssRulesForElement should return a StyleRule vector, not a CSSRuleList. 15655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!rule->parentStyleSheet()) { 1566a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) rule = styleResolver.inspectorCSSOMWrappers().getWrapperForRuleInSheets(rule->styleRule(), styleResolver.document().styleEngine()); 15675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!rule) 15685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 15695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1570521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return bindStyleSheet(rule->parentStyleSheet())->buildObjectForRule(rule, buildMediaListChain(rule)); 15715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 15725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1573a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSRule> > InspectorCSSAgent::buildArrayForRuleList(CSSRuleList* ruleList, StyleResolver& styleResolver) 15745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 15755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSRule> > result = TypeBuilder::Array<TypeBuilder::CSS::CSSRule>::create(); 15765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!ruleList) 15775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result.release(); 15785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1579521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) RefPtr<CSSRuleList> refRuleList = ruleList; 1580521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) CSSRuleVector rules; 1581521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) InspectorStyleSheet::collectFlatRules(refRuleList, &rules); 1582521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 1583521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) for (unsigned i = 0, size = rules.size(); i < size; ++i) { 1584521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) CSSStyleRule* styleRule = asCSSStyleRule(rules.at(i).get()); 1585521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (!styleRule) 15865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 1587521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) result->addItem(buildObjectForRule(styleRule, styleResolver)); 15885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1589521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 15905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result.release(); 15915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 15925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15939bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)static inline bool matchesPseudoElement(const CSSSelector* selector, PseudoId elementPseudoId) 15949bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){ 15959bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) // According to http://www.w3.org/TR/css3-selectors/#pseudo-elements, "Only one pseudo-element may appear per selector." 15969bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) // As such, check the last selector in the tag history. 15979bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) for (; !selector->isLastInTagHistory(); ++selector) { } 15989bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) PseudoId selectorPseudoId = selector->matchesPseudoElement() ? CSSSelector::pseudoId(selector->pseudoType()) : NOPSEUDO; 15999bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 16009bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) // FIXME: This only covers the case of matching pseudo-element selectors against PseudoElements. 16019bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) // We should come up with a solution for matching pseudo-element selectors against ordinary Elements, too. 16029bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) return selectorPseudoId == elementPseudoId; 16039bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)} 16049bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 1605a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::RuleMatch> > InspectorCSSAgent::buildArrayForMatchedRuleList(CSSRuleList* ruleList, StyleResolver& styleResolver, Element* element) 16065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 16075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::Array<TypeBuilder::CSS::RuleMatch> > result = TypeBuilder::Array<TypeBuilder::CSS::RuleMatch>::create(); 16085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!ruleList) 16095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result.release(); 16105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned i = 0, size = ruleList->length(); i < size; ++i) { 16125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CSSStyleRule* rule = asCSSStyleRule(ruleList->item(i)); 16135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::CSS::CSSRule> ruleObject = buildObjectForRule(rule, styleResolver); 16145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!ruleObject) 16155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 16165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::Array<int> > matchingSelectors = TypeBuilder::Array<int>::create(); 16175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const CSSSelectorList& selectorList = rule->styleRule()->selectorList(); 16185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) long index = 0; 16199bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) PseudoId elementPseudoId = element->pseudoId(); 1620926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) for (const CSSSelector* selector = selectorList.first(); selector; selector = CSSSelectorList::next(selector)) { 16219bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) const CSSSelector* firstTagHistorySelector = selector; 16229bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) bool matched = false; 16239bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) if (elementPseudoId) 16249bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) matched = matchesPseudoElement(selector, elementPseudoId); // Modifies |selector|. 16259bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) matched |= element->webkitMatchesSelector(firstTagHistorySelector->selectorText(), IGNORE_EXCEPTION); 16265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (matched) 16275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) matchingSelectors->addItem(index); 16285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++index; 16295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 16305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::CSS::RuleMatch> match = TypeBuilder::CSS::RuleMatch::create() 16319bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) .setRule(ruleObject.release()) 16329bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) .setMatchingSelectors(matchingSelectors.release()); 16335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result->addItem(match); 16345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 16355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; 16375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 16385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<TypeBuilder::CSS::CSSStyle> InspectorCSSAgent::buildObjectForAttributesStyle(Element* element) 16405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 16415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!element->isStyledElement()) 16425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 16435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 164493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) // FIXME: Ugliness below. 1645591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch StylePropertySet* attributeStyle = const_cast<StylePropertySet*>(element->presentationAttributeStyle()); 16465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!attributeStyle) 16475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 16485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 164951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) MutableStylePropertySet* mutableAttributeStyle = toMutableStylePropertySet(attributeStyle); 165093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 165193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) RefPtr<InspectorStyle> inspectorStyle = InspectorStyle::create(InspectorCSSId(), mutableAttributeStyle->ensureCSSStyleDeclaration(), 0); 16525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return inspectorStyle->buildObjectForStyle(); 16535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 16545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::Region> > InspectorCSSAgent::buildArrayForRegions(ErrorString* errorString, PassRefPtr<NodeList> regionList, int documentNodeId) 16565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 16575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::Array<TypeBuilder::CSS::Region> > regions = TypeBuilder::Array<TypeBuilder::CSS::Region>::create(); 16585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned i = 0; i < regionList->length(); ++i) { 16605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) TypeBuilder::CSS::Region::RegionOverset::Enum regionOverset; 16615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1662591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch switch (toElement(regionList->item(i))->renderRegion()->regionOversetState()) { 1663591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch case RegionFit: 16645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) regionOverset = TypeBuilder::CSS::Region::RegionOverset::Fit; 16655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1666591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch case RegionEmpty: 16675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) regionOverset = TypeBuilder::CSS::Region::RegionOverset::Empty; 16685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1669591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch case RegionOverset: 16705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) regionOverset = TypeBuilder::CSS::Region::RegionOverset::Overset; 16715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1672591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch case RegionUndefined: 16735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 16745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 16755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 16765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 16775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 16785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::CSS::Region> region = TypeBuilder::CSS::Region::create() 16805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) .setRegionOverset(regionOverset) 16815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // documentNodeId was previously asserted 16825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) .setNodeId(m_domAgent->pushNodeToFrontend(errorString, documentNodeId, regionList->item(i))); 16835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) regions->addItem(region); 16855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 16865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return regions.release(); 16885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 16895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 169053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)PassRefPtr<TypeBuilder::CSS::NamedFlow> InspectorCSSAgent::buildObjectForNamedFlow(ErrorString* errorString, NamedFlow* webkitNamedFlow, int documentNodeId) 16915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 16925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<NodeList> contentList = webkitNamedFlow->getContent(); 16935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::Array<int> > content = TypeBuilder::Array<int>::create(); 16945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned i = 0; i < contentList->length(); ++i) { 16965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // documentNodeId was previously asserted 16975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) content->addItem(m_domAgent->pushNodeToFrontend(errorString, documentNodeId, contentList->item(i))); 16985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 16995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::CSS::NamedFlow> namedFlow = TypeBuilder::CSS::NamedFlow::create() 17015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) .setDocumentNodeId(documentNodeId) 17025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) .setName(webkitNamedFlow->name().string()) 17035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) .setOverset(webkitNamedFlow->overset()) 17045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) .setContent(content) 17055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) .setRegions(buildArrayForRegions(errorString, webkitNamedFlow->getRegions(), documentNodeId)); 17065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return namedFlow.release(); 17085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 17095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::didRemoveDocument(Document* document) 17115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 17125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (document) 17135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_documentToInspectorStyleSheet.remove(document); 17145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 17155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::didRemoveDOMNode(Node* node) 17175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 17185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!node) 17195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 17205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int nodeId = m_domAgent->boundNodeId(node); 17225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (nodeId) 17235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_nodeIdToForcedPseudoState.remove(nodeId); 17245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NodeToInspectorStyleSheet::iterator it = m_nodeToInspectorStyleSheet.find(node); 17265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (it == m_nodeToInspectorStyleSheet.end()) 17275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 17285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_idToInspectorStyleSheet.remove(it->value->id()); 17305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_nodeToInspectorStyleSheet.remove(node); 17315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 17325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::didModifyDOMAttr(Element* element) 17345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 17355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!element) 17365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 17375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NodeToInspectorStyleSheet::iterator it = m_nodeToInspectorStyleSheet.find(element); 17395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (it == m_nodeToInspectorStyleSheet.end()) 17405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 17415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) it->value->didModifyElementAttribute(); 17435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 17445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::styleSheetChanged(InspectorStyleSheet* styleSheet) 17465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 17475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_frontend) 17485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_frontend->styleSheetChanged(styleSheet->id()); 17495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 17505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17517757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdochvoid InspectorCSSAgent::willReparseStyleSheet() 17527757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch{ 17537757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch ASSERT(!m_isSettingStyleSheetText); 17547757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch m_isSettingStyleSheetText = true; 17557757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch} 17567757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 17577757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdochvoid InspectorCSSAgent::didReparseStyleSheet() 17587757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch{ 17597757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch ASSERT(m_isSettingStyleSheetText); 17607757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch m_isSettingStyleSheetText = false; 17617757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch} 17627757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 17635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::resetPseudoStates() 17645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 17655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HashSet<Document*> documentsToChange; 17665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (NodeIdToForcedPseudoState::iterator it = m_nodeIdToForcedPseudoState.begin(), end = m_nodeIdToForcedPseudoState.end(); it != end; ++it) { 17675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Element* element = toElement(m_domAgent->nodeForId(it->key)); 17685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (element && element->ownerDocument()) 17695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) documentsToChange.add(element->ownerDocument()); 17705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 17715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_nodeIdToForcedPseudoState.clear(); 17735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (HashSet<Document*>::iterator it = documentsToChange.begin(), end = documentsToChange.end(); it != end; ++it) 177483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch (*it)->setNeedsStyleRecalc(); 17755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 17765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore 17785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1779