Home | History | Annotate | Download | only in dom
      1 /*
      2  * Copyright (C) 2010 Google, Inc. All Rights Reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
     17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #include "config.h"
     27 #include "core/dom/DecodedDataDocumentParser.h"
     28 
     29 #include "core/dom/Document.h"
     30 #include "core/dom/DocumentEncodingData.h"
     31 #include "core/html/parser/TextResourceDecoder.h"
     32 
     33 namespace blink {
     34 
     35 DecodedDataDocumentParser::DecodedDataDocumentParser(Document& document)
     36     : DocumentParser(&document)
     37     , m_needsDecoder(true)
     38 {
     39 }
     40 
     41 DecodedDataDocumentParser::~DecodedDataDocumentParser()
     42 {
     43 }
     44 
     45 void DecodedDataDocumentParser::setDecoder(PassOwnPtr<TextResourceDecoder> decoder)
     46 {
     47     // If the decoder is explicitly unset rather than having ownership
     48     // transferred away by takeDecoder(), we need to make sure it's recreated
     49     // next time data is appended.
     50     m_needsDecoder = !decoder;
     51     m_decoder = decoder;
     52 }
     53 
     54 TextResourceDecoder* DecodedDataDocumentParser::decoder()
     55 {
     56     return m_decoder.get();
     57 }
     58 
     59 PassOwnPtr<TextResourceDecoder> DecodedDataDocumentParser::takeDecoder()
     60 {
     61     return m_decoder.release();
     62 }
     63 
     64 void DecodedDataDocumentParser::appendBytes(const char* data, size_t length)
     65 {
     66     if (!length)
     67         return;
     68 
     69     // This should be checking isStopped(), but XMLDocumentParser prematurely
     70     // stops parsing when handling an XSLT processing instruction and still
     71     // needs to receive decoded bytes.
     72     if (isDetached())
     73         return;
     74 
     75     String decoded = m_decoder->decode(data, length);
     76     updateDocument(decoded);
     77 }
     78 
     79 void DecodedDataDocumentParser::flush()
     80 {
     81     // This should be checking isStopped(), but XMLDocumentParser prematurely
     82     // stops parsing when handling an XSLT processing instruction and still
     83     // needs to receive decoded bytes.
     84     if (isDetached())
     85         return;
     86 
     87     // null decoder indicates there is no data received.
     88     // We have nothing to do in that case.
     89     if (!m_decoder)
     90         return;
     91 
     92     String remainingData = m_decoder->flush();
     93     updateDocument(remainingData);
     94 }
     95 
     96 void DecodedDataDocumentParser::updateDocument(String& decodedData)
     97 {
     98     document()->setEncodingData(DocumentEncodingData(*m_decoder.get()));
     99 
    100     if (!decodedData.isEmpty())
    101         append(decodedData.releaseImpl());
    102 }
    103 
    104 };
    105