diff options
Diffstat (limited to 'src/3rdparty/webkit/WebCore/loader')
7 files changed, 68 insertions, 25 deletions
diff --git a/src/3rdparty/webkit/WebCore/loader/Cache.cpp b/src/3rdparty/webkit/WebCore/loader/Cache.cpp index 391790f..46fb068 100644 --- a/src/3rdparty/webkit/WebCore/loader/Cache.cpp +++ b/src/3rdparty/webkit/WebCore/loader/Cache.cpp @@ -275,6 +275,12 @@ void Cache::pruneLiveResources() // Destroy any decoded data in live objects that we can. // Start from the tail, since this is the least recently accessed of the objects. + + // The list might not be sorted by the m_lastDecodedAccessTime. The impact + // of this weaker invariant is minor as the below if statement to check the + // elapsedTime will evaluate to false as the currentTime will be a lot + // greater than the current->m_lastDecodedAccessTime. + // For more details see: https://bugs.webkit.org/show_bug.cgi?id=30209 CachedResource* current = m_liveDecodedResources.m_tail; while (current) { CachedResource* prev = current->m_prevInLiveResourcesList; diff --git a/src/3rdparty/webkit/WebCore/loader/CachedResource.cpp b/src/3rdparty/webkit/WebCore/loader/CachedResource.cpp index 43de633..f2f52b0 100644 --- a/src/3rdparty/webkit/WebCore/loader/CachedResource.cpp +++ b/src/3rdparty/webkit/WebCore/loader/CachedResource.cpp @@ -242,6 +242,12 @@ void CachedResource::setDecodedSize(unsigned size) cache()->insertInLRUList(this); // Insert into or remove from the live decoded list if necessary. + // When inserting into the LiveDecodedResourcesList it is possible + // that the m_lastDecodedAccessTime is still zero or smaller than + // the m_lastDecodedAccessTime of the current list head. This is a + // violation of the invariant that the list is to be kept sorted + // by access time. The weakening of the invariant does not pose + // a problem. For more details please see: https://bugs.webkit.org/show_bug.cgi?id=30209 if (m_decodedSize && !m_inLiveDecodedResourcesList && hasClients()) cache()->insertInLiveDecodedResourcesList(this); else if (!m_decodedSize && m_inLiveDecodedResourcesList) diff --git a/src/3rdparty/webkit/WebCore/loader/FrameLoader.cpp b/src/3rdparty/webkit/WebCore/loader/FrameLoader.cpp index df46397..9b15448 100644 --- a/src/3rdparty/webkit/WebCore/loader/FrameLoader.cpp +++ b/src/3rdparty/webkit/WebCore/loader/FrameLoader.cpp @@ -2,6 +2,8 @@ * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/) + * Copyright (C) 2008 Alp Toker <alp@atoker.com> + * Copyright (C) Research In Motion Limited 2009. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -75,6 +77,7 @@ #include "PageTransitionEvent.h" #include "PlaceholderDocument.h" #include "PluginData.h" +#include "PluginDatabase.h" #include "PluginDocument.h" #include "ProgressTracker.h" #include "RenderPart.h" @@ -113,10 +116,6 @@ #include "SVGViewSpec.h" #endif -#if PLATFORM(MAC) || PLATFORM(WIN) -#define PAGE_CACHE_ACCEPTS_UNLOAD_HANDLERS -#endif - namespace WebCore { #if ENABLE(SVG) @@ -337,10 +336,9 @@ void FrameLoader::urlSelected(const ResourceRequest& request, const String& pass FrameLoadRequest frameRequest(request, target); - if (referrerPolicy == NoReferrer) { + if (referrerPolicy == NoReferrer) m_suppressOpenerInNewFrame = true; - setOpener(0); - } else if (frameRequest.resourceRequest().httpReferrer().isEmpty()) + else if (frameRequest.resourceRequest().httpReferrer().isEmpty()) frameRequest.resourceRequest().setHTTPReferrer(m_outgoingReferrer); addHTTPOriginIfNeeded(frameRequest.resourceRequest(), outgoingOrigin()); @@ -757,6 +755,8 @@ void FrameLoader::receivedFirstData() String url; if (!m_documentLoader) return; + if (m_frame->inViewSourceMode()) + return; if (!parseHTTPRefresh(m_documentLoader->response().httpHeaderField("Refresh"), false, delay, url)) return; @@ -1288,6 +1288,30 @@ bool FrameLoader::shouldUsePlugin(const KURL& url, const String& mimeType, bool return objectType == ObjectContentNone || objectType == ObjectContentNetscapePlugin || objectType == ObjectContentOtherPlugin; } +ObjectContentType FrameLoader::defaultObjectContentType(const KURL& url, const String& mimeTypeIn) +{ + String mimeType = mimeTypeIn; + // We don't use MIMETypeRegistry::getMIMETypeForPath() because it returns "application/octet-stream" upon failure + if (mimeType.isEmpty()) + mimeType = MIMETypeRegistry::getMIMETypeForExtension(url.path().substring(url.path().reverseFind('.') + 1)); + + if (mimeType.isEmpty()) + return ObjectContentFrame; // Go ahead and hope that we can display the content. + + if (MIMETypeRegistry::isSupportedImageMIMEType(mimeType)) + return WebCore::ObjectContentImage; + +#if !PLATFORM(MAC) && !PLATFORM(CHROMIUM) // Mac has no PluginDatabase, nor does Chromium + if (PluginDatabase::installedPlugins()->isMIMETypeRegistered(mimeType)) + return WebCore::ObjectContentNetscapePlugin; +#endif + + if (MIMETypeRegistry::isSupportedNonImageMIMEType(mimeType)) + return WebCore::ObjectContentFrame; + + return WebCore::ObjectContentNone; +} + static HTMLPlugInElement* toPlugInElement(Node* node) { if (!node) @@ -1467,9 +1491,7 @@ bool FrameLoader::canCachePageContainingThisFrame() // the right NPObjects. See <rdar://problem/5197041> for more information. && !m_containsPlugIns && !m_URL.protocolIs("https") -#ifndef PAGE_CACHE_ACCEPTS_UNLOAD_HANDLERS && (!m_frame->domWindow() || !m_frame->domWindow()->hasEventListeners(eventNames().unloadEvent)) -#endif #if ENABLE(DATABASE) && !m_frame->document()->hasOpenDatabases() #endif @@ -1614,10 +1636,8 @@ bool FrameLoader::logCanCacheFrameDecision(int indentLevel) { PCLOG(" -Frame contains plugins"); cannotCache = true; } if (m_URL.protocolIs("https")) { PCLOG(" -Frame is HTTPS"); cannotCache = true; } -#ifndef PAGE_CACHE_ACCEPTS_UNLOAD_HANDLERS if (m_frame->domWindow() && m_frame->domWindow()->hasEventListeners(eventNames().unloadEvent)) { PCLOG(" -Frame has an unload event listener"); cannotCache = true; } -#endif #if ENABLE(DATABASE) if (m_frame->document()->hasOpenDatabases()) { PCLOG(" -Frame has open database handles"); cannotCache = true; } @@ -1728,10 +1748,13 @@ bool FrameLoader::isComplete() const void FrameLoader::completed() { RefPtr<Frame> protect(m_frame); - for (Frame* child = m_frame->tree()->firstChild(); child; child = child->tree()->nextSibling()) - child->redirectScheduler()->startTimer(); + + for (Frame* descendant = m_frame->tree()->traverseNext(m_frame); descendant; descendant = descendant->tree()->traverseNext(m_frame)) + descendant->redirectScheduler()->startTimer(); + if (Frame* parent = m_frame->tree()->parent()) parent->loader()->checkCompleted(); + if (m_frame->view()) m_frame->view()->maintainScrollPositionAtAnchor(0); } @@ -3845,7 +3868,8 @@ void FrameLoader::dispatchDocumentElementAvailable() void FrameLoader::dispatchWindowObjectAvailable() { - if (!m_frame->script()->isEnabled() || !m_frame->script()->haveWindowShell()) + // FIXME: should this be isolated-worlds-aware? + if (!m_frame->script()->isEnabled() || !m_frame->script()->existingWindowShell(mainThreadNormalWorld())) return; m_client->windowObjectCleared(); diff --git a/src/3rdparty/webkit/WebCore/loader/FrameLoader.h b/src/3rdparty/webkit/WebCore/loader/FrameLoader.h index bf0eebc..3bf6196 100644 --- a/src/3rdparty/webkit/WebCore/loader/FrameLoader.h +++ b/src/3rdparty/webkit/WebCore/loader/FrameLoader.h @@ -1,6 +1,7 @@ /* * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/) + * Copyright (C) Research In Motion Limited 2009. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -322,6 +323,10 @@ public: // uses the policy machinery (and therefore is called via the PolicyChecker). Once we // introduce a proper callback type for this function, we should make it private again. void continueLoadAfterWillSubmitForm(); + + bool suppressOpenerInNewFrame() const { return m_suppressOpenerInNewFrame; } + + static ObjectContentType defaultObjectContentType(const KURL& url, const String& mimeType); private: bool canCachePageContainingThisFrame(); diff --git a/src/3rdparty/webkit/WebCore/loader/RedirectScheduler.cpp b/src/3rdparty/webkit/WebCore/loader/RedirectScheduler.cpp index f015c12..c0d78ae 100644 --- a/src/3rdparty/webkit/WebCore/loader/RedirectScheduler.cpp +++ b/src/3rdparty/webkit/WebCore/loader/RedirectScheduler.cpp @@ -255,12 +255,20 @@ void RedirectScheduler::scheduleHistoryNavigation(int steps) if (!m_frame->page()) return; + // Invalid history navigations (such as history.forward() during a new load) have the side effect of cancelling any scheduled + // redirects. We also avoid the possibility of cancelling the current load by avoiding the scheduled redirection altogether. + if (!m_frame->page()->canGoBackOrForward(steps)) { + cancel(); + return; + } + schedule(new ScheduledRedirection(steps)); } void RedirectScheduler::timerFired(Timer<RedirectScheduler>*) { - ASSERT(m_frame->page()); + if (!m_frame->page()) + return; if (m_frame->page()->defersLoading()) return; @@ -282,8 +290,7 @@ void RedirectScheduler::timerFired(Timer<RedirectScheduler>*) } // go(i!=0) from a frame navigates into the history of the frame only, // in both IE and NS (but not in Mozilla). We can't easily do that. - if (m_frame->page()->canGoBackOrForward(redirection->historySteps)) - m_frame->page()->goBackOrForward(redirection->historySteps); + m_frame->page()->goBackOrForward(redirection->historySteps); return; case ScheduledRedirection::formSubmission: // The submitForm function will find a target frame before using the redirection timer. diff --git a/src/3rdparty/webkit/WebCore/loader/ResourceLoadNotifier.h b/src/3rdparty/webkit/WebCore/loader/ResourceLoadNotifier.h index f06ecde..b09d7be 100644 --- a/src/3rdparty/webkit/WebCore/loader/ResourceLoadNotifier.h +++ b/src/3rdparty/webkit/WebCore/loader/ResourceLoadNotifier.h @@ -40,13 +40,8 @@ class Frame; class ResourceError; class ResourceLoader; class ResourceResponse; -//### tempfix, to be removed -#ifdef __SYMBIAN32__ -struct ResourceRequest; -#else -class ResourceRequest; -#endif class ScriptString; +struct ResourceRequest; class ResourceLoadNotifier : public Noncopyable { public: diff --git a/src/3rdparty/webkit/WebCore/loader/icon/IconDatabase.cpp b/src/3rdparty/webkit/WebCore/loader/icon/IconDatabase.cpp index 78ca0a5..4be3684 100644 --- a/src/3rdparty/webkit/WebCore/loader/icon/IconDatabase.cpp +++ b/src/3rdparty/webkit/WebCore/loader/icon/IconDatabase.cpp @@ -36,10 +36,10 @@ #include "IconRecord.h" #include "IntSize.h" #include "Logging.h" +#include "ScriptController.h" #include "SQLiteStatement.h" #include "SQLiteTransaction.h" #include "SuddenTermination.h" -#include <runtime/InitializeThreading.h> #include <wtf/CurrentTime.h> #include <wtf/MainThread.h> #include <wtf/StdLibExtras.h> @@ -93,7 +93,7 @@ static IconDatabaseClient* defaultClient() IconDatabase* iconDatabase() { if (!sharedIconDatabase) { - JSC::initializeThreading(); + ScriptController::initializeThreading(); sharedIconDatabase = new IconDatabase; } return sharedIconDatabase; |