WebCore:
authordarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 3 Jan 2009 02:04:30 +0000 (02:04 +0000)
committerdarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 3 Jan 2009 02:04:30 +0000 (02:04 +0000)
2009-01-02  Darin Adler  <darin@apple.com>

        Reviewed by Sam Weinig.

        Bug 23072: REGRESSION (r37371): In the Dictionary application, scroll bar appears
        inside its web view when resizing its window
        https://bugs.webkit.org/show_bug.cgi?id=23072
        rdar://problem/6368028

        The first attempt at fixing this did not work.
        This time I was able to reproduce the bug and test the fix.

        Bug 11212: REGRESSION: Activity window doesn't always list all files until refresh
        https://bugs.webkit.org/show_bug.cgi?id=11212
        rdar://problem/4959702

        I had to fix this second bug because otherwise the WebKit code to trigger the first
        fix didn't run.

        Also fixes memory use that kept growing as we maintained a set of all URLs loaded in
        a particular frame. Bad idea! It's bad enough that we do it for each document, but
        the old version kept the set around forever as you moved from one document to the next.

        * html/HTMLFrameElementBase.cpp:
        (WebCore::HTMLFrameElementBase::parseMappedAttribute): Change this so that we allow
        turning off scrolling when the quirk is enabled. We just don't allow turning it on.
        This fixes one of the two problems with the initial patch; the other fix is in WebKit.

        * loader/DocumentLoader.h: Moved didTellClientAboutLoad and haveToldClientAboutLoad
        here from FrameLoader. The old way meant that a given frame would forever remember
        the URL of any resources loaded in that frame and never send any "loaded from cache"
        client calls about those URLs.

        * loader/FrameLoader.cpp:
        (WebCore::FrameLoader::loadResourceSynchronously): Removed call to didTellCientAboutLoad.
        This is now handled by dispatchWillSendRequest, which is safer since that's the actual
        function that tells the client about the load.
        (WebCore::FrameLoader::loadedResourceFromMemoryCache): Changed calls to
        haveToldClientAboutLoad and didTellClientAboutLoad to call the document loader.
        Also removed the call in the case where we don't load from the cache, since
        dispatchWillSendRequest now takes care of it.
        (WebCore::FrameLoader::dispatchWillSendRequest): Put calls to didTellClientAboutLoad
        here. Call it both on the URL we pass in and the URL the client returns; we won't
        tell the client about either if it's loaded from the memory cache.

        * loader/FrameLoader.h: Removed didTellClientAboutLoad, haveToldClientAboutLoad, and
        m_urlsClientKnowsAbout.

        * loader/SubresourceLoader.cpp: Removed unneeded load function that called
        didTellClientAboutLoad. That's now taken care of in dispatchWillSendRequest.

        * loader/SubresourceLoader.h: Removed load function. Also made all members private
        except for create and clearClient.

WebKit/mac:

2009-01-02  Darin Adler  <darin@apple.com>

        Reviewed by Sam Weinig.

        Bug 23072: REGRESSION (r37371): In the Dictionary application, scroll bar appears
        inside its web view when resizing its window
        https://bugs.webkit.org/show_bug.cgi?id=23072
        rdar://problem/6368028

        The first attempt at fixing this did not work.
        This time I was able to reproduce the bug and test the fix.

        * WebCoreSupport/WebFrameLoaderClient.mm:
        (applyAppleDictionaryApplicationQuirkNonInlinePart): Changed the arguments and
        function names around a bit to make even less code at the call site.
        (applyAppleDictionaryApplicationQuirk): Put the check for whether this is the
        Dictionary application in here.
        (WebFrameLoaderClient::dispatchDidLoadResourceFromMemoryCache): Put a call to
        applyAppleDictionaryApplicationQuirk here. This was a case I had missed before,
        when the script is cached. This fixes one of the two problems with the initial
        patch; the other fix is in WebCore.
        (WebFrameLoaderClient::dispatchWillSendRequest): Changed the
        applyAppleDictionaryApplicationQuirk call here to work the new simpler way.

        * WebView/WebView.mm: Had to add an include due to changes in WebCore header includes.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@39566 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/html/HTMLFrameElementBase.cpp
WebCore/loader/DocumentLoader.h
WebCore/loader/FrameLoader.cpp
WebCore/loader/FrameLoader.h
WebCore/loader/SubresourceLoader.cpp
WebCore/loader/SubresourceLoader.h
WebKit/mac/ChangeLog
WebKit/mac/WebCoreSupport/WebFrameLoaderClient.mm
WebKit/mac/WebView/WebView.mm

index 21e8102..8e716b4 100644 (file)
@@ -1,3 +1,57 @@
+2009-01-02  Darin Adler  <darin@apple.com>
+
+        Reviewed by Sam Weinig.
+
+        Bug 23072: REGRESSION (r37371): In the Dictionary application, scroll bar appears
+        inside its web view when resizing its window
+        https://bugs.webkit.org/show_bug.cgi?id=23072
+        rdar://problem/6368028
+
+        The first attempt at fixing this did not work.
+        This time I was able to reproduce the bug and test the fix.
+
+        Bug 11212: REGRESSION: Activity window doesn't always list all files until refresh
+        https://bugs.webkit.org/show_bug.cgi?id=11212
+        rdar://problem/4959702
+
+        I had to fix this second bug because otherwise the WebKit code to trigger the first
+        fix didn't run.
+
+        Also fixes memory use that kept growing as we maintained a set of all URLs loaded in
+        a particular frame. Bad idea! It's bad enough that we do it for each document, but
+        the old version kept the set around forever as you moved from one document to the next.
+
+        * html/HTMLFrameElementBase.cpp:
+        (WebCore::HTMLFrameElementBase::parseMappedAttribute): Change this so that we allow
+        turning off scrolling when the quirk is enabled. We just don't allow turning it on.
+        This fixes one of the two problems with the initial patch; the other fix is in WebKit.
+
+        * loader/DocumentLoader.h: Moved didTellClientAboutLoad and haveToldClientAboutLoad
+        here from FrameLoader. The old way meant that a given frame would forever remember
+        the URL of any resources loaded in that frame and never send any "loaded from cache"
+        client calls about those URLs.
+
+        * loader/FrameLoader.cpp:
+        (WebCore::FrameLoader::loadResourceSynchronously): Removed call to didTellCientAboutLoad.
+        This is now handled by dispatchWillSendRequest, which is safer since that's the actual
+        function that tells the client about the load.
+        (WebCore::FrameLoader::loadedResourceFromMemoryCache): Changed calls to
+        haveToldClientAboutLoad and didTellClientAboutLoad to call the document loader.
+        Also removed the call in the case where we don't load from the cache, since
+        dispatchWillSendRequest now takes care of it.
+        (WebCore::FrameLoader::dispatchWillSendRequest): Put calls to didTellClientAboutLoad
+        here. Call it both on the URL we pass in and the URL the client returns; we won't
+        tell the client about either if it's loaded from the memory cache.
+
+        * loader/FrameLoader.h: Removed didTellClientAboutLoad, haveToldClientAboutLoad, and
+        m_urlsClientKnowsAbout.
+
+        * loader/SubresourceLoader.cpp: Removed unneeded load function that called
+        didTellClientAboutLoad. That's now taken care of in dispatchWillSendRequest.
+
+        * loader/SubresourceLoader.h: Removed load function. Also made all members private
+        except for create and clearClient.
+
 2009-01-02  Simon Fraser  <simon.fraser@apple.com>
 
         Reviewed by Darin Adler
index b7ed934..a692d08 100644 (file)
@@ -3,7 +3,7 @@
  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
  *           (C) 2000 Simon Hausmann (hausmann@kde.org)
  *           (C) 2001 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2004, 2006, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2004, 2006, 2008, 2009 Apple Inc. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -129,11 +129,9 @@ void HTMLFrameElementBase::parseMappedAttribute(MappedAttribute *attr)
         m_noResize = true;
         // FIXME: If we are already attached, this has no effect.
     } else if (attr->name() == scrollingAttr) {
-        if (document()->frameElementsShouldIgnoreScrolling())
-            return;
         // Auto and yes both simply mean "allow scrolling." No means "don't allow scrolling."
         if (equalIgnoringCase(attr->value(), "auto") || equalIgnoringCase(attr->value(), "yes"))
-            m_scrolling = ScrollbarAuto;
+            m_scrolling = document()->frameElementsShouldIgnoreScrolling() ? ScrollbarAlwaysOff : ScrollbarAuto;
         else if (equalIgnoringCase(attr->value(), "no"))
             m_scrolling = ScrollbarAlwaysOff;
         // FIXME: If we are already attached, this has no effect.
index 071b501..2b80295 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
 #ifndef DocumentLoader_h
 #define DocumentLoader_h
 
-#include "IconDatabase.h"
 #include "NavigationAction.h"
-#include <wtf/RefCounted.h>
-#include "PlatformString.h"
 #include "ResourceError.h"
 #include "ResourceRequest.h"
 #include "ResourceResponse.h"
 #include "SubstituteData.h"
-#include <wtf/HashSet.h>
-#include <wtf/RefPtr.h>
-#include <wtf/Vector.h>
+#include "Timer.h"
 
 namespace WebCore {
 
-#if ENABLE(OFFLINE_WEB_APPLICATIONS)
     class ApplicationCache;
     class ApplicationCacheGroup;
     class ApplicationCacheResource;
-#endif
     class Archive;
     class ArchiveResource;
     class ArchiveResourceCollection;
     class CachedPage;
     class Frame;
     class FrameLoader;
-    class HistoryItem;
-    class KURL;
     class MainResourceLoader;
     class ResourceLoader;
     class SchedulePair;
     class SharedBuffer;
-    class SubstituteData;
     class SubstituteResource;
 
     typedef HashSet<RefPtr<ResourceLoader> > ResourceLoaderSet;
@@ -196,6 +186,9 @@ namespace WebCore {
         void setDeferMainResourceDataLoad(bool defer) { m_deferMainResourceDataLoad = defer; }
         bool deferMainResourceDataLoad() const { return m_deferMainResourceDataLoad; }
         
+        void didTellClientAboutLoad(const String& url) { m_resourcesClientKnowsAbout.add(url); }
+        bool haveToldClientAboutLoad(const String& url) { return m_resourcesClientKnowsAbout.contains(url); }
+
 #if ENABLE(OFFLINE_WEB_APPLICATIONS)
         bool scheduleApplicationCacheLoad(ResourceLoader*, const ResourceRequest&, const KURL& originalURL);
         bool scheduleLoadFallbackResourceFromApplicationCache(ResourceLoader*, const ResourceRequest&, ApplicationCache* = 0);
@@ -289,7 +282,9 @@ namespace WebCore {
                 
         OwnPtr<ArchiveResourceCollection> m_archiveResourceCollection;
         RefPtr<SharedBuffer> m_parsedArchiveData;
-        
+
+        HashSet<String> m_resourcesClientKnowsAbout;
+
 #if ENABLE(OFFLINE_WEB_APPLICATIONS)  
         // The application cache that the document loader is associated with (if any).
         RefPtr<ApplicationCache> m_applicationCache;
index 89e8454..54f7acb 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
  * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
  * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
  *
@@ -804,10 +804,6 @@ void FrameLoader::cancelAndClear()
 
 void FrameLoader::clear(bool clearWindowProperties, bool clearScriptObjects)
 {
-    // FIXME: Commenting out the below line causes <http://bugs.webkit.org/show_bug.cgi?id=11212>, but putting it
-    // back causes a measurable performance regression which we will need to fix to restore the correct behavior
-    // urlsBridgeKnowsAbout.clear();
-
     m_frame->editor()->clear();
 
     if (!m_needsClear)
@@ -3385,16 +3381,6 @@ void FrameLoader::tokenizerProcessedData()
     checkCompleted();
 }
 
-void FrameLoader::didTellClientAboutLoad(const String& url)
-{
-    m_urlsClientKnowsAbout.add(url);
-}
-
-bool FrameLoader::haveToldClientAboutLoad(const String& url)
-{
-    return m_urlsClientKnowsAbout.contains(url);
-}
-
 void FrameLoader::handledOnloadEvents()
 {
     m_client->dispatchDidHandleOnloadEvents();
@@ -3585,7 +3571,6 @@ unsigned long FrameLoader::loadResourceSynchronously(const ResourceRequest& requ
 
     if (error.isNull()) {
         ASSERT(!newRequest.isNull());
-        didTellClientAboutLoad(newRequest.url().string());
         
 #if ENABLE(OFFLINE_WEB_APPLICATIONS)
         ApplicationCacheResource* resource;
@@ -4037,11 +4022,11 @@ void FrameLoader::loadedResourceFromMemoryCache(const CachedResource* resource)
     if (Page* page = m_frame->page())
         page->inspectorController()->didLoadResourceFromMemoryCache(m_documentLoader.get(), request, response, length);
 
-    if (!resource->sendResourceLoadCallbacks() || haveToldClientAboutLoad(resource->url()))
+    if (!resource->sendResourceLoadCallbacks() || m_documentLoader->haveToldClientAboutLoad(request.url()))
         return;
 
     if (m_client->dispatchDidLoadResourceFromMemoryCache(m_documentLoader.get(), request, response, length)) {
-        didTellClientAboutLoad(resource->url());
+        m_documentLoader->didTellClientAboutLoad(request.url());
         return;
     }
 
@@ -4050,8 +4035,6 @@ void FrameLoader::loadedResourceFromMemoryCache(const CachedResource* resource)
     ResourceRequest r(request);
     requestFromDelegate(r, identifier, error);
     sendRemainingDelegateMessages(identifier, response, length, error);
-
-    didTellClientAboutLoad(resource->url());
 }
 
 void FrameLoader::applyUserAgent(ResourceRequest& request)
@@ -5125,7 +5108,9 @@ void FrameLoader::dispatchAssignIdentifierToInitialRequest(unsigned long identif
 
 void FrameLoader::dispatchWillSendRequest(DocumentLoader* loader, unsigned long identifier, ResourceRequest& request, const ResourceResponse& redirectResponse)
 {
+    m_documentLoader->didTellClientAboutLoad(request.url());
     m_client->dispatchWillSendRequest(loader, identifier, request, redirectResponse);
+    m_documentLoader->didTellClientAboutLoad(request.url());
 
     if (Page* page = m_frame->page())
         page->inspectorController()->willSendRequest(loader, identifier, request, redirectResponse);
index 3fb40f2..efc538c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
  * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
  *
  * Redistribution and use in source and binary forms, with or without
 #ifndef FrameLoader_h
 #define FrameLoader_h
 
-#include "CachedResource.h"
 #include "CachePolicy.h"
-#include "FormState.h"
 #include "FrameLoaderTypes.h"
-#include "KURL.h"
-#include "StringHash.h"
-#include "Timer.h"
-#include <wtf/Forward.h>
-#include <wtf/HashSet.h>
-#include <wtf/HashMap.h>
-#include <wtf/Noncopyable.h>
-#include <wtf/OwnPtr.h>
-#include <wtf/RefPtr.h>
 #include "ResourceRequest.h"
+#include "Timer.h"
+
 #if USE(LOW_BANDWIDTH_DISPLAY)
 #include "CachedResourceClient.h"
 #endif
 namespace WebCore {
 
     class Archive;
-    class ArchiveResource;
     class AuthenticationChallenge;
     class CachedPage;
+    class CachedResource;
     class Document;
     class DocumentLoader;
     class Element;
     class Event;
     class FormData;
+    class FormState;
     class Frame;
     class FrameLoaderClient;
     class HistoryItem;
@@ -67,12 +59,9 @@ namespace WebCore {
     class IconLoader;
     class IntSize;
     class NavigationAction;
-    class Node;
-    class Page;
     class RenderPart;
     class ResourceError;
     class ResourceLoader;
-    class ResourceRequest;
     class ResourceResponse;
     class ScriptSourceCode;
     class ScriptValue;
@@ -126,7 +115,7 @@ namespace WebCore {
 
     class FrameLoader : Noncopyable
 #if USE(LOW_BANDWIDTH_DISPLAY)
-    , private CachedResourceClient
+        , private CachedResourceClient
 #endif
     {
     public:
@@ -404,9 +393,6 @@ namespace WebCore {
 
         KURL completeURL(const String& url);
 
-        void didTellClientAboutLoad(const String& url);
-        bool haveToldClientAboutLoad(const String& url);
-
         KURL originalRequestURL() const;
 
         void cancelAndClear();
@@ -618,8 +604,6 @@ namespace WebCore {
 
         String m_outgoingReferrer;
 
-        HashSet<String> m_urlsClientKnowsAbout;
-
         OwnPtr<FormSubmission> m_deferredFormSubmission;
 
         bool m_isExecutingJavaScriptFormAction;
index 7fa8c0f..4a339ef 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2006, 2007, 2009 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
 #include "config.h"
 #include "SubresourceLoader.h"
 
-#include "Document.h"
 #include "DocumentLoader.h"
 #include "Frame.h"
 #include "FrameLoader.h"
-#include "Logging.h"
 #include "ResourceHandle.h"
-#include "ResourceRequest.h"
 #include "SubresourceLoaderClient.h"
-#include "SharedBuffer.h"
 #include <wtf/RefCountedLeakCounter.h>
 
 namespace WebCore {
@@ -64,13 +60,6 @@ SubresourceLoader::~SubresourceLoader()
 #endif
 }
 
-bool SubresourceLoader::load(const ResourceRequest& r)
-{
-    m_frame->loader()->didTellClientAboutLoad(r.url().string());
-    
-    return ResourceLoader::load(r);
-}
-
 PassRefPtr<SubresourceLoader> SubresourceLoader::create(Frame* frame, SubresourceLoaderClient* client, const ResourceRequest& request, bool skipCanLoadCheck, bool sendResourceLoadCallbacks, bool shouldContentSniff)
 {
     if (!frame)
index bfb16aa..1a94c73 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2005, 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2005, 2006, 2009 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
 #define SubresourceLoader_h
  
 #include "ResourceLoader.h"
-#include <wtf/PassRefPtr.h>
  
 namespace WebCore {
 
-    class FormData;
-    class String;
-    class ResourceHandle;
     class ResourceRequest;
     class SubresourceLoaderClient;
     
     class SubresourceLoader : public ResourceLoader {
     public:
         static PassRefPtr<SubresourceLoader> create(Frame*, SubresourceLoaderClient*, const ResourceRequest&, bool skipCanLoadCheck = false, bool sendResourceLoadCallbacks = true, bool shouldContentSniff = true);
-        
-        virtual ~SubresourceLoader();
 
-        virtual bool load(const ResourceRequest&);
+        void clearClient() { m_client = 0; }
+
+    private:
+        SubresourceLoader(Frame*, SubresourceLoaderClient*, bool sendResourceLoadCallbacks, bool shouldContentSniff);
+        virtual ~SubresourceLoader();
         
         virtual void willSendRequest(ResourceRequest&, const ResourceResponse& redirectResponse);
         virtual void didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent);
@@ -56,14 +54,9 @@ namespace WebCore {
         virtual void didFail(const ResourceError&);
         virtual bool shouldUseCredentialStorage();
         virtual void didReceiveAuthenticationChallenge(const AuthenticationChallenge&);
-        virtual void receivedCancellation(const AuthenticationChallenge&);
-        
-        void clearClient() { m_client = 0; }
-
-    private:
-        SubresourceLoader(Frame*, SubresourceLoaderClient*, bool sendResourceLoadCallbacks, bool shouldContentSniff);
-
+        virtual void receivedCancellation(const AuthenticationChallenge&);        
         virtual void didCancel(const ResourceError&);
+
         SubresourceLoaderClient* m_client;
         bool m_loadingMultipartContent;
     };
index ba4911f..ebca267 100644 (file)
@@ -1,3 +1,29 @@
+2009-01-02  Darin Adler  <darin@apple.com>
+
+        Reviewed by Sam Weinig.
+
+        Bug 23072: REGRESSION (r37371): In the Dictionary application, scroll bar appears
+        inside its web view when resizing its window
+        https://bugs.webkit.org/show_bug.cgi?id=23072
+        rdar://problem/6368028
+
+        The first attempt at fixing this did not work.
+        This time I was able to reproduce the bug and test the fix.
+
+        * WebCoreSupport/WebFrameLoaderClient.mm:
+        (applyAppleDictionaryApplicationQuirkNonInlinePart): Changed the arguments and
+        function names around a bit to make even less code at the call site.
+        (applyAppleDictionaryApplicationQuirk): Put the check for whether this is the
+        Dictionary application in here.
+        (WebFrameLoaderClient::dispatchDidLoadResourceFromMemoryCache): Put a call to
+        applyAppleDictionaryApplicationQuirk here. This was a case I had missed before,
+        when the script is cached. This fixes one of the two problems with the initial
+        patch; the other fix is in WebCore.
+        (WebFrameLoaderClient::dispatchWillSendRequest): Changed the
+        applyAppleDictionaryApplicationQuirk call here to work the new simpler way.
+
+        * WebView/WebView.mm: Had to add an include due to changes in WebCore header includes.
+
 2009-01-02  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
 
         Reviewed by Darin Adler.
index 50cab05..e6582e8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -156,18 +156,13 @@ static inline WebDataSource *dataSource(DocumentLoader* loader)
 // attribute needs to be ignored to avoid showing extra scroll bars in the window.
 // This quirk can be removed when Apple Dictionary is fixed (see <rdar://problem/6471058>).
 
-static bool isAppleDictionaryApplication()
-{
-    return [[[NSBundle mainBundle] bundleIdentifier] isEqualToString:@"com.apple.Dictionary"];
-}
-
-static void applyAppleDictionaryApplicationQuirk(WebFrame *webFrame, const ResourceRequest& request)
+static void applyAppleDictionaryApplicationQuirkNonInlinePart(WebFrameLoaderClient* client, const ResourceRequest& request)
 {
     if (!request.url().isLocalFile())
         return;
     if (!request.url().string().endsWith("MainPageJavaScript.js"))
         return;
-    Frame* frame = core(webFrame);
+    Frame* frame = core(client->webFrame());
     if (!frame)
         return;
     if (frame->tree()->parent())
@@ -186,6 +181,15 @@ static void applyAppleDictionaryApplicationQuirk(WebFrame *webFrame, const Resou
     }
 }
 
+static inline void applyAppleDictionaryApplicationQuirk(WebFrameLoaderClient* client, const ResourceRequest& request)
+{
+    // Use a one-time-initialized global variable so we can quickly determine there's nothing to do in
+    // all applications other than Apple Dictionary.
+    static bool isAppleDictionary = [[[NSBundle mainBundle] bundleIdentifier] isEqualToString:@"com.apple.Dictionary"];
+    if (isAppleDictionary)
+        applyAppleDictionaryApplicationQuirkNonInlinePart(client, request);
+}
+
 WebFrameLoaderClient::WebFrameLoaderClient(WebFrame *webFrame)
     : m_webFrame(webFrame)
     , m_policyFunction(0)
@@ -318,6 +322,8 @@ void WebFrameLoaderClient::setOriginalURLForDownload(WebDownload *download, cons
 
 bool WebFrameLoaderClient::dispatchDidLoadResourceFromMemoryCache(DocumentLoader* loader, const ResourceRequest& request, const ResourceResponse& response, int length)
 {
+    applyAppleDictionaryApplicationQuirk(this, request);
+
     WebView *webView = getWebView(m_webFrame.get());
     WebResourceDelegateImplementationCache* implementations = WebViewGetResourceLoadDelegateImplementations(webView);
     if (!implementations->didLoadResourceFromMemoryCacheFunc)
@@ -349,9 +355,7 @@ void WebFrameLoaderClient::assignIdentifierToInitialRequest(unsigned long identi
 
 void WebFrameLoaderClient::dispatchWillSendRequest(DocumentLoader* loader, unsigned long identifier, ResourceRequest& request, const ResourceResponse& redirectResponse)
 {
-    static bool isDictionary = isAppleDictionaryApplication();
-    if (isDictionary)
-        applyAppleDictionaryApplicationQuirk(m_webFrame.get(), request);
+    applyAppleDictionaryApplicationQuirk(this, request);
 
     WebView *webView = getWebView(m_webFrame.get());
     WebResourceDelegateImplementationCache* implementations = WebViewGetResourceLoadDelegateImplementations(webView);
index 011aee7..c4cf7e0 100644 (file)
 #import <WebCore/GCController.h>
 #import <WebCore/HTMLNames.h>
 #import <WebCore/HistoryItem.h>
+#import <WebCore/IconDatabase.h>
 #import <WebCore/Logging.h>
 #import <WebCore/MIMETypeRegistry.h>
 #import <WebCore/Page.h>