Home | History | Annotate | Download | only in fetch
      1 /*
      2     Copyright (C) 1998 Lars Knoll (knoll (at) mpi-hd.mpg.de)
      3     Copyright (C) 2001 Dirk Mueller (mueller (at) kde.org)
      4     Copyright (C) 2002 Waldo Bastian (bastian (at) kde.org)
      5     Copyright (C) 2006 Samuel Weinig (sam.weinig (at) gmail.com)
      6     Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
      7 
      8     This library is free software; you can redistribute it and/or
      9     modify it under the terms of the GNU Library General Public
     10     License as published by the Free Software Foundation; either
     11     version 2 of the License, or (at your option) any later version.
     12 
     13     This library is distributed in the hope that it will be useful,
     14     but WITHOUT ANY WARRANTY; without even the implied warranty of
     15     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     16     Library General Public License for more details.
     17 
     18     You should have received a copy of the GNU Library General Public License
     19     along with this library; see the file COPYING.LIB.  If not, write to
     20     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
     21     Boston, MA 02110-1301, USA.
     22 
     23     This class provides all functionality needed for loading images, style sheets and html
     24     pages from the web. It has a memory cache for these objects.
     25 */
     26 
     27 #include "config.h"
     28 #include "core/fetch/ScriptResource.h"
     29 
     30 #include "platform/MIMETypeRegistry.h"
     31 #include "platform/SharedBuffer.h"
     32 #include "platform/network/HTTPParsers.h"
     33 
     34 namespace WebCore {
     35 
     36 ScriptResource::ScriptResource(const ResourceRequest& resourceRequest, const String& charset)
     37     : TextResource(resourceRequest, Script, "application/javascript", charset)
     38 {
     39     DEFINE_STATIC_LOCAL(const AtomicString, acceptScript, ("*/*", AtomicString::ConstructFromLiteral));
     40 
     41     // It's javascript we want.
     42     // But some websites think their scripts are <some wrong mimetype here>
     43     // and refuse to serve them if we only accept application/x-javascript.
     44     setAccept(acceptScript);
     45 }
     46 
     47 ScriptResource::~ScriptResource()
     48 {
     49 }
     50 
     51 AtomicString ScriptResource::mimeType() const
     52 {
     53     return extractMIMETypeFromMediaType(m_response.httpHeaderField("Content-Type")).lower();
     54 }
     55 
     56 const String& ScriptResource::script()
     57 {
     58     ASSERT(!isPurgeable());
     59     ASSERT(isLoaded());
     60 
     61     if (!m_script && m_data) {
     62         String script = decodedText();
     63         m_data.clear();
     64         // We lie a it here and claim that script counts as encoded data (even though it's really decoded data).
     65         // That's because the MemoryCache thinks that it can clear out decoded data by calling destroyDecodedData(),
     66         // but we can't destroy script in destroyDecodedData because that's our only copy of the data!
     67         setEncodedSize(script.sizeInBytes());
     68         m_script = AtomicString(script);
     69     }
     70 
     71     return m_script.string();
     72 }
     73 
     74 bool ScriptResource::mimeTypeAllowedByNosniff() const
     75 {
     76     return parseContentTypeOptionsHeader(m_response.httpHeaderField("X-Content-Type-Options")) != ContentTypeOptionsNosniff || MIMETypeRegistry::isSupportedJavaScriptMIMEType(mimeType());
     77 }
     78 
     79 } // namespace WebCore
     80