18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de) 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Copyright (C) 2001 Dirk Mueller (mueller@kde.org) 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Copyright (C) 2002 Waldo Bastian (bastian@kde.org) 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com) 6635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project This library is free software; you can redistribute it and/or 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project modify it under the terms of the GNU Library General Public 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project License as published by the Free Software Foundation; either 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project version 2 of the License, or (at your option) any later version. 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project This library is distributed in the hope that it will be useful, 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project but WITHOUT ANY WARRANTY; without even the implied warranty of 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Library General Public License for more details. 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project You should have received a copy of the GNU Library General Public License 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project along with this library; see the file COPYING.LIB. If not, write to 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Boston, MA 02110-1301, USA. 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project This class provides all functionality needed for loading images, style sheets and html 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project pages from the web. It has a memory cache for these objects. 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedScript.h" 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "MemoryCache.h" 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedResourceClient.h" 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedResourceClientWalker.h" 33dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "SharedBuffer.h" 348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "TextResourceDecoder.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/Vector.h> 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 37ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#if USE(JSC) 38ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#include <parser/SourceProvider.h> 39ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#endif 40ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCachedScript::CachedScript(const String& url, const String& charset) 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project : CachedResource(url, Script) 458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian , m_decoder(TextResourceDecoder::create("application/javascript", charset)) 46635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , m_decodedDataDeletionTimer(this, &CachedScript::decodedDataDeletionTimerFired) 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // It's javascript we want. 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // But some websites think their scripts are <some wrong mimetype here> 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // and refuse to serve them if we only accept application/x-javascript. 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setAccept("*/*"); 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCachedScript::~CachedScript() 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 582fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid CachedScript::didAddClient(CachedResourceClient* c) 592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (m_decodedDataDeletionTimer.isActive()) 612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_decodedDataDeletionTimer.stop(); 622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block CachedResource::didAddClient(c); 642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 66635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid CachedScript::allClientsRemoved() 67635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (double interval = memoryCache()->deadDecodedDataDeletionInterval()) 692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_decodedDataDeletionTimer.startOneShot(interval); 70635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 71635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CachedScript::setEncoding(const String& chs) 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_decoder->setEncoding(chs, TextResourceDecoder::EncodingFromHTTPHeader); 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString CachedScript::encoding() const 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return m_decoder->encoding().name(); 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 82635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectconst String& CachedScript::script() 83635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 84635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT(!isPurgeable()); 85635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 86635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!m_script && m_data) { 878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_script = m_decoder->decode(m_data->data(), encodedSize()); 888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian m_script += m_decoder->flush(); 89635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project setDecodedSize(m_script.length() * sizeof(UChar)); 90635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 912bde8e466a4451c7319e3a072d118917957d6554Steve Block m_decodedDataDeletionTimer.startOneShot(0); 922bde8e466a4451c7319e3a072d118917957d6554Steve Block 93635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return m_script; 94635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 95635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CachedScript::data(PassRefPtr<SharedBuffer> data, bool allDataReceived) 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!allDataReceived) 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_data = data; 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setEncodedSize(m_data.get() ? m_data->size() : 0); 1036c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen setLoading(false); 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkNotify(); 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1076b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid CachedScript::error(CachedResource::Status status) 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1096b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner setStatus(status); 1106b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner ASSERT(errorOccurred()); 1116c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen setLoading(false); 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project checkNotify(); 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 115635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid CachedScript::destroyDecodedData() 116635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 117635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_script = String(); 118ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch unsigned extraSize = 0; 119ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#if USE(JSC) 1202bde8e466a4451c7319e3a072d118917957d6554Steve Block if (m_sourceProviderCache && m_clients.isEmpty()) 1212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_sourceProviderCache->clear(); 1222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 123ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch extraSize = m_sourceProviderCache ? m_sourceProviderCache->byteSize() : 0; 124ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#endif 125ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch setDecodedSize(extraSize); 12628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (!MemoryCache::shouldMakeResourcePurgeableOnEviction() && isSafeToMakePurgeable()) 127635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project makePurgeable(true); 128635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 129635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 130635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid CachedScript::decodedDataDeletionTimerFired(Timer<CachedScript>*) 131635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 132635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project destroyDecodedData(); 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 134635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 135ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#if USE(JSC) 136ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen MurdochJSC::SourceProviderCache* CachedScript::sourceProviderCache() const 137ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{ 138ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch if (!m_sourceProviderCache) 139ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch m_sourceProviderCache = adoptPtr(new JSC::SourceProviderCache); 140ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch return m_sourceProviderCache.get(); 141ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch} 142ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 143ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid CachedScript::sourceProviderCacheSizeChanged(int delta) 144ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{ 145ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch setDecodedSize(decodedSize() + delta); 146ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch} 147ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#endif 148ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 149635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} // namespace WebCore 150