18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2000 Peter Kelly (pmk@post.com)
3231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * Copyright (C) 2006, 2008, 2009 Apple Inc. All rights reserved.
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ProcessingInstruction.h"
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSStyleSheet.h"
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedCSSStyleSheet.h"
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedXSLStyleSheet.h"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Document.h"
285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "CachedResourceLoader.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ExceptionCode.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Frame.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameLoader.h"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "XSLStyleSheet.h"
33545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include "XMLDocumentParser.h" // for parseAttributes()
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "MediaList.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockinline ProcessingInstruction::ProcessingInstruction(Document* document, const String& target, const String& data)
39231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    : ContainerNode(document)
40231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    , m_target(target)
41231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    , m_data(data)
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_cachedSheet(0)
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_loading(false)
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_alternate(false)
45643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    , m_createdByParser(false)
4681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_isCSS(false)
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(XSLT)
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_isXSL(false)
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
53231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockPassRefPtr<ProcessingInstruction> ProcessingInstruction::create(Document* document, const String& target, const String& data)
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
55231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return adoptRef(new ProcessingInstruction(document, target, data));
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectProcessingInstruction::~ProcessingInstruction()
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
606b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (m_sheet)
616b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        m_sheet->clearOwnerNode();
626b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_cachedSheet)
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_cachedSheet->removeClient(this);
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ProcessingInstruction::setData(const String& data, ExceptionCode&)
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int oldLength = m_data.length();
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_data = data;
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    document()->textRemoved(this, 0, oldLength);
72231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    checkStyleSheet();
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString ProcessingInstruction::nodeName() const
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_target;
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNode::NodeType ProcessingInstruction::nodeType() const
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return PROCESSING_INSTRUCTION_NODE;
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString ProcessingInstruction::nodeValue() const
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_data;
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ProcessingInstruction::setNodeValue(const String& nodeValue, ExceptionCode& ec)
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // NO_MODIFICATION_ALLOWED_ERR: taken care of by setData()
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setData(nodeValue, ec);
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<Node> ProcessingInstruction::cloneNode(bool /*deep*/)
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
98231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // FIXME: Is it a problem that this does not copy m_localHref?
99231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // What about other data members?
100231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return create(document(), m_target, m_data);
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// DOM Section 1.1.1
1042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochbool ProcessingInstruction::childTypeAllowed(NodeType) const
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ProcessingInstruction::checkStyleSheet()
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_target == "xml-stylesheet" && document()->frame() && parentNode() == document()) {
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // see http://www.w3.org/TR/xml-stylesheet/
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // ### support stylesheet included in a fragment of this (or another) document
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // ### make sure this gets called when adding from javascript
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool attrsOk;
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const HashMap<String, String> attrs = parseAttributes(m_data, attrsOk);
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!attrsOk)
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HashMap<String, String>::const_iterator i = attrs.find("type");
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        String type;
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (i != attrs.end())
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            type = i->second;
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_isCSS = type.isEmpty() || type == "text/css";
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(XSLT)
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_isXSL = (type == "text/xml" || type == "text/xsl" || type == "application/xml" ||
1270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                   type == "application/xhtml+xml" || type == "application/rss+xml" || type == "application/atom+xml");
12881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (!m_isCSS && !m_isXSL)
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
13081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (!m_isCSS)
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        String href = attrs.get("href");
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        String alternate = attrs.get("alternate");
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_alternate = alternate == "yes";
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_title = attrs.get("title");
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_media = attrs.get("media");
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
140635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (href.length() > 1 && href[0] == '#') {
141635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            m_localHref = href.substring(1);
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(XSLT)
143635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            // We need to make a synthetic XSLStyleSheet that is embedded.  It needs to be able
144635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            // to kick off import/include loads that can hang off some parent sheet.
145635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (m_isXSL) {
1468a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                KURL finalURL(ParsedURLString, m_localHref);
1474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                m_sheet = XSLStyleSheet::createEmbedded(this, finalURL);
148635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                m_loading = false;
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
150635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
151635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        } else {
152231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            if (m_cachedSheet) {
153231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_cachedSheet->removeClient(this);
154231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_cachedSheet = 0;
155231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            }
156231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
157231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            String url = document()->completeURL(href).string();
158231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            if (!dispatchBeforeLoadEvent(url))
159231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                return;
160231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
161635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            m_loading = true;
162635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            document()->addPendingSheet();
163231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(XSLT)
165635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (m_isXSL)
1665abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                m_cachedSheet = document()->cachedResourceLoader()->requestXSLStyleSheet(url);
167635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            else
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
169635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            {
170635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                String charset = attrs.get("charset");
171635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (charset.isEmpty())
1722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    charset = document()->charset();
173635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1745abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                m_cachedSheet = document()->cachedResourceLoader()->requestCSSStyleSheet(url, charset);
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
176635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (m_cachedSheet)
177635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                m_cachedSheet->addClient(this);
178231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            else {
179231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                // The request may have been denied if (for example) the stylesheet is local and the document is remote.
180231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                m_loading = false;
181231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                document()->removePendingSheet();
182231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            }
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ProcessingInstruction::isLoading() const
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_loading)
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_sheet)
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_sheet->isLoading();
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ProcessingInstruction::sheetLoaded()
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!isLoading()) {
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        document()->removePendingSheet();
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
205d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid ProcessingInstruction::setCSSStyleSheet(const String& href, const KURL& baseURL, const String& charset, const CachedCSSStyleSheet* sheet)
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2076b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!inDocument()) {
2086b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        ASSERT(!m_sheet);
2096b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return;
2106b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    }
2116b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
21281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ASSERT(m_isCSS);
213d0825bca7fe65beaee391d30da42e937db621564Steve Block    RefPtr<CSSStyleSheet> newSheet = CSSStyleSheet::create(this, href, baseURL, charset);
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_sheet = newSheet;
215d0825bca7fe65beaee391d30da42e937db621564Steve Block    // We don't need the cross-origin security check here because we are
216d0825bca7fe65beaee391d30da42e937db621564Steve Block    // getting the sheet text in "strict" mode. This enforces a valid CSS MIME
217d0825bca7fe65beaee391d30da42e937db621564Steve Block    // type.
218d0825bca7fe65beaee391d30da42e937db621564Steve Block    parseStyleSheet(sheet->sheetText(true));
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    newSheet->setTitle(m_title);
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    newSheet->setMedia(MediaList::create(newSheet.get(), m_media));
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    newSheet->setDisabled(m_alternate);
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(XSLT)
225d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid ProcessingInstruction::setXSLStyleSheet(const String& href, const KURL& baseURL, const String& sheet)
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_isXSL);
228d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_sheet = XSLStyleSheet::create(this, href, baseURL);
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    parseStyleSheet(sheet);
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ProcessingInstruction::parseStyleSheet(const String& sheet)
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_sheet->parseString(sheet, true);
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_cachedSheet)
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_cachedSheet->removeClient(this);
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_cachedSheet = 0;
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_loading = false;
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_sheet->checkLoaded();
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ProcessingInstruction::setCSSStyleSheet(PassRefPtr<CSSStyleSheet> sheet)
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(!m_cachedSheet);
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(!m_loading);
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_sheet = sheet;
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_sheet->setTitle(m_title);
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_sheet->setDisabled(m_alternate);
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool ProcessingInstruction::offsetInCharacters() const
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint ProcessingInstruction::maxCharacterOffset() const
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return static_cast<int>(m_data.length());
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
263635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid ProcessingInstruction::addSubresourceAttributeURLs(ListHashSet<KURL>& urls) const
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!sheet())
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
267635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
268635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    addSubresourceURL(urls, sheet()->baseURL());
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ProcessingInstruction::insertedIntoDocument()
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ContainerNode::insertedIntoDocument();
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    document()->addStyleSheetCandidateNode(this, m_createdByParser);
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkStyleSheet();
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ProcessingInstruction::removedFromDocument()
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ContainerNode::removedFromDocument();
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    document()->removeStyleSheetCandidateNode(this);
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2846b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (m_sheet) {
2856b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        ASSERT(m_sheet->ownerNode() == this);
2866b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        m_sheet->clearOwnerNode();
2876b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        m_sheet = 0;
2886b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    }
2896b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_cachedSheet)
2915ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        document()->styleSelectorChanged(DeferRecalcStyle);
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ProcessingInstruction::finishParsingChildren()
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_createdByParser = false;
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ContainerNode::finishParsingChildren();
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace
301