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