15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de)
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) 2001 Dirk Mueller (mueller@kde.org)
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) 2002 Waldo Bastian (bastian@kde.org)
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com)
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    This library is free software; you can redistribute it and/or
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    modify it under the terms of the GNU Library General Public
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    License as published by the Free Software Foundation; either
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    version 2 of the License, or (at your option) any later version.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    This library is distributed in the hope that it will be useful,
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    but WITHOUT ANY WARRANTY; without even the implied warranty of
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Library General Public License for more details.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    You should have received a copy of the GNU Library General Public License
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    along with this library; see the file COPYING.LIB.  If not, write to
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Boston, MA 02110-1301, USA.
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    This class provides all functionality needed for loading images, style sheets and html
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    pages from the web. It has a memory cache for these objects.
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
28e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/fetch/XSLStyleSheetResource.h"
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
301e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "RuntimeEnabledFeatures.h"
31e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/fetch/ResourceClientWalker.h"
32e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/fetch/StyleSheetResourceClient.h"
338abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#include "core/fetch/TextResourceDecoder.h"
341e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/SharedBuffer.h"
35e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/Vector.h"
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
393c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben MurdochXSLStyleSheetResource::XSLStyleSheetResource(const ResourceRequest& resourceRequest)
40e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    : StyleSheetResource(resourceRequest, XSLStyleSheet)
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_decoder(TextResourceDecoder::create("text/xsl"))
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
431e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    ASSERT(RuntimeEnabledFeatures::xsltEnabled());
445267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    DEFINE_STATIC_LOCAL(const AtomicString, acceptXSLT, ("text/xml, application/xml, application/xhtml+xml, text/xsl, application/rss+xml, application/atom+xml", AtomicString::ConstructFromLiteral));
455267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // It's XML we want.
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: This should accept more general xml formats */*+xml, image/svg+xml for example.
485267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    setAccept(acceptXSLT);
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
513c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdochvoid XSLStyleSheetResource::didAddClient(ResourceClient* c)
5202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{
533c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    ASSERT(c->resourceClientType() == StyleSheetResourceClient::expectedType());
54e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    Resource::didAddClient(c);
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!isLoading())
563c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        static_cast<StyleSheetResourceClient*>(c)->setXSLStyleSheet(m_resourceRequest.url(), m_response.url(), m_sheet);
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
593c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdochvoid XSLStyleSheetResource::setEncoding(const String& chs)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_decoder->setEncoding(chs, TextResourceDecoder::EncodingFromHTTPHeader);
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
643c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben MurdochString XSLStyleSheetResource::encoding() const
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_decoder->encoding().name();
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
693c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdochvoid XSLStyleSheetResource::checkNotify()
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_data.get()) {
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_sheet = m_decoder->decode(m_data->data(), encodedSize());
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_sheet.append(m_decoder->flush());
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
763c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    ResourceClientWalker<StyleSheetResourceClient> w(m_clients);
773c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    while (StyleSheetResourceClient* c = w.next())
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        c->setXSLStyleSheet(m_resourceRequest.url(), m_response.url(), m_sheet);
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} // namespace WebCore
82