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