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