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" 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "InspectorTypeBuilder.h" 307757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "StylePropertyShorthand.h" 311fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch#include "bindings/v8/ExceptionState.h" 321fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch#include "bindings/v8/ExceptionStatePlaceholder.h" 3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSComputedStyleDeclaration.h" 3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSImportRule.h" 35521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "core/css/CSSMediaRule.h" 3693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "core/css/CSSParser.h" 3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSRule.h" 3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSRuleList.h" 3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSStyleRule.h" 4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSStyleSheet.h" 41521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "core/css/MediaList.h" 4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/StylePropertySet.h" 4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/StyleRule.h" 4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/StyleSheet.h" 45521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "core/css/StyleSheetContents.h" 4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/StyleSheetList.h" 4781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#include "core/css/resolver/StyleResolver.h" 4853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/NamedFlow.h" 4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/NamedFlowCollection.h" 5053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Node.h" 5153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/NodeList.h" 5253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLHeadElement.h" 5353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorDOMAgent.h" 5453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorHistory.h" 5581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#include "core/inspector/InspectorPageAgent.h" 5653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorState.h" 5753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InstrumentingAgents.h" 5893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "core/loader/DocumentLoader.h" 5953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/ContentSecurityPolicy.h" 60591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "core/platform/JSONValues.h" 6153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderRegion.h" 62591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/CurrentTime.h" 63591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/HashSet.h" 64591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/Vector.h" 65591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/CString.h" 66591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/StringConcatenate.h" 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace CSSAgentState { 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char cssAgentEnabled[] = "cssAgentEnabled"; 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum ForcePseudoClassFlags { 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PseudoNone = 0, 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PseudoHover = 1 << 0, 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PseudoFocus = 1 << 1, 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PseudoActive = 1 << 2, 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PseudoVisited = 1 << 3 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)class StyleSheetAppender { 8353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)public: 8453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) StyleSheetAppender(CSSStyleSheetToInspectorStyleSheet& cssStyleSheetToInspectorStyleSheet, Vector<CSSStyleSheet*>& result) 8553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) : m_cssStyleSheetToInspectorStyleSheet(cssStyleSheetToInspectorStyleSheet) 8653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) , m_result(result) { } 8753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 8853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) void run(CSSStyleSheet* styleSheet) 8953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) { 90fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch RefPtr<InspectorStyleSheet> inspectorStyleSheet = m_cssStyleSheetToInspectorStyleSheet.get(styleSheet); 9153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // Avoid creating m_childRuleCSSOMWrappers in the stylesheet if it is in the process of re-parsing. 9253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // Otherwise m_childRuleCSSOMWrappers size will be initialized only for a part of rules, resulting in an ASSERT failure in CSSStyleSheet::item(). 9353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // Instead, wait for the RuleMutationScope destruction and handle the complete CSSStyleSheet. 9453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (inspectorStyleSheet && inspectorStyleSheet->isReparsing()) 9553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return; 9653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_result.append(styleSheet); 9753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (unsigned i = 0, size = styleSheet->length(); i < size; ++i) { 9853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) CSSRule* rule = styleSheet->item(i); 9953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (rule->type() == CSSRule::IMPORT_RULE) { 10053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) CSSStyleSheet* importedStyleSheet = static_cast<CSSImportRule*>(rule)->styleSheet(); 10153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (importedStyleSheet) 10253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) run(importedStyleSheet); 10353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 10453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 10553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 10653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 10753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)private: 10853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) CSSStyleSheetToInspectorStyleSheet& m_cssStyleSheetToInspectorStyleSheet; 10953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) Vector<CSSStyleSheet*>& m_result; 11053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}; 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 112591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochstatic unsigned computePseudoClassMask(JSONArray* pseudoClassArray) 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 114d24c94b5090b6aa121f0f82325c9379004dc3196Ben Murdoch DEFINE_STATIC_LOCAL(String, active, ("active")); 115d24c94b5090b6aa121f0f82325c9379004dc3196Ben Murdoch DEFINE_STATIC_LOCAL(String, hover, ("hover")); 116d24c94b5090b6aa121f0f82325c9379004dc3196Ben Murdoch DEFINE_STATIC_LOCAL(String, focus, ("focus")); 117d24c94b5090b6aa121f0f82325c9379004dc3196Ben Murdoch DEFINE_STATIC_LOCAL(String, visited, ("visited")); 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!pseudoClassArray || !pseudoClassArray->length()) 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return PseudoNone; 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned result = PseudoNone; 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t i = 0; i < pseudoClassArray->length(); ++i) { 123591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch RefPtr<JSONValue> pseudoClassValue = pseudoClassArray->get(i); 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String pseudoClass; 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool success = pseudoClassValue->asString(&pseudoClass); 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!success) 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (pseudoClass == active) 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result |= PseudoActive; 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (pseudoClass == hover) 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result |= PseudoHover; 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (pseudoClass == focus) 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result |= PseudoFocus; 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (pseudoClass == visited) 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result |= PseudoVisited; 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class UpdateRegionLayoutTask { 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) UpdateRegionLayoutTask(InspectorCSSAgent*); 14453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) void scheduleFor(NamedFlow*, int documentNodeId); 14553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) void unschedule(NamedFlow*); 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void reset(); 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void onTimer(Timer<UpdateRegionLayoutTask>*); 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorCSSAgent* m_cssAgent; 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Timer<UpdateRegionLayoutTask> m_timer; 15253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) HashMap<NamedFlow*, int> m_namedFlows; 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)UpdateRegionLayoutTask::UpdateRegionLayoutTask(InspectorCSSAgent* cssAgent) 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_cssAgent(cssAgent) 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_timer(this, &UpdateRegionLayoutTask::onTimer) 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void UpdateRegionLayoutTask::scheduleFor(NamedFlow* namedFlow, int documentNodeId) 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_namedFlows.add(namedFlow, documentNodeId); 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_timer.isActive()) 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_timer.startOneShot(0); 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void UpdateRegionLayoutTask::unschedule(NamedFlow* namedFlow) 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_namedFlows.remove(namedFlow); 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void UpdateRegionLayoutTask::reset() 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_timer.stop(); 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_namedFlows.clear(); 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void UpdateRegionLayoutTask::onTimer(Timer<UpdateRegionLayoutTask>*) 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The timer is stopped on m_cssAgent destruction, so this method will never be called after m_cssAgent has been destroyed. 18353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) Vector<std::pair<NamedFlow*, int> > namedFlows; 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (HashMap<NamedFlow*, int>::iterator it = m_namedFlows.begin(), end = m_namedFlows.end(); it != end; ++it) 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) namedFlows.append(std::make_pair(it->key, it->value)); 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned i = 0, size = namedFlows.size(); i < size; ++i) { 18953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) NamedFlow* namedFlow = namedFlows.at(i).first; 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int documentNodeId = namedFlows.at(i).second; 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_namedFlows.contains(namedFlow)) { 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_cssAgent->regionLayoutUpdated(namedFlow, documentNodeId); 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_namedFlows.remove(namedFlow); 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_namedFlows.isEmpty() && !m_timer.isActive()) 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_timer.startOneShot(0); 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 202591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochclass ChangeRegionOversetTask { 203591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochpublic: 204591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch ChangeRegionOversetTask(InspectorCSSAgent*); 205591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch void scheduleFor(NamedFlow*, int documentNodeId); 206591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch void unschedule(NamedFlow*); 207591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch void reset(); 208591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch void onTimer(Timer<ChangeRegionOversetTask>*); 209591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 210591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochprivate: 211591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch InspectorCSSAgent* m_cssAgent; 212591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch Timer<ChangeRegionOversetTask> m_timer; 213591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch HashMap<NamedFlow*, int> m_namedFlows; 214591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch}; 215591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 216591b958dee2cf159d33a0b931e6231072eaf38d5Ben MurdochChangeRegionOversetTask::ChangeRegionOversetTask(InspectorCSSAgent* cssAgent) 217591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch : m_cssAgent(cssAgent) 218591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch , m_timer(this, &ChangeRegionOversetTask::onTimer) 219591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 220591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 221591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 222591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid ChangeRegionOversetTask::scheduleFor(NamedFlow* namedFlow, int documentNodeId) 223591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 224591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_namedFlows.add(namedFlow, documentNodeId); 225591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 226591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (!m_timer.isActive()) 227591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_timer.startOneShot(0); 228591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 229591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 230591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid ChangeRegionOversetTask::unschedule(NamedFlow* namedFlow) 231591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 232591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_namedFlows.remove(namedFlow); 233591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 234591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 235591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid ChangeRegionOversetTask::reset() 236591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 237591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_timer.stop(); 238591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_namedFlows.clear(); 239591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 240591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 241591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid ChangeRegionOversetTask::onTimer(Timer<ChangeRegionOversetTask>*) 242591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 243591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch // The timer is stopped on m_cssAgent destruction, so this method will never be called after m_cssAgent has been destroyed. 244591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch for (HashMap<NamedFlow*, int>::iterator it = m_namedFlows.begin(), end = m_namedFlows.end(); it != end; ++it) 245591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_cssAgent->regionOversetChanged(it->key, it->value); 246591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 247591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_namedFlows.clear(); 248591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 249591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class InspectorCSSAgent::StyleSheetAction : public InspectorHistory::Action { 2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WTF_MAKE_NONCOPYABLE(StyleSheetAction); 2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) StyleSheetAction(const String& name, InspectorStyleSheet* styleSheet) 2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : InspectorHistory::Action(name) 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_styleSheet(styleSheet) 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected: 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<InspectorStyleSheet> m_styleSheet; 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class InspectorCSSAgent::SetStyleSheetTextAction : public InspectorCSSAgent::StyleSheetAction { 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WTF_MAKE_NONCOPYABLE(SetStyleSheetTextAction); 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SetStyleSheetTextAction(InspectorStyleSheet* styleSheet, const String& text) 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : InspectorCSSAgent::StyleSheetAction("SetStyleSheetText", styleSheet) 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_text(text) 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 272df95704c49daea886ddad70775bda23618d6274dBen Murdoch virtual bool perform(ExceptionState& es) 2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_styleSheet->getText(&m_oldText)) 2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 276df95704c49daea886ddad70775bda23618d6274dBen Murdoch return redo(es); 2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 279df95704c49daea886ddad70775bda23618d6274dBen Murdoch virtual bool undo(ExceptionState& es) 2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 281df95704c49daea886ddad70775bda23618d6274dBen Murdoch if (m_styleSheet->setText(m_oldText, es)) { 2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_styleSheet->reparseStyleSheet(m_oldText); 2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 288df95704c49daea886ddad70775bda23618d6274dBen Murdoch virtual bool redo(ExceptionState& es) 2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 290df95704c49daea886ddad70775bda23618d6274dBen Murdoch if (m_styleSheet->setText(m_text, es)) { 2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_styleSheet->reparseStyleSheet(m_text); 2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual String mergeId() 2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return String::format("SetStyleSheetText %s", m_styleSheet->id().utf8().data()); 3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void merge(PassOwnPtr<Action> action) 3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(action->mergeId() == mergeId()); 3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SetStyleSheetTextAction* other = static_cast<SetStyleSheetTextAction*>(action.get()); 3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_text = other->m_text; 3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String m_text; 3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String m_oldText; 3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 31553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)class InspectorCSSAgent::SetStyleTextAction : public InspectorCSSAgent::StyleSheetAction { 31653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) WTF_MAKE_NONCOPYABLE(SetStyleTextAction); 31753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)public: 31853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) SetStyleTextAction(InspectorStyleSheet* styleSheet, const InspectorCSSId& cssId, const String& text) 31953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) : InspectorCSSAgent::StyleSheetAction("SetPropertyText", styleSheet) 32053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) , m_cssId(cssId) 32153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) , m_text(text) 32253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) { 32353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 32453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 32553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) virtual String toString() 32653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) { 32753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return mergeId() + ": " + m_oldText + " -> " + m_text; 32853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 32953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 330df95704c49daea886ddad70775bda23618d6274dBen Murdoch virtual bool perform(ExceptionState& es) 33153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) { 332df95704c49daea886ddad70775bda23618d6274dBen Murdoch return redo(es); 33353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 33453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 335df95704c49daea886ddad70775bda23618d6274dBen Murdoch virtual bool undo(ExceptionState& es) 33653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) { 33753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) String placeholder; 338df95704c49daea886ddad70775bda23618d6274dBen Murdoch return m_styleSheet->setStyleText(m_cssId, m_oldText, &placeholder, es); 33953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 34053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 341df95704c49daea886ddad70775bda23618d6274dBen Murdoch virtual bool redo(ExceptionState& es) 34253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) { 343df95704c49daea886ddad70775bda23618d6274dBen Murdoch return m_styleSheet->setStyleText(m_cssId, m_text, &m_oldText, es); 34453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 34553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 34653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) virtual String mergeId() 34753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) { 34853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return String::format("SetStyleText %s:%u", m_cssId.styleSheetId().utf8().data(), m_cssId.ordinal()); 34953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 35053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 35153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) virtual void merge(PassOwnPtr<Action> action) 35253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) { 35353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) ASSERT(action->mergeId() == mergeId()); 35453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 35553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) SetStyleTextAction* other = static_cast<SetStyleTextAction*>(action.get()); 35653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_text = other->m_text; 35753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 35853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 35953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)private: 36053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) InspectorCSSId m_cssId; 36153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) String m_text; 36253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) String m_oldText; 36353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}; 36453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class InspectorCSSAgent::SetPropertyTextAction : public InspectorCSSAgent::StyleSheetAction { 3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WTF_MAKE_NONCOPYABLE(SetPropertyTextAction); 3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SetPropertyTextAction(InspectorStyleSheet* styleSheet, const InspectorCSSId& cssId, unsigned propertyIndex, const String& text, bool overwrite) 3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : InspectorCSSAgent::StyleSheetAction("SetPropertyText", styleSheet) 3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_cssId(cssId) 3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_propertyIndex(propertyIndex) 3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_text(text) 3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_overwrite(overwrite) 3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual String toString() 3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return mergeId() + ": " + m_oldText + " -> " + m_text; 3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 382df95704c49daea886ddad70775bda23618d6274dBen Murdoch virtual bool perform(ExceptionState& es) 3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 384df95704c49daea886ddad70775bda23618d6274dBen Murdoch return redo(es); 3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 387df95704c49daea886ddad70775bda23618d6274dBen Murdoch virtual bool undo(ExceptionState& es) 3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String placeholder; 390df95704c49daea886ddad70775bda23618d6274dBen Murdoch return m_styleSheet->setPropertyText(m_cssId, m_propertyIndex, m_overwrite ? m_oldText : "", true, &placeholder, es); 3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 393df95704c49daea886ddad70775bda23618d6274dBen Murdoch virtual bool redo(ExceptionState& es) 3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String oldText; 396df95704c49daea886ddad70775bda23618d6274dBen Murdoch bool result = m_styleSheet->setPropertyText(m_cssId, m_propertyIndex, m_text, m_overwrite, &oldText, es); 3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_oldText = oldText.stripWhiteSpace(); 3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: remove this once the model handles this case. 3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_oldText.endsWith(';')) 4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_oldText.append(';'); 4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; 4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual String mergeId() 4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return String::format("SetPropertyText %s:%u:%s", m_styleSheet->id().utf8().data(), m_propertyIndex, m_overwrite ? "true" : "false"); 4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void merge(PassOwnPtr<Action> action) 4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(action->mergeId() == mergeId()); 4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SetPropertyTextAction* other = static_cast<SetPropertyTextAction*>(action.get()); 4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_text = other->m_text; 4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorCSSId m_cssId; 4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned m_propertyIndex; 4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String m_text; 4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String m_oldText; 4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool m_overwrite; 4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class InspectorCSSAgent::TogglePropertyAction : public InspectorCSSAgent::StyleSheetAction { 4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WTF_MAKE_NONCOPYABLE(TogglePropertyAction); 4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) TogglePropertyAction(InspectorStyleSheet* styleSheet, const InspectorCSSId& cssId, unsigned propertyIndex, bool disable) 4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : InspectorCSSAgent::StyleSheetAction("ToggleProperty", styleSheet) 4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_cssId(cssId) 4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_propertyIndex(propertyIndex) 4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_disable(disable) 4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 436df95704c49daea886ddad70775bda23618d6274dBen Murdoch virtual bool perform(ExceptionState& es) 4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 438df95704c49daea886ddad70775bda23618d6274dBen Murdoch return redo(es); 4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 441df95704c49daea886ddad70775bda23618d6274dBen Murdoch virtual bool undo(ExceptionState& es) 4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 443df95704c49daea886ddad70775bda23618d6274dBen Murdoch return m_styleSheet->toggleProperty(m_cssId, m_propertyIndex, !m_disable, es); 4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 446df95704c49daea886ddad70775bda23618d6274dBen Murdoch virtual bool redo(ExceptionState& es) 4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 448df95704c49daea886ddad70775bda23618d6274dBen Murdoch return m_styleSheet->toggleProperty(m_cssId, m_propertyIndex, m_disable, es); 4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorCSSId m_cssId; 4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned m_propertyIndex; 4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool m_disable; 4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class InspectorCSSAgent::SetRuleSelectorAction : public InspectorCSSAgent::StyleSheetAction { 4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WTF_MAKE_NONCOPYABLE(SetRuleSelectorAction); 4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SetRuleSelectorAction(InspectorStyleSheet* styleSheet, const InspectorCSSId& cssId, const String& selector) 4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : InspectorCSSAgent::StyleSheetAction("SetRuleSelector", styleSheet) 4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_cssId(cssId) 4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_selector(selector) 4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 467df95704c49daea886ddad70775bda23618d6274dBen Murdoch virtual bool perform(ExceptionState& es) 4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 469df95704c49daea886ddad70775bda23618d6274dBen Murdoch m_oldSelector = m_styleSheet->ruleSelector(m_cssId, es); 470df95704c49daea886ddad70775bda23618d6274dBen Murdoch if (es.hadException()) 4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 472df95704c49daea886ddad70775bda23618d6274dBen Murdoch return redo(es); 4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 475df95704c49daea886ddad70775bda23618d6274dBen Murdoch virtual bool undo(ExceptionState& es) 4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 477df95704c49daea886ddad70775bda23618d6274dBen Murdoch return m_styleSheet->setRuleSelector(m_cssId, m_oldSelector, es); 4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 480df95704c49daea886ddad70775bda23618d6274dBen Murdoch virtual bool redo(ExceptionState& es) 4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 482df95704c49daea886ddad70775bda23618d6274dBen Murdoch return m_styleSheet->setRuleSelector(m_cssId, m_selector, es); 4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorCSSId m_cssId; 4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String m_selector; 4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String m_oldSelector; 4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class InspectorCSSAgent::AddRuleAction : public InspectorCSSAgent::StyleSheetAction { 4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WTF_MAKE_NONCOPYABLE(AddRuleAction); 4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) AddRuleAction(InspectorStyleSheet* styleSheet, const String& selector) 4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : InspectorCSSAgent::StyleSheetAction("AddRule", styleSheet) 4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_selector(selector) 4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 500df95704c49daea886ddad70775bda23618d6274dBen Murdoch virtual bool perform(ExceptionState& es) 5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 502df95704c49daea886ddad70775bda23618d6274dBen Murdoch return redo(es); 5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 505df95704c49daea886ddad70775bda23618d6274dBen Murdoch virtual bool undo(ExceptionState& es) 5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 507df95704c49daea886ddad70775bda23618d6274dBen Murdoch return m_styleSheet->deleteRule(m_newId, es); 5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 510df95704c49daea886ddad70775bda23618d6274dBen Murdoch virtual bool redo(ExceptionState& es) 5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 512df95704c49daea886ddad70775bda23618d6274dBen Murdoch CSSStyleRule* cssStyleRule = m_styleSheet->addRule(m_selector, es); 513df95704c49daea886ddad70775bda23618d6274dBen Murdoch if (es.hadException()) 5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_newId = m_styleSheet->ruleId(cssStyleRule); 5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorCSSId newRuleId() { return m_newId; } 5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorCSSId m_newId; 5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String m_selector; 5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String m_oldSelector; 5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// static 5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)CSSStyleRule* InspectorCSSAgent::asCSSStyleRule(CSSRule* rule) 5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 530521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (!rule || rule->type() != CSSRule::STYLE_RULE) 5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return static_cast<CSSStyleRule*>(rule); 5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 535591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochtemplate <typename CharType, size_t bufferLength> 536591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochstatic size_t vendorPrefixLowerCase(const CharType* string, size_t stringLength, char (&buffer)[bufferLength]) 53793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){ 538591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch static const char lowerCaseOffset = 'a' - 'A'; 539591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 540591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (string[0] != '-') 541591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return 0; 542591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 543591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch for (size_t i = 0; i < stringLength - 1; i++) { 544591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch CharType c = string[i + 1]; 545591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (c == '-') 546591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return i; 547591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (i == bufferLength) 548591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch break; 549591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (c < 'A' || c > 'z') 550591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch break; 551591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (c >= 'a') 552591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch buffer[i] = c; 553591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch else if (c <= 'Z') 554591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch buffer[i] = c + lowerCaseOffset; 555591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch else 556591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch break; 55793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) } 558591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return 0; 559591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 560591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 561591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochtemplate <size_t patternLength> 562591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochstatic bool equals(const char* prefix, size_t prefixLength, const char (&pattern)[patternLength]) 563591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 564591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (prefixLength != patternLength - 1) 565591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return false; 566591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch for (size_t i = 0; i < patternLength - 1; i++) { 567591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (prefix[i] != pattern[i]) 568591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return false; 569591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch } 570591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return true; 57193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 57293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 57393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)static bool hasNonWebkitVendorSpecificPrefix(const CSSParserString& string) 57493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){ 575591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch // Known prefixes: http://wiki.csswg.org/spec/vendor-prefixes 57693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) const size_t stringLength = string.length(); 577591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (stringLength < 4) 57893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return false; 57993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 580591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch char buffer[6]; 581591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch size_t prefixLength = string.is8Bit() ? 582591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch vendorPrefixLowerCase(string.characters8(), stringLength, buffer) : 583591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch vendorPrefixLowerCase(string.characters16(), stringLength, buffer); 584591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 585591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (!prefixLength || prefixLength == stringLength - 2) 58693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return false; 58793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 588591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch switch (buffer[0]) { 589591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch case 'a': 590591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return (prefixLength == 2 && buffer[1] == 'h') || equals(buffer + 1, prefixLength - 1, "tsc"); 591591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch case 'e': 592591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return equals(buffer + 1, prefixLength - 1, "pub"); 593591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch case 'h': 594591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return prefixLength == 2 && buffer[1] == 'p'; 595591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch case 'i': 596591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return equals(buffer + 1, prefixLength - 1, "books"); 597591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch case 'k': 598591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return equals(buffer + 1, prefixLength - 1, "html"); 599591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch case 'm': 600591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (prefixLength == 2) 601591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return buffer[1] == 's'; 602591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (prefixLength == 3) 603591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return (buffer[1] == 'o' && buffer[2] == 'z') || (buffer[1] == 's' || buffer[2] == 'o'); 604591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch break; 605591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch case 'o': 606591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return prefixLength == 1; 607591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch case 'p': 608591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return equals(buffer + 1, prefixLength - 1, "rince"); 609591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch case 'r': 610591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return (prefixLength == 2 && buffer[1] == 'o') || equals(buffer + 1, prefixLength - 1, "im"); 611591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch case 't': 612591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return prefixLength == 2 && buffer[1] == 'c'; 613591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch case 'w': 614591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return (prefixLength == 3 && buffer[1] == 'a' && buffer[2] == 'p') || equals(buffer + 1, prefixLength - 1, "easy"); 615591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch case 'x': 616591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return prefixLength == 2 && buffer[1] == 'v'; 617591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch } 618591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return false; 619591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 620591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 621591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochstatic bool isValidPropertyName(const CSSParserString& content) 622591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 623591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (content.equalIgnoringCase("animation") 624591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch || content.equalIgnoringCase("font-size-adjust") 625591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch || content.equalIgnoringCase("transform") 626591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch || content.equalIgnoringCase("user-select") 627591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch || content.equalIgnoringCase("-webkit-flex-pack") 628591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch || content.equalIgnoringCase("-webkit-text-size-adjust")) 629591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return true; 630591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 631591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return false; 63293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 63393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 63493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)// static 63593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)bool InspectorCSSAgent::cssErrorFilter(const CSSParserString& content, int propertyId, int errorType) 63693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){ 63793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) const size_t contentLength = content.length(); 63893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 63993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) switch (errorType) { 64093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) case CSSParser::PropertyDeclarationError: 64193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) // Ignore errors like "*property: value". This trick is used for IE7: http://stackoverflow.com/questions/4563651/what-does-an-asterisk-do-in-a-css-property-name 64293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (contentLength && content[0] == '*') 64393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return false; 64493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 64593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) // The "filter" property is commonly used instead of "opacity" for IE9. 64693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (propertyId == CSSPropertyFilter) 64793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return false; 648591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 64993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) break; 65093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 65193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) case CSSParser::InvalidPropertyValueError: 65293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) // The "filter" property is commonly used instead of "opacity" for IE9. 65393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (propertyId == CSSPropertyFilter) 65493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return false; 65593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 65693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) // Value might be a vendor-specific function. 65793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (hasNonWebkitVendorSpecificPrefix(content)) 65893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return false; 65993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 66093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) // IE-only "cursor: hand". 66193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (propertyId == CSSPropertyCursor && content.equalIgnoringCase("hand")) 66293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return false; 66393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 664591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch // Ignore properties like "property: value \9" (common IE hack) or "property: value \0" (IE 8 hack). 665591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (contentLength > 2 && content[contentLength - 2] == '\\' && (content[contentLength - 1] == '9' || content[contentLength - 1] == '0')) 666591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return false; 667591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 668591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (contentLength > 3) { 669591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 670591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch // property: value\0/; 671591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (content[contentLength - 3] == '\\' && content[contentLength - 2] == '0' && content[contentLength - 1] == '/') 672591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return false; 673591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 674591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch // property: value !ie; 675591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (content[contentLength - 3] == '!' && content[contentLength - 2] == 'i' && content[contentLength - 1] == 'e') 676591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return false; 677591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch } 678591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 679591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch // Popular value prefixes valid in other browsers. 680591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (content.startsWithIgnoringCase("linear-gradient")) 681591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return false; 682591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (content.startsWithIgnoringCase("-webkit-flexbox")) 683591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return false; 684591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (propertyId == CSSPropertyUnicodeBidi && content.startsWithIgnoringCase("isolate")) 68593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return false; 686591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 68793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) break; 68893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 68993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) case CSSParser::InvalidPropertyError: 69093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (hasNonWebkitVendorSpecificPrefix(content)) 69193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return false; 69293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 69393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) // Another hack to make IE-only property. 69493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (contentLength && content[0] == '_') 69593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return false; 69693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 69793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) // IE-only set of properties. 69893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (content.startsWithIgnoringCase("scrollbar-")) 69993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return false; 70093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 701591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (isValidPropertyName(content)) 70293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return false; 703591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 70493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) break; 705591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 706591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch case CSSParser::InvalidRuleError: 707591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch // Block error reporting for @-rules for now to avoid noise. 708591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (contentLength > 4 && content[0] == '@') 709591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return false; 710591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return true; 711591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 712591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch case CSSParser::InvalidSelectorPseudoError: 713591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (hasNonWebkitVendorSpecificPrefix(content)) 714591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return false; 71593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) } 71693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return true; 71793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 71893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 71981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)InspectorCSSAgent::InspectorCSSAgent(InstrumentingAgents* instrumentingAgents, InspectorCompositeState* state, InspectorDOMAgent* domAgent, InspectorPageAgent* pageAgent) 7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : InspectorBaseAgent<InspectorCSSAgent>("CSS", instrumentingAgents, state) 7215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_frontend(0) 7225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_domAgent(domAgent) 72381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) , m_pageAgent(pageAgent) 7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_lastStyleSheetId(1) 72553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) , m_creatingViaInspectorStyleSheet(false) 7267757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch , m_isSettingStyleSheetText(false) 7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_domAgent->setDOMListener(this); 7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)InspectorCSSAgent::~InspectorCSSAgent() 7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_domAgent); 7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) reset(); 7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::setFrontend(InspectorFrontend* frontend) 7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!m_frontend); 7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_frontend = frontend->css(); 7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::clearFrontend() 7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_frontend); 7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_frontend = 0; 7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) resetNonPersistentData(); 7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::discardAgent() 7515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_domAgent->setDOMListener(0); 7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_domAgent = 0; 7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::restore() 7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_state->getBoolean(CSSAgentState::cssAgentEnabled)) { 7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ErrorString error; 7605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enable(&error); 7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::reset() 7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_idToInspectorStyleSheet.clear(); 7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_cssStyleSheetToInspectorStyleSheet.clear(); 7685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_nodeToInspectorStyleSheet.clear(); 7695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_documentToInspectorStyleSheet.clear(); 7705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) resetNonPersistentData(); 7715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::resetNonPersistentData() 7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_namedFlowCollectionsRequested.clear(); 7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_updateRegionLayoutTask) 7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_updateRegionLayoutTask->reset(); 778591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (m_changeRegionOversetTask) 779591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_changeRegionOversetTask->reset(); 7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) resetPseudoStates(); 7815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::enable(ErrorString*) 7845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_state->setBoolean(CSSAgentState::cssAgentEnabled, true); 7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_instrumentingAgents->setInspectorCSSAgent(this); 78753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 78881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) if (!m_frontend) 78981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) return; 79053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) Vector<InspectorStyleSheet*> styleSheets; 79153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) collectAllStyleSheets(styleSheets); 79253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (size_t i = 0; i < styleSheets.size(); ++i) 79393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) m_frontend->styleSheetAdded(styleSheets.at(i)->buildObjectForStyleSheetInfo()); 7945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::disable(ErrorString*) 7975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_instrumentingAgents->setInspectorCSSAgent(0); 7995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_state->setBoolean(CSSAgentState::cssAgentEnabled, false); 8005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 80293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)void InspectorCSSAgent::didCommitLoad(Frame* frame, DocumentLoader* loader) 80393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){ 80493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) if (loader->frame() != frame->page()->mainFrame()) 80593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return; 80693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 80793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) reset(); 80893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 80993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 8105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::mediaQueryResultChanged() 8115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 8125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_frontend) 8135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_frontend->mediaQueryResultChanged(); 8145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 81653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorCSSAgent::didCreateNamedFlow(Document* document, NamedFlow* namedFlow) 8175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 8185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int documentNodeId = documentNodeWithRequestedFlowsId(document); 8195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!documentNodeId) 8205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 8215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ErrorString errorString; 8235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_frontend->namedFlowCreated(buildObjectForNamedFlow(&errorString, namedFlow, documentNodeId)); 8245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 82653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorCSSAgent::willRemoveNamedFlow(Document* document, NamedFlow* namedFlow) 8275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 8285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int documentNodeId = documentNodeWithRequestedFlowsId(document); 8295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!documentNodeId) 8305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 8315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_updateRegionLayoutTask) 8335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_updateRegionLayoutTask->unschedule(namedFlow); 8345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_frontend->namedFlowRemoved(documentNodeId, namedFlow->name().string()); 8365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 83853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorCSSAgent::didUpdateRegionLayout(Document* document, NamedFlow* namedFlow) 8395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 8405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int documentNodeId = documentNodeWithRequestedFlowsId(document); 8415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!documentNodeId) 8425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 8435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_updateRegionLayoutTask) 8455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_updateRegionLayoutTask = adoptPtr(new UpdateRegionLayoutTask(this)); 8465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_updateRegionLayoutTask->scheduleFor(namedFlow, documentNodeId); 8475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 84953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorCSSAgent::regionLayoutUpdated(NamedFlow* namedFlow, int documentNodeId) 8505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 85153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (namedFlow->flowState() == NamedFlow::FlowStateNull) 8525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 8535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ErrorString errorString; 85553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) RefPtr<NamedFlow> protector(namedFlow); 8565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_frontend->regionLayoutUpdated(buildObjectForNamedFlow(&errorString, namedFlow, documentNodeId)); 8585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 860591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid InspectorCSSAgent::didChangeRegionOverset(Document* document, NamedFlow* namedFlow) 861591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 862591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch int documentNodeId = documentNodeWithRequestedFlowsId(document); 863591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (!documentNodeId) 864591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return; 865591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 866591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (!m_changeRegionOversetTask) 867591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_changeRegionOversetTask = adoptPtr(new ChangeRegionOversetTask(this)); 868591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_changeRegionOversetTask->scheduleFor(namedFlow, documentNodeId); 869591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 870591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 871591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid InspectorCSSAgent::regionOversetChanged(NamedFlow* namedFlow, int documentNodeId) 872591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 873591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (namedFlow->flowState() == NamedFlow::FlowStateNull) 874591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return; 875591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 876591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch ErrorString errorString; 877591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch RefPtr<NamedFlow> protector(namedFlow); 878591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 879591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_frontend->regionOversetChanged(buildObjectForNamedFlow(&errorString, namedFlow, documentNodeId)); 880591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 881591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 8827757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdochvoid InspectorCSSAgent::activeStyleSheetsUpdated(Document* document, const StyleSheetVector& newSheets) 88353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){ 8847757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch if (m_isSettingStyleSheetText) 8857757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch return; 88653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) HashSet<CSSStyleSheet*> removedSheets; 88753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (CSSStyleSheetToInspectorStyleSheet::iterator it = m_cssStyleSheetToInspectorStyleSheet.begin(); it != m_cssStyleSheetToInspectorStyleSheet.end(); ++it) { 88881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) if (it->value->canBind() && (!it->key->ownerDocument() || it->key->ownerDocument() == document)) 88953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) removedSheets.add(it->key); 89053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 89153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 89253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) Vector<CSSStyleSheet*> newSheetsVector; 89353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (size_t i = 0, size = newSheets.size(); i < size; ++i) { 89453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) StyleSheet* newSheet = newSheets.at(i).get(); 89553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (newSheet->isCSSStyleSheet()) { 89653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) StyleSheetAppender appender(m_cssStyleSheetToInspectorStyleSheet, newSheetsVector); 89753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) appender.run(static_cast<CSSStyleSheet*>(newSheet)); 89853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 89953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 90053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 90153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) HashSet<CSSStyleSheet*> addedSheets; 90253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (size_t i = 0; i < newSheetsVector.size(); ++i) { 90353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) CSSStyleSheet* newCSSSheet = newSheetsVector.at(i); 90453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (removedSheets.contains(newCSSSheet)) 90553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) removedSheets.remove(newCSSSheet); 90653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) else 90753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) addedSheets.add(newCSSSheet); 90853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 90953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 91053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (HashSet<CSSStyleSheet*>::iterator it = removedSheets.begin(); it != removedSheets.end(); ++it) { 91153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) RefPtr<InspectorStyleSheet> inspectorStyleSheet = m_cssStyleSheetToInspectorStyleSheet.get(*it); 91253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) ASSERT(inspectorStyleSheet); 91353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (m_idToInspectorStyleSheet.contains(inspectorStyleSheet->id())) { 91453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) String id = unbindStyleSheet(inspectorStyleSheet.get()); 91553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (m_frontend) 91653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_frontend->styleSheetRemoved(id); 91753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 91853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 919fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch 92053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (HashSet<CSSStyleSheet*>::iterator it = addedSheets.begin(); it != addedSheets.end(); ++it) { 92153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (!m_cssStyleSheetToInspectorStyleSheet.contains(*it)) { 92253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) InspectorStyleSheet* newStyleSheet = bindStyleSheet(static_cast<CSSStyleSheet*>(*it)); 92353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (m_frontend) 92493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) m_frontend->styleSheetAdded(newStyleSheet->buildObjectForStyleSheetInfo()); 92553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 92653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 92753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} 92853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 92981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)void InspectorCSSAgent::frameDetachedFromParent(Frame* frame) 93081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles){ 93181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) Document* document = frame->document(); 93281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) if (!document) 93381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) return; 9347757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch StyleSheetVector newSheets; 93581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) activeStyleSheetsUpdated(document, newSheets); 93681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)} 93781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 9385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool InspectorCSSAgent::forcePseudoState(Element* element, CSSSelector::PseudoType pseudoType) 9395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 9405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_nodeIdToForcedPseudoState.isEmpty()) 9415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 9425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int nodeId = m_domAgent->boundNodeId(element); 9445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!nodeId) 9455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 9465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NodeIdToForcedPseudoState::iterator it = m_nodeIdToForcedPseudoState.find(nodeId); 9485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (it == m_nodeIdToForcedPseudoState.end()) 9495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 9505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned forcedPseudoState = it->value; 9525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (pseudoType) { 9535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case CSSSelector::PseudoActive: 9545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return forcedPseudoState & PseudoActive; 9555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case CSSSelector::PseudoFocus: 9565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return forcedPseudoState & PseudoFocus; 9575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case CSSSelector::PseudoHover: 9585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return forcedPseudoState & PseudoHover; 9595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case CSSSelector::PseudoVisited: 9605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return forcedPseudoState & PseudoVisited; 9615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 9625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 9635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 9655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (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) 9675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 9685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Element* element = elementForId(errorString, nodeId); 9695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!element) 9705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 9715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Matched rules. 9735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) StyleResolver* styleResolver = element->ownerDocument()->styleResolver(); 9745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<CSSRuleList> matchedRules = styleResolver->styleRulesForElement(element, StyleResolver::AllCSSRules); 9755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) matchedCSSRules = buildArrayForMatchedRuleList(matchedRules.get(), styleResolver, element); 9765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Pseudo elements. 9785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!includePseudo || *includePseudo) { 9795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::Array<TypeBuilder::CSS::PseudoIdMatches> > pseudoElements = TypeBuilder::Array<TypeBuilder::CSS::PseudoIdMatches>::create(); 9805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (PseudoId pseudoId = FIRST_PUBLIC_PSEUDOID; pseudoId < AFTER_LAST_INTERNAL_PSEUDOID; pseudoId = static_cast<PseudoId>(pseudoId + 1)) { 9815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<CSSRuleList> matchedRules = styleResolver->pseudoStyleRulesForElement(element, pseudoId, StyleResolver::AllCSSRules); 9825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (matchedRules && matchedRules->length()) { 9835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::CSS::PseudoIdMatches> matches = TypeBuilder::CSS::PseudoIdMatches::create() 9845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) .setPseudoId(static_cast<int>(pseudoId)) 9855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) .setMatches(buildArrayForMatchedRuleList(matchedRules.get(), styleResolver, element)); 9865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pseudoElements->addItem(matches.release()); 9875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) pseudoIdMatches = pseudoElements.release(); 9915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Inherited styles. 9945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!includeInherited || *includeInherited) { 9955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::Array<TypeBuilder::CSS::InheritedStyleEntry> > entries = TypeBuilder::Array<TypeBuilder::CSS::InheritedStyleEntry>::create(); 9965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Element* parentElement = element->parentElement(); 9975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (parentElement) { 9985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) StyleResolver* parentStyleResolver = parentElement->ownerDocument()->styleResolver(); 9995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<CSSRuleList> parentMatchedRules = parentStyleResolver->styleRulesForElement(parentElement, StyleResolver::AllCSSRules); 10005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::CSS::InheritedStyleEntry> entry = TypeBuilder::CSS::InheritedStyleEntry::create() 10015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) .setMatchedCSSRules(buildArrayForMatchedRuleList(parentMatchedRules.get(), styleResolver, parentElement)); 10025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (parentElement->style() && parentElement->style()->length()) { 10035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorStyleSheetForInlineStyle* styleSheet = asInspectorStyleSheet(parentElement); 10045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (styleSheet) 10055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) entry->setInlineStyle(styleSheet->buildObjectForStyle(styleSheet->styleForId(InspectorCSSId(styleSheet->id(), 0)))); 10065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 10075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) entries->addItem(entry.release()); 10095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) parentElement = parentElement->parentElement(); 10105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 10115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) inheritedEntries = entries.release(); 10135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 10145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 10155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::getInlineStylesForNode(ErrorString* errorString, int nodeId, RefPtr<TypeBuilder::CSS::CSSStyle>& inlineStyle, RefPtr<TypeBuilder::CSS::CSSStyle>& attributesStyle) 10175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 10185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Element* element = elementForId(errorString, nodeId); 10195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!element) 10205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 10215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorStyleSheetForInlineStyle* styleSheet = asInspectorStyleSheet(element); 10235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!styleSheet) 10245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 10255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) inlineStyle = styleSheet->buildObjectForStyle(element->style()); 10275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::CSS::CSSStyle> attributes = buildObjectForAttributesStyle(element); 10285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) attributesStyle = attributes ? attributes.release() : 0; 10295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 10305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::getComputedStyleForNode(ErrorString* errorString, int nodeId, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSComputedStyleProperty> >& style) 10325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 10335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Element* element = elementForId(errorString, nodeId); 10345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!element) 10355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 10365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<CSSComputedStyleDeclaration> computedStyleInfo = CSSComputedStyleDeclaration::create(element, true); 10385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<InspectorStyle> inspectorStyle = InspectorStyle::create(InspectorCSSId(), computedStyleInfo, 0); 10395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) style = inspectorStyle->buildArrayForComputedStyle(); 10405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 10415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::getAllStyleSheets(ErrorString*, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSStyleSheetHeader> >& styleInfos) 10435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 10445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) styleInfos = TypeBuilder::Array<TypeBuilder::CSS::CSSStyleSheetHeader>::create(); 104553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) Vector<InspectorStyleSheet*> styleSheets; 104653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) collectAllStyleSheets(styleSheets); 104753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (size_t i = 0; i < styleSheets.size(); ++i) 104893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) styleInfos->addItem(styleSheets.at(i)->buildObjectForStyleSheetInfo()); 10495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 10505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::getStyleSheet(ErrorString* errorString, const String& styleSheetId, RefPtr<TypeBuilder::CSS::CSSStyleSheetBody>& styleSheetObject) 10525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 10535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorStyleSheet* inspectorStyleSheet = assertStyleSheetForId(errorString, styleSheetId); 10545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!inspectorStyleSheet) 10555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 10565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1057521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) Document* doc = inspectorStyleSheet->pageStyleSheet() ? inspectorStyleSheet->pageStyleSheet()->ownerDocument() : 0; 1058521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (!doc || !doc->styleResolver()) 1059521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return; 1060521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 1061521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) RefPtr<TypeBuilder::CSS::CSSStyleSheetBody> result = TypeBuilder::CSS::CSSStyleSheetBody::create() 1062521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) .setStyleSheetId(styleSheetId) 1063521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) .setRules(buildArrayForRuleList(inspectorStyleSheet->pageStyleSheet()->rules().get(), doc->styleResolver())); 1064521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 1065521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) bool success = inspectorStyleSheet->fillObjectForStyleSheet(result); 1066521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (success) 1067521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) styleSheetObject = result; 10685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 10695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::getStyleSheetText(ErrorString* errorString, const String& styleSheetId, String* result) 10715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 10725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorStyleSheet* inspectorStyleSheet = assertStyleSheetForId(errorString, styleSheetId); 10735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!inspectorStyleSheet) 10745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 10755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) inspectorStyleSheet->getText(result); 10775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 10785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::setStyleSheetText(ErrorString* errorString, const String& styleSheetId, const String& text) 10805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 10815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorStyleSheet* inspectorStyleSheet = assertStyleSheetForId(errorString, styleSheetId); 10825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!inspectorStyleSheet) 10835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 10845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1085df95704c49daea886ddad70775bda23618d6274dBen Murdoch TrackExceptionState es; 1086df95704c49daea886ddad70775bda23618d6274dBen Murdoch m_domAgent->history()->perform(adoptPtr(new SetStyleSheetTextAction(inspectorStyleSheet, text)), es); 1087df95704c49daea886ddad70775bda23618d6274dBen Murdoch *errorString = InspectorDOMAgent::toErrorString(es); 10885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 10895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1090591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid InspectorCSSAgent::setStyleText(ErrorString* errorString, const RefPtr<JSONObject>& fullStyleId, const String& text, RefPtr<TypeBuilder::CSS::CSSStyle>& result) 109153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){ 109253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) InspectorCSSId compoundId(fullStyleId); 109353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) ASSERT(!compoundId.isEmpty()); 109453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 109553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) InspectorStyleSheet* inspectorStyleSheet = assertStyleSheetForId(errorString, compoundId.styleSheetId()); 109653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (!inspectorStyleSheet) 109753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return; 109853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 1099df95704c49daea886ddad70775bda23618d6274dBen Murdoch TrackExceptionState es; 1100df95704c49daea886ddad70775bda23618d6274dBen Murdoch m_domAgent->history()->perform(adoptPtr(new SetStyleTextAction(inspectorStyleSheet, compoundId, text)), es); 1101df95704c49daea886ddad70775bda23618d6274dBen Murdoch if (!es.hadException()) 110253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) result = inspectorStyleSheet->buildObjectForStyle(inspectorStyleSheet->styleForId(compoundId)); 1103df95704c49daea886ddad70775bda23618d6274dBen Murdoch *errorString = InspectorDOMAgent::toErrorString(es); 110453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} 110553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 1106591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid InspectorCSSAgent::setPropertyText(ErrorString* errorString, const RefPtr<JSONObject>& fullStyleId, int propertyIndex, const String& text, bool overwrite, RefPtr<TypeBuilder::CSS::CSSStyle>& result) 11075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 11085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorCSSId compoundId(fullStyleId); 11095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!compoundId.isEmpty()); 11105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorStyleSheet* inspectorStyleSheet = assertStyleSheetForId(errorString, compoundId.styleSheetId()); 11125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!inspectorStyleSheet) 11135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 11145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1115df95704c49daea886ddad70775bda23618d6274dBen Murdoch TrackExceptionState es; 1116df95704c49daea886ddad70775bda23618d6274dBen Murdoch bool success = m_domAgent->history()->perform(adoptPtr(new SetPropertyTextAction(inspectorStyleSheet, compoundId, propertyIndex, text, overwrite)), es); 11175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (success) 11185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result = inspectorStyleSheet->buildObjectForStyle(inspectorStyleSheet->styleForId(compoundId)); 1119df95704c49daea886ddad70775bda23618d6274dBen Murdoch *errorString = InspectorDOMAgent::toErrorString(es); 11205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1122591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid InspectorCSSAgent::toggleProperty(ErrorString* errorString, const RefPtr<JSONObject>& fullStyleId, int propertyIndex, bool disable, RefPtr<TypeBuilder::CSS::CSSStyle>& result) 11235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 11245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorCSSId compoundId(fullStyleId); 11255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!compoundId.isEmpty()); 11265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorStyleSheet* inspectorStyleSheet = assertStyleSheetForId(errorString, compoundId.styleSheetId()); 11285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!inspectorStyleSheet) 11295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 11305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1131df95704c49daea886ddad70775bda23618d6274dBen Murdoch TrackExceptionState es; 1132df95704c49daea886ddad70775bda23618d6274dBen Murdoch bool success = m_domAgent->history()->perform(adoptPtr(new TogglePropertyAction(inspectorStyleSheet, compoundId, propertyIndex, disable)), es); 11335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (success) 11345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result = inspectorStyleSheet->buildObjectForStyle(inspectorStyleSheet->styleForId(compoundId)); 1135df95704c49daea886ddad70775bda23618d6274dBen Murdoch *errorString = InspectorDOMAgent::toErrorString(es); 11365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1138591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid InspectorCSSAgent::setRuleSelector(ErrorString* errorString, const RefPtr<JSONObject>& fullRuleId, const String& selector, RefPtr<TypeBuilder::CSS::CSSRule>& result) 11395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 11405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorCSSId compoundId(fullRuleId); 11415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!compoundId.isEmpty()); 11425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorStyleSheet* inspectorStyleSheet = assertStyleSheetForId(errorString, compoundId.styleSheetId()); 11445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!inspectorStyleSheet) 11455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 11465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1147df95704c49daea886ddad70775bda23618d6274dBen Murdoch TrackExceptionState es; 1148df95704c49daea886ddad70775bda23618d6274dBen Murdoch bool success = m_domAgent->history()->perform(adoptPtr(new SetRuleSelectorAction(inspectorStyleSheet, compoundId, selector)), es); 11495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1150521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (success) { 1151521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) CSSStyleRule* rule = inspectorStyleSheet->ruleForId(compoundId); 1152521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) result = inspectorStyleSheet->buildObjectForRule(rule, buildMediaListChain(rule)); 1153521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 1154df95704c49daea886ddad70775bda23618d6274dBen Murdoch *errorString = InspectorDOMAgent::toErrorString(es); 11555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::addRule(ErrorString* errorString, const int contextNodeId, const String& selector, RefPtr<TypeBuilder::CSS::CSSRule>& result) 11585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 11595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node* node = m_domAgent->assertNode(errorString, contextNodeId); 11605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!node) 11615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 11625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorStyleSheet* inspectorStyleSheet = viaInspectorStyleSheet(node->document(), true); 11645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!inspectorStyleSheet) { 11655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *errorString = "No target stylesheet found"; 11665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 11675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 11685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1169df95704c49daea886ddad70775bda23618d6274dBen Murdoch TrackExceptionState es; 11705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) OwnPtr<AddRuleAction> action = adoptPtr(new AddRuleAction(inspectorStyleSheet, selector)); 11715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) AddRuleAction* rawAction = action.get(); 1172df95704c49daea886ddad70775bda23618d6274dBen Murdoch bool success = m_domAgent->history()->perform(action.release(), es); 11735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!success) { 1174df95704c49daea886ddad70775bda23618d6274dBen Murdoch *errorString = InspectorDOMAgent::toErrorString(es); 11755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 11765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 11775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorCSSId ruleId = rawAction->newRuleId(); 11795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CSSStyleRule* rule = inspectorStyleSheet->ruleForId(ruleId); 1180521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) result = inspectorStyleSheet->buildObjectForRule(rule, buildMediaListChain(rule)); 11815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::getSupportedCSSProperties(ErrorString*, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSPropertyInfo> >& cssProperties) 11845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 11855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSPropertyInfo> > properties = TypeBuilder::Array<TypeBuilder::CSS::CSSPropertyInfo>::create(); 11865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (int i = firstCSSProperty; i <= lastCSSProperty; ++i) { 11875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CSSPropertyID id = convertToCSSPropertyID(i); 11885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::CSS::CSSPropertyInfo> property = TypeBuilder::CSS::CSSPropertyInfo::create() 11895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) .setName(getPropertyNameString(id)); 11905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const StylePropertyShorthand& shorthand = shorthandForProperty(id); 11925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!shorthand.length()) { 11935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) properties->addItem(property.release()); 11945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 11955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 11965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::Array<String> > longhands = TypeBuilder::Array<String>::create(); 11975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned j = 0; j < shorthand.length(); ++j) { 11985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CSSPropertyID longhandID = shorthand.properties()[j]; 11995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) longhands->addItem(getPropertyNameString(longhandID)); 12005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) property->setLonghands(longhands); 12025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) properties->addItem(property.release()); 12035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cssProperties = properties.release(); 12055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 12065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1207591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid InspectorCSSAgent::forcePseudoState(ErrorString* errorString, int nodeId, const RefPtr<JSONArray>& forcedPseudoClasses) 12085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 12095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Element* element = m_domAgent->assertElement(errorString, nodeId); 12105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!element) 12115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 12125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned forcedPseudoState = computePseudoClassMask(forcedPseudoClasses.get()); 12145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NodeIdToForcedPseudoState::iterator it = m_nodeIdToForcedPseudoState.find(nodeId); 12155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned currentForcedPseudoState = it == m_nodeIdToForcedPseudoState.end() ? 0 : it->value; 12165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool needStyleRecalc = forcedPseudoState != currentForcedPseudoState; 12175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!needStyleRecalc) 12185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 12195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (forcedPseudoState) 12215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_nodeIdToForcedPseudoState.set(nodeId, forcedPseudoState); 12225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 12235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_nodeIdToForcedPseudoState.remove(nodeId); 122483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch element->ownerDocument()->setNeedsStyleRecalc(); 12255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 12265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::getNamedFlowCollection(ErrorString* errorString, int documentNodeId, RefPtr<TypeBuilder::Array<TypeBuilder::CSS::NamedFlow> >& result) 12285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 12295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Document* document = m_domAgent->assertDocument(errorString, documentNodeId); 12305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!document) 12315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 12325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_namedFlowCollectionsRequested.add(documentNodeId); 12345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 123553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) Vector<RefPtr<NamedFlow> > namedFlowsVector = document->namedFlows()->namedFlows(); 12365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::Array<TypeBuilder::CSS::NamedFlow> > namedFlows = TypeBuilder::Array<TypeBuilder::CSS::NamedFlow>::create(); 12375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 123853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (Vector<RefPtr<NamedFlow> >::iterator it = namedFlowsVector.begin(); it != namedFlowsVector.end(); ++it) 12395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) namedFlows->addItem(buildObjectForNamedFlow(errorString, it->get(), documentNodeId)); 12405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result = namedFlows.release(); 12425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 12435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12440019e4eead4d990e4304c54a9028aca9122fb256Ben MurdochPassRefPtr<TypeBuilder::CSS::CSSMedia> InspectorCSSAgent::buildMediaObject(const MediaList* media, MediaListSource mediaListSource, const String& sourceURL, CSSStyleSheet* parentStyleSheet) 1245521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){ 1246521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) // Make certain compilers happy by initializing |source| up-front. 1247521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) TypeBuilder::CSS::CSSMedia::Source::Enum source = TypeBuilder::CSS::CSSMedia::Source::InlineSheet; 1248521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) switch (mediaListSource) { 1249521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) case MediaListSourceMediaRule: 1250521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) source = TypeBuilder::CSS::CSSMedia::Source::MediaRule; 1251521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) break; 1252521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) case MediaListSourceImportRule: 1253521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) source = TypeBuilder::CSS::CSSMedia::Source::ImportRule; 1254521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) break; 1255521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) case MediaListSourceLinkedSheet: 1256521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) source = TypeBuilder::CSS::CSSMedia::Source::LinkedSheet; 1257521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) break; 1258521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) case MediaListSourceInlineSheet: 1259521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) source = TypeBuilder::CSS::CSSMedia::Source::InlineSheet; 1260521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) break; 1261521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 1262521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 1263521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) RefPtr<TypeBuilder::CSS::CSSMedia> mediaObject = TypeBuilder::CSS::CSSMedia::create() 1264521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) .setText(media->mediaText()) 1265521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) .setSource(source); 1266521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 12670019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (parentStyleSheet && mediaListSource != MediaListSourceLinkedSheet) { 12680019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (InspectorStyleSheet* inspectorStyleSheet = m_cssStyleSheetToInspectorStyleSheet.get(parentStyleSheet)) 12690019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch mediaObject->setParentStyleSheetId(inspectorStyleSheet->id()); 12700019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch } 1271521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (!sourceURL.isEmpty()) { 1272521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) mediaObject->setSourceURL(sourceURL); 1273521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 1274521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) CSSRule* parentRule = media->parentRule(); 1275521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (!parentRule) 1276521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return mediaObject.release(); 1277fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch InspectorStyleSheet* inspectorStyleSheet = bindStyleSheet(parentRule->parentStyleSheet()); 1278521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) RefPtr<TypeBuilder::CSS::SourceRange> mediaRange = inspectorStyleSheet->ruleHeaderSourceRange(parentRule); 1279521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (mediaRange) 1280521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) mediaObject->setRange(mediaRange); 1281521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 1282521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return mediaObject.release(); 1283521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)} 1284521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 1285521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSMedia> > InspectorCSSAgent::buildMediaListChain(CSSRule* rule) 1286521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){ 1287521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (!rule) 1288521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return 0; 1289521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) RefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSMedia> > mediaArray = TypeBuilder::Array<TypeBuilder::CSS::CSSMedia>::create(); 1290521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) bool hasItems = false; 1291521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) MediaList* mediaList; 1292521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) CSSRule* parentRule = rule; 1293521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) String sourceURL; 1294521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) while (parentRule) { 1295521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) CSSStyleSheet* parentStyleSheet = 0; 1296521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) bool isMediaRule = true; 1297521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (parentRule->type() == CSSRule::MEDIA_RULE) { 1298521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) CSSMediaRule* mediaRule = static_cast<CSSMediaRule*>(parentRule); 1299521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) mediaList = mediaRule->media(); 1300521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) parentStyleSheet = mediaRule->parentStyleSheet(); 1301521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } else if (parentRule->type() == CSSRule::IMPORT_RULE) { 1302521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) CSSImportRule* importRule = static_cast<CSSImportRule*>(parentRule); 1303521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) mediaList = importRule->media(); 1304521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) parentStyleSheet = importRule->parentStyleSheet(); 1305521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) isMediaRule = false; 1306521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } else { 1307521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) mediaList = 0; 1308521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 1309521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 1310521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (parentStyleSheet) { 1311521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) sourceURL = parentStyleSheet->contents()->baseURL(); 1312521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (sourceURL.isEmpty()) 1313521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) sourceURL = InspectorDOMAgent::documentURLString(parentStyleSheet->ownerDocument()); 1314521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } else { 1315521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) sourceURL = ""; 1316521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 1317521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 1318521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (mediaList && mediaList->length()) { 13190019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch mediaArray->addItem(buildMediaObject(mediaList, isMediaRule ? MediaListSourceMediaRule : MediaListSourceImportRule, sourceURL, parentStyleSheet)); 1320521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) hasItems = true; 1321521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 1322521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 1323521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (parentRule->parentRule()) { 1324521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) parentRule = parentRule->parentRule(); 1325521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } else { 1326521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) CSSStyleSheet* styleSheet = parentRule->parentStyleSheet(); 1327521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) while (styleSheet) { 1328521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) mediaList = styleSheet->media(); 1329521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (mediaList && mediaList->length()) { 1330521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) Document* doc = styleSheet->ownerDocument(); 1331521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (doc) 1332521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) sourceURL = doc->url(); 1333521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) else if (!styleSheet->contents()->baseURL().isEmpty()) 1334521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) sourceURL = styleSheet->contents()->baseURL(); 1335521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) else 1336521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) sourceURL = ""; 13370019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch mediaArray->addItem(buildMediaObject(mediaList, styleSheet->ownerNode() ? MediaListSourceLinkedSheet : MediaListSourceInlineSheet, sourceURL, styleSheet)); 1338521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) hasItems = true; 1339521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 1340521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) parentRule = styleSheet->ownerRule(); 1341521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (parentRule) 1342521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) break; 1343521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) styleSheet = styleSheet->parentStyleSheet(); 1344521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 1345521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 1346521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) } 1347521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return hasItems ? mediaArray : 0; 1348521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)} 1349521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 13505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)InspectorStyleSheetForInlineStyle* InspectorCSSAgent::asInspectorStyleSheet(Element* element) 13515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 13525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NodeToInspectorStyleSheet::iterator it = m_nodeToInspectorStyleSheet.find(element); 1353fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch if (it != m_nodeToInspectorStyleSheet.end()) 1354fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch return it->value.get(); 13555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1356fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch CSSStyleDeclaration* style = element->isStyledElement() ? element->style() : 0; 1357fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch if (!style) 1358fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch return 0; 13595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1360fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch String newStyleSheetId = String::number(m_lastStyleSheetId++); 1361fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch RefPtr<InspectorStyleSheetForInlineStyle> inspectorStyleSheet = InspectorStyleSheetForInlineStyle::create(m_pageAgent, newStyleSheetId, element, TypeBuilder::CSS::StyleSheetOrigin::Regular, this); 1362fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch m_idToInspectorStyleSheet.set(newStyleSheetId, inspectorStyleSheet); 1363fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch m_nodeToInspectorStyleSheet.set(element, inspectorStyleSheet); 1364fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch return inspectorStyleSheet.get(); 13655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 13665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Element* InspectorCSSAgent::elementForId(ErrorString* errorString, int nodeId) 13685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 13695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Node* node = m_domAgent->nodeForId(nodeId); 13705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!node) { 13715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *errorString = "No node with given id found"; 13725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 13735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1374fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch if (!node->isElementNode()) { 13755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *errorString = "Not an element node"; 13765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 13775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 13785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return toElement(node); 13795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 13805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int InspectorCSSAgent::documentNodeWithRequestedFlowsId(Document* document) 13825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 13835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int documentNodeId = m_domAgent->boundNodeId(document); 13845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!documentNodeId || !m_namedFlowCollectionsRequested.contains(documentNodeId)) 13855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 13865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return documentNodeId; 13885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 13895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 139053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorCSSAgent::collectAllStyleSheets(Vector<InspectorStyleSheet*>& result) 139153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){ 139253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) Vector<Document*> documents = m_domAgent->documents(); 139353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (Vector<Document*>::iterator it = documents.begin(); it != documents.end(); ++it) { 139453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) StyleSheetList* list = (*it)->styleSheets(); 139553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (unsigned i = 0; i < list->length(); ++i) { 139653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) StyleSheet* styleSheet = list->item(i); 139753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (styleSheet->isCSSStyleSheet()) 139853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) collectStyleSheets(static_cast<CSSStyleSheet*>(styleSheet), result); 139953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 140053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) } 140153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} 140253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 140353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorCSSAgent::collectStyleSheets(CSSStyleSheet* styleSheet, Vector<InspectorStyleSheet*>& result) 14045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 14055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorStyleSheet* inspectorStyleSheet = bindStyleSheet(static_cast<CSSStyleSheet*>(styleSheet)); 140653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) result.append(inspectorStyleSheet); 14075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned i = 0, size = styleSheet->length(); i < size; ++i) { 14085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CSSRule* rule = styleSheet->item(i); 1409926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (rule->type() == CSSRule::IMPORT_RULE) { 14105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CSSStyleSheet* importedStyleSheet = static_cast<CSSImportRule*>(rule)->styleSheet(); 14115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (importedStyleSheet) 14125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) collectStyleSheets(importedStyleSheet, result); 14135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 14165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)InspectorStyleSheet* InspectorCSSAgent::bindStyleSheet(CSSStyleSheet* styleSheet) 14185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 14195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<InspectorStyleSheet> inspectorStyleSheet = m_cssStyleSheetToInspectorStyleSheet.get(styleSheet); 14205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!inspectorStyleSheet) { 14215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String id = String::number(m_lastStyleSheetId++); 14225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Document* document = styleSheet->ownerDocument(); 1423521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) inspectorStyleSheet = InspectorStyleSheet::create(m_pageAgent, id, styleSheet, detectOrigin(styleSheet, document), InspectorDOMAgent::documentURLString(document), this); 14245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_idToInspectorStyleSheet.set(id, inspectorStyleSheet); 14255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_cssStyleSheetToInspectorStyleSheet.set(styleSheet, inspectorStyleSheet); 142653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (m_creatingViaInspectorStyleSheet) 142753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_documentToInspectorStyleSheet.add(document, inspectorStyleSheet); 14285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return inspectorStyleSheet.get(); 14305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 14315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 143253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)String InspectorCSSAgent::unbindStyleSheet(InspectorStyleSheet* inspectorStyleSheet) 143353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){ 143453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) String id = inspectorStyleSheet->id(); 143553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_idToInspectorStyleSheet.remove(id); 143653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (inspectorStyleSheet->pageStyleSheet()) 143753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_cssStyleSheetToInspectorStyleSheet.remove(inspectorStyleSheet->pageStyleSheet()); 143853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return id; 143953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} 144053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 14415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)InspectorStyleSheet* InspectorCSSAgent::viaInspectorStyleSheet(Document* document, bool createIfAbsent) 14425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 14435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!document) { 14445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!createIfAbsent); 14455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 14465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1448926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!document->isHTMLDocument() && !document->isSVGDocument()) 1449926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return 0; 1450926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 14515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<InspectorStyleSheet> inspectorStyleSheet = m_documentToInspectorStyleSheet.get(document); 14525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (inspectorStyleSheet || !createIfAbsent) 14535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return inspectorStyleSheet.get(); 14545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1455df95704c49daea886ddad70775bda23618d6274dBen Murdoch TrackExceptionState es; 1456df95704c49daea886ddad70775bda23618d6274dBen Murdoch RefPtr<Element> styleElement = document->createElement("style", es); 1457df95704c49daea886ddad70775bda23618d6274dBen Murdoch if (!es.hadException()) 1458df95704c49daea886ddad70775bda23618d6274dBen Murdoch styleElement->setAttribute("type", "text/css", es); 1459df95704c49daea886ddad70775bda23618d6274dBen Murdoch if (!es.hadException()) { 14605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ContainerNode* targetNode; 14615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // HEAD is absent in ImageDocuments, for example. 14625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (document->head()) 14635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) targetNode = document->head(); 14645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (document->body()) 14655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) targetNode = document->body(); 14665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 14675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 14685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InlineStyleOverrideScope overrideScope(document); 147053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_creatingViaInspectorStyleSheet = true; 1471df95704c49daea886ddad70775bda23618d6274dBen Murdoch targetNode->appendChild(styleElement, es, AttachLazily); 147253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // At this point the added stylesheet will get bound through the updateActiveStyleSheets() invocation. 147353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) // We just need to pick the respective InspectorStyleSheet from m_documentToInspectorStyleSheet. 147453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_creatingViaInspectorStyleSheet = false; 14755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1476df95704c49daea886ddad70775bda23618d6274dBen Murdoch if (es.hadException()) 14775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 1478926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 147981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) return m_documentToInspectorStyleSheet.get(document); 14805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 14815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)InspectorStyleSheet* InspectorCSSAgent::assertStyleSheetForId(ErrorString* errorString, const String& styleSheetId) 14835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 14845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IdToInspectorStyleSheet::iterator it = m_idToInspectorStyleSheet.find(styleSheetId); 14855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (it == m_idToInspectorStyleSheet.end()) { 14865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *errorString = "No style sheet with given id found"; 14875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 14885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return it->value.get(); 14905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 14915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TypeBuilder::CSS::StyleSheetOrigin::Enum InspectorCSSAgent::detectOrigin(CSSStyleSheet* pageStyleSheet, Document* ownerDocument) 14935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 149453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (m_creatingViaInspectorStyleSheet) 149553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return TypeBuilder::CSS::StyleSheetOrigin::Inspector; 149653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 14975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) TypeBuilder::CSS::StyleSheetOrigin::Enum origin = TypeBuilder::CSS::StyleSheetOrigin::Regular; 14985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (pageStyleSheet && !pageStyleSheet->ownerNode() && pageStyleSheet->href().isEmpty()) 14995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) origin = TypeBuilder::CSS::StyleSheetOrigin::User_agent; 15005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (pageStyleSheet && pageStyleSheet->ownerNode() && pageStyleSheet->ownerNode()->nodeName() == "#document") 15015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) origin = TypeBuilder::CSS::StyleSheetOrigin::User; 15025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else { 15035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InspectorStyleSheet* viaInspectorStyleSheetForOwner = viaInspectorStyleSheet(ownerDocument, false); 15045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (viaInspectorStyleSheetForOwner && pageStyleSheet == viaInspectorStyleSheetForOwner->pageStyleSheet()) 15055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) origin = TypeBuilder::CSS::StyleSheetOrigin::Inspector; 15065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return origin; 15085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 15095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<TypeBuilder::CSS::CSSRule> InspectorCSSAgent::buildObjectForRule(CSSStyleRule* rule, StyleResolver* styleResolver) 15115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 15125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!rule) 15135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 15145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // CSSRules returned by StyleResolver::styleRulesForElement lack parent pointers since that infomation is not cheaply available. 15165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Since the inspector wants to walk the parent chain, we construct the full wrappers here. 15175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: This could be factored better. StyleResolver::styleRulesForElement should return a StyleRule vector, not a CSSRuleList. 15185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!rule->parentStyleSheet()) { 1519926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) rule = styleResolver->inspectorCSSOMWrappers().getWrapperForRuleInSheets(rule->styleRule(), styleResolver->document()->styleSheetCollection()); 15205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!rule) 15215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 15225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1523521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return bindStyleSheet(rule->parentStyleSheet())->buildObjectForRule(rule, buildMediaListChain(rule)); 15245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 15255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSRule> > InspectorCSSAgent::buildArrayForRuleList(CSSRuleList* ruleList, StyleResolver* styleResolver) 15275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 15285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSRule> > result = TypeBuilder::Array<TypeBuilder::CSS::CSSRule>::create(); 15295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!ruleList) 15305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result.release(); 15315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1532521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) RefPtr<CSSRuleList> refRuleList = ruleList; 1533521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) CSSRuleVector rules; 1534521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) InspectorStyleSheet::collectFlatRules(refRuleList, &rules); 1535521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 1536521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) for (unsigned i = 0, size = rules.size(); i < size; ++i) { 1537521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) CSSStyleRule* styleRule = asCSSStyleRule(rules.at(i).get()); 1538521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (!styleRule) 15395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 1540521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) result->addItem(buildObjectForRule(styleRule, styleResolver)); 15415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1542521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 15435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result.release(); 15445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 15455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::RuleMatch> > InspectorCSSAgent::buildArrayForMatchedRuleList(CSSRuleList* ruleList, StyleResolver* styleResolver, Element* element) 15475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 15485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::Array<TypeBuilder::CSS::RuleMatch> > result = TypeBuilder::Array<TypeBuilder::CSS::RuleMatch>::create(); 15495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!ruleList) 15505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result.release(); 15515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned i = 0, size = ruleList->length(); i < size; ++i) { 15535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CSSStyleRule* rule = asCSSStyleRule(ruleList->item(i)); 15545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::CSS::CSSRule> ruleObject = buildObjectForRule(rule, styleResolver); 15555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!ruleObject) 15565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 15575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::Array<int> > matchingSelectors = TypeBuilder::Array<int>::create(); 15585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const CSSSelectorList& selectorList = rule->styleRule()->selectorList(); 15595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) long index = 0; 1560926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) for (const CSSSelector* selector = selectorList.first(); selector; selector = CSSSelectorList::next(selector)) { 15611fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch bool matched = element->webkitMatchesSelector(selector->selectorText(), IGNORE_EXCEPTION); 15625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (matched) 15635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) matchingSelectors->addItem(index); 15645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++index; 15655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::CSS::RuleMatch> match = TypeBuilder::CSS::RuleMatch::create() 15675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) .setRule(ruleObject) 15685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) .setMatchingSelectors(matchingSelectors); 15695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result->addItem(match); 15705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; 15735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 15745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<TypeBuilder::CSS::CSSStyle> InspectorCSSAgent::buildObjectForAttributesStyle(Element* element) 15765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 15775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!element->isStyledElement()) 15785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 15795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 158093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) // FIXME: Ugliness below. 1581591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch StylePropertySet* attributeStyle = const_cast<StylePropertySet*>(element->presentationAttributeStyle()); 15825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!attributeStyle) 15835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 15845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 158593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) ASSERT(attributeStyle->isMutable()); 158693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) MutableStylePropertySet* mutableAttributeStyle = static_cast<MutableStylePropertySet*>(attributeStyle); 158793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 158893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) RefPtr<InspectorStyle> inspectorStyle = InspectorStyle::create(InspectorCSSId(), mutableAttributeStyle->ensureCSSStyleDeclaration(), 0); 15895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return inspectorStyle->buildObjectForStyle(); 15905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 15915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::Region> > InspectorCSSAgent::buildArrayForRegions(ErrorString* errorString, PassRefPtr<NodeList> regionList, int documentNodeId) 15935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 15945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::Array<TypeBuilder::CSS::Region> > regions = TypeBuilder::Array<TypeBuilder::CSS::Region>::create(); 15955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned i = 0; i < regionList->length(); ++i) { 15975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) TypeBuilder::CSS::Region::RegionOverset::Enum regionOverset; 15985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1599591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch switch (toElement(regionList->item(i))->renderRegion()->regionOversetState()) { 1600591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch case RegionFit: 16015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) regionOverset = TypeBuilder::CSS::Region::RegionOverset::Fit; 16025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1603591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch case RegionEmpty: 16045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) regionOverset = TypeBuilder::CSS::Region::RegionOverset::Empty; 16055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1606591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch case RegionOverset: 16075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) regionOverset = TypeBuilder::CSS::Region::RegionOverset::Overset; 16085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1609591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch case RegionUndefined: 16105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 16115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 16125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 16135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; 16145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 16155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::CSS::Region> region = TypeBuilder::CSS::Region::create() 16175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) .setRegionOverset(regionOverset) 16185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // documentNodeId was previously asserted 16195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) .setNodeId(m_domAgent->pushNodeToFrontend(errorString, documentNodeId, regionList->item(i))); 16205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) regions->addItem(region); 16225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 16235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return regions.release(); 16255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 16265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 162753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)PassRefPtr<TypeBuilder::CSS::NamedFlow> InspectorCSSAgent::buildObjectForNamedFlow(ErrorString* errorString, NamedFlow* webkitNamedFlow, int documentNodeId) 16285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 16295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<NodeList> contentList = webkitNamedFlow->getContent(); 16305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::Array<int> > content = TypeBuilder::Array<int>::create(); 16315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned i = 0; i < contentList->length(); ++i) { 16335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // documentNodeId was previously asserted 16345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) content->addItem(m_domAgent->pushNodeToFrontend(errorString, documentNodeId, contentList->item(i))); 16355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 16365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RefPtr<TypeBuilder::CSS::NamedFlow> namedFlow = TypeBuilder::CSS::NamedFlow::create() 16385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) .setDocumentNodeId(documentNodeId) 16395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) .setName(webkitNamedFlow->name().string()) 16405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) .setOverset(webkitNamedFlow->overset()) 16415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) .setContent(content) 16425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) .setRegions(buildArrayForRegions(errorString, webkitNamedFlow->getRegions(), documentNodeId)); 16435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return namedFlow.release(); 16455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 16465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::didRemoveDocument(Document* document) 16485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 16495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (document) 16505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_documentToInspectorStyleSheet.remove(document); 16515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 16525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::didRemoveDOMNode(Node* node) 16545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 16555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!node) 16565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 16575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int nodeId = m_domAgent->boundNodeId(node); 16595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (nodeId) 16605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_nodeIdToForcedPseudoState.remove(nodeId); 16615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NodeToInspectorStyleSheet::iterator it = m_nodeToInspectorStyleSheet.find(node); 16635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (it == m_nodeToInspectorStyleSheet.end()) 16645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 16655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_idToInspectorStyleSheet.remove(it->value->id()); 16675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_nodeToInspectorStyleSheet.remove(node); 16685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 16695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::didModifyDOMAttr(Element* element) 16715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 16725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!element) 16735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 16745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NodeToInspectorStyleSheet::iterator it = m_nodeToInspectorStyleSheet.find(element); 16765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (it == m_nodeToInspectorStyleSheet.end()) 16775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 16785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) it->value->didModifyElementAttribute(); 16805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 16815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::styleSheetChanged(InspectorStyleSheet* styleSheet) 16835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 16845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_frontend) 16855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_frontend->styleSheetChanged(styleSheet->id()); 16865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 16875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16887757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdochvoid InspectorCSSAgent::willReparseStyleSheet() 16897757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch{ 16907757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch ASSERT(!m_isSettingStyleSheetText); 16917757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch m_isSettingStyleSheetText = true; 16927757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch} 16937757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 16947757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdochvoid InspectorCSSAgent::didReparseStyleSheet() 16957757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch{ 16967757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch ASSERT(m_isSettingStyleSheetText); 16977757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch m_isSettingStyleSheetText = false; 16987757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch} 16997757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 17005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCSSAgent::resetPseudoStates() 17015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 17025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HashSet<Document*> documentsToChange; 17035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (NodeIdToForcedPseudoState::iterator it = m_nodeIdToForcedPseudoState.begin(), end = m_nodeIdToForcedPseudoState.end(); it != end; ++it) { 17045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Element* element = toElement(m_domAgent->nodeForId(it->key)); 17055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (element && element->ownerDocument()) 17065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) documentsToChange.add(element->ownerDocument()); 17075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 17085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_nodeIdToForcedPseudoState.clear(); 17105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (HashSet<Document*>::iterator it = documentsToChange.begin(), end = documentsToChange.end(); it != end; ++it) 171183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch (*it)->setNeedsStyleRecalc(); 17125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 17135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 17145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore 17155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1716