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. ``AS IS'' AND ANY 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 2753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/DecodedDataDocumentParser.h" 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 29591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "core/dom/Document.h" 3051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/dom/DocumentEncodingData.h" 3109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/html/parser/TextResourceDecoder.h" 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 33c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)DecodedDataDocumentParser::DecodedDataDocumentParser(Document& document) 36d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) : DocumentParser(&document) 3709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) , m_needsDecoder(true) 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)DecodedDataDocumentParser::~DecodedDataDocumentParser() 4251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 4351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 4451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 4551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void DecodedDataDocumentParser::setDecoder(PassOwnPtr<TextResourceDecoder> decoder) 4651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 4709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // If the decoder is explicitly unset rather than having ownership 4809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // transferred away by takeDecoder(), we need to make sure it's recreated 4909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // next time data is appended. 5009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_needsDecoder = !decoder; 5151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) m_decoder = decoder; 5251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 5351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 5451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)TextResourceDecoder* DecodedDataDocumentParser::decoder() 5551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 5651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return m_decoder.get(); 5751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 5851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 5909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)PassOwnPtr<TextResourceDecoder> DecodedDataDocumentParser::takeDecoder() 6051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 6109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return m_decoder.release(); 6251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 6351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 6451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void DecodedDataDocumentParser::appendBytes(const char* data, size_t length) 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!length) 6751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return; 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 69bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) // This should be checking isStopped(), but XMLDocumentParser prematurely 70bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) // stops parsing when handling an XSLT processing instruction and still 71bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) // needs to receive decoded bytes. 72bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) if (isDetached()) 7351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return; 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) String decoded = m_decoder->decode(data, length); 7651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) updateDocument(decoded); 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void DecodedDataDocumentParser::flush() 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 81bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) // This should be checking isStopped(), but XMLDocumentParser prematurely 82bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) // stops parsing when handling an XSLT processing instruction and still 83bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) // needs to receive decoded bytes. 84bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) if (isDetached()) 8551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return; 8606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 87591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch // null decoder indicates there is no data received. 88591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch // We have nothing to do in that case. 8951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (!m_decoder) 9051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return; 9151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 9251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) String remainingData = m_decoder->flush(); 9351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) updateDocument(remainingData); 9451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 9551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 9651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void DecodedDataDocumentParser::updateDocument(String& decodedData) 9751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 9809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) document()->setEncodingData(DocumentEncodingData(*m_decoder.get())); 9951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 10009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!decodedData.isEmpty()) 10109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) append(decodedData.releaseImpl()); 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 105