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