summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/webkit/WebCore/loader
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/webkit/WebCore/loader')
-rw-r--r--src/3rdparty/webkit/WebCore/loader/Cache.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/loader/CachedResource.cpp6
-rw-r--r--src/3rdparty/webkit/WebCore/loader/FrameLoader.cpp52
-rw-r--r--src/3rdparty/webkit/WebCore/loader/FrameLoader.h5
-rw-r--r--src/3rdparty/webkit/WebCore/loader/RedirectScheduler.cpp13
-rw-r--r--src/3rdparty/webkit/WebCore/loader/ResourceLoadNotifier.h7
-rw-r--r--src/3rdparty/webkit/WebCore/loader/icon/IconDatabase.cpp4
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;