15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This file is part of the XSL implementation.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2006, 2008, 2012 Apple Inc. All rights reserved.
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef XSLStyleSheet_h
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define XSLStyleSheet_h
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include <libxml/tree.h>
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <libxslt/transform.h>
2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/StyleSheet.h"
2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ProcessingInstruction.h"
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <wtf/PassRefPtr.h>
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
343464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdochclass ResourceFetcher;
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class XSLImportRule;
3602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class XSLStyleSheet : public StyleSheet {
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static PassRefPtr<XSLStyleSheet> create(XSLImportRule* parentImport, const String& originalURL, const KURL& finalURL)
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return adoptRef(new XSLStyleSheet(parentImport, originalURL, finalURL));
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static PassRefPtr<XSLStyleSheet> create(ProcessingInstruction* parentNode, const String& originalURL, const KURL& finalURL)
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return adoptRef(new XSLStyleSheet(parentNode, originalURL, finalURL, false));
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static PassRefPtr<XSLStyleSheet> createEmbedded(ProcessingInstruction* parentNode, const KURL& finalURL)
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return adoptRef(new XSLStyleSheet(parentNode, finalURL.string(), finalURL, true));
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Taking an arbitrary node is unsafe, because owner node pointer can become stale.
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // XSLTProcessor ensures that the stylesheet doesn't outlive its parent, in part by not exposing it to JavaScript.
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static PassRefPtr<XSLStyleSheet> createForXSLTProcessor(Node* parentNode, const String& originalURL, const KURL& finalURL)
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return adoptRef(new XSLStyleSheet(parentNode, originalURL, finalURL, false));
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual ~XSLStyleSheet();
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool parseString(const String&);
6202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void checkLoaded();
6402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const KURL& finalURL() const { return m_finalURL; }
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void loadChildSheets();
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void loadChildSheet(const String& href);
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
703464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch    ResourceFetcher* fetcher();
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Document* ownerDocument();
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual XSLStyleSheet* parentStyleSheet() const OVERRIDE { return m_parentStyleSheet; }
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setParentStyleSheet(XSLStyleSheet* parent);
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    xmlDocPtr document();
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    xsltStylesheetPtr compileStyleSheet();
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    xmlDocPtr locateStylesheetSubResource(xmlDocPtr parentDoc, const xmlChar* uri);
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void clearDocuments();
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void markAsProcessed();
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool processed() const { return m_processed; }
8402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual String type() const OVERRIDE { return "text/xml"; }
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool disabled() const OVERRIDE { return m_isDisabled; }
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void setDisabled(bool b) OVERRIDE { m_isDisabled = b; }
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual Node* ownerNode() const OVERRIDE { return m_ownerNode; }
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual String href() const OVERRIDE { return m_originalURL; }
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual String title() const OVERRIDE { return emptyString(); }
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void clearOwnerNode() OVERRIDE { m_ownerNode = 0; }
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual KURL baseURL() const OVERRIDE { return m_finalURL; }
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool isLoading() const OVERRIDE;
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool isXSLStyleSheet() const OVERRIDE { return true; }
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    XSLStyleSheet(Node* parentNode, const String& originalURL, const KURL& finalURL, bool embedded);
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    XSLStyleSheet(XSLImportRule* parentImport, const String& originalURL, const KURL& finalURL);
10153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* m_ownerNode;
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String m_originalURL;
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    KURL m_finalURL;
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_isDisabled;
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<OwnPtr<XSLImportRule> > m_children;
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_embedded;
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_processed;
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    xmlDocPtr m_stylesheetDoc;
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_stylesheetDocTaken;
114faba41ffa661cd78b7a334ae61a88fa41952497cTorne (Richard Coles)    bool m_compilationFailed;
11553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    XSLStyleSheet* m_parentStyleSheet;
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // XSLStyleSheet_h
122