18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *           (C) 1999 Antti Koivisto (koivisto@kde.org)
45af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke * Copyright (C) 2004, 2005, 2006, 2007, 2010 Apple Inc. All rights reserved.
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLImageLoader.h"
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedImage.h"
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Element.h"
27231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "Event.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "EventNames.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLNames.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLObjectElement.h"
31a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "HTMLParserIdioms.h"
32f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "Settings.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
345af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#if USE(JSC)
355af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#include "JSDOMWindowBase.h"
362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include <runtime/JSLock.h>
375af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#endif
385af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHTMLImageLoader::HTMLImageLoader(Element* node)
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : ImageLoader(node)
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHTMLImageLoader::~HTMLImageLoader()
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLImageLoader::dispatchLoadEvent()
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // HTMLVideoElement uses this class to load the poster image, but it should not fire events for loading or failure.
5381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (element()->hasTagName(HTMLNames::videoTag))
5481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return;
5581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    bool errorOccurred = image()->errorOccurred();
574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    if (!errorOccurred && image()->response().httpStatusCode() >= 400)
585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        errorOccurred = element()->hasTagName(HTMLNames::objectTag); // An <object> considers a 404 to be an error and should fire onerror.
59231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    element()->dispatchEvent(Event::create(errorOccurred ? eventNames().errorEvent : eventNames().loadEvent, false, false));
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString HTMLImageLoader::sourceURI(const AtomicString& attr) const
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
64f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if ENABLE(DASHBOARD_SUPPORT)
65f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    Settings* settings = element()->document()->settings();
66f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (settings && settings->usesDashboardBackwardCompatibilityMode() && attr.length() > 7 && attr.startsWith("url(\"") && attr.endsWith("\")"))
67f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return attr.string().substring(5, attr.length() - 7);
68f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif
69f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
70a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    return stripLeadingAndTrailingHTMLSpaces(attr);
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
735f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid HTMLImageLoader::notifyFinished(CachedResource*)
745af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
755f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    CachedImage* cachedImage = image();
765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Element* elem = element();
785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    ImageLoader::notifyFinished(cachedImage);
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    bool loadError = cachedImage->errorOccurred() || cachedImage->response().httpStatusCode() >= 400;
815af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#if USE(JSC)
824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    if (!loadError) {
835af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        if (!elem->inDocument()) {
842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            JSC::JSLock lock(JSC::SilenceAssertionsOnly);
855af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            JSC::JSGlobalData* globalData = JSDOMWindowBase::commonJSGlobalData();
865af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            globalData->heap.reportExtraMemoryCost(cachedImage->encodedSize());
875af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        }
885af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    }
895af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#endif
905af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    if (loadError && elem->hasTagName(HTMLNames::objectTag))
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        static_cast<HTMLObjectElement*>(elem)->renderFallbackContent();
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
96