WebCore:
authorbeidson <beidson@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 19 Sep 2006 02:21:52 +0000 (02:21 +0000)
committerbeidson <beidson@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 19 Sep 2006 02:21:52 +0000 (02:21 +0000)
        Reviewed by Anders

        <rdar://problem/3028061> - WebKit never updates favicon
        The WebKit enforced expiration date for icons has worked for some time, but the
        move to the new Icon Loader broke the "always get the icon if the user refreshes the page"
        functionality.  This patch fixes that up, along with some other architectural improvements,
        the main one being that WebCore::Document now contains an iconURL for the Frame to query if needed.

        * bridge/mac/FrameMac.h: Added isLoadTypeReload()
        * bridge/mac/FrameMac.mm:
        (WebCore::FrameMac::isLoadTypeReload): Implementation, calls into the bridge
        * bridge/mac/WebCoreFrameBridge.h: Added isLoadTypeReload:
        * bridge/win/FrameWin.h: Added isLoadTypeReload() for temporary link stub
        * dom/Document.h: Added m_iconURL
        (WebCore::Document::iconURL): Added
        (WebCore::Document::setIconURL): Ditto
        * html/HTMLLinkElement.cpp:
        (WebCore::HTMLLinkElement::process): Sets the iconURL in the Document instead of the Frame
        * page/Frame.cpp:
        (WebCore::Frame::iconURL): Calculates the iconURL based on the document, then the default favicon.ico url
        (WebCore::Frame::endIfNotLoading): Checks for the load type - always loads icon on Reload
        * page/Frame.h: Nuked setIconURL(), added isLoadTypeReload()
        * page/FramePrivate.h: Nuked IconURL
        * platform/win/TemporaryLinkStubs.cpp:
        (FrameWin::isLoadTypeReload):

WebKit:

        Reviewed by Anders

        Implement a bridge method so WebCore can find the reload type of a frame load

        * WebCoreSupport/WebFrameBridge.m:
        (-[WebFrameBridge isLoadTypeReload]):

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

16 files changed:
WebCore/ChangeLog
WebCore/bridge/mac/FrameMac.h
WebCore/bridge/mac/FrameMac.mm
WebCore/bridge/mac/WebCoreFrameBridge.h
WebCore/bridge/win/FrameWin.h
WebCore/dom/Document.cpp
WebCore/dom/Document.h
WebCore/html/HTMLDocument.cpp
WebCore/html/HTMLDocument.h
WebCore/html/HTMLLinkElement.cpp
WebCore/page/Frame.cpp
WebCore/page/Frame.h
WebCore/page/FramePrivate.h
WebCore/platform/win/TemporaryLinkStubs.cpp
WebKit/ChangeLog
WebKit/WebCoreSupport/WebFrameBridge.m

index 7834adb99430a1f8c04262f8363244c78baf79e6..978f85a9e2de2fb5988044249c5bae2f56022686 100644 (file)
@@ -1,3 +1,31 @@
+2006-09-18  Brady Eidson  <beidson@apple.com>
+
+        Reviewed by Anders
+
+        <rdar://problem/3028061> - WebKit never updates favicon
+        The WebKit enforced expiration date for icons has worked for some time, but the
+        move to the new Icon Loader broke the "always get the icon if the user refreshes the page" 
+        functionality.  This patch fixes that up, along with some other architectural improvements,
+        the main one being that WebCore::Document now contains an iconURL for the Frame to query if needed.
+
+        * bridge/mac/FrameMac.h: Added isLoadTypeReload()
+        * bridge/mac/FrameMac.mm:
+        (WebCore::FrameMac::isLoadTypeReload): Implementation, calls into the bridge
+        * bridge/mac/WebCoreFrameBridge.h: Added isLoadTypeReload:
+        * bridge/win/FrameWin.h: Added isLoadTypeReload() for temporary link stub
+        * dom/Document.h: Added m_iconURL
+        (WebCore::Document::iconURL): Added
+        (WebCore::Document::setIconURL): Ditto
+        * html/HTMLLinkElement.cpp:
+        (WebCore::HTMLLinkElement::process): Sets the iconURL in the Document instead of the Frame
+        * page/Frame.cpp:
+        (WebCore::Frame::iconURL): Calculates the iconURL based on the document, then the default favicon.ico url
+        (WebCore::Frame::endIfNotLoading): Checks for the load type - always loads icon on Reload
+        * page/Frame.h: Nuked setIconURL(), added isLoadTypeReload()
+        * page/FramePrivate.h: Nuked IconURL
+        * platform/win/TemporaryLinkStubs.cpp:
+        (FrameWin::isLoadTypeReload):
+
 2006-09-18  Sam Weinig  <sam.weinig@gmail.com>
 
         Reviewed by Tim H.
index 4a6fee740ababd67d90abd5f2084db6f3f6d1d4f..b675b9faa3eddb01686eafa579d814e83552a0c8 100644 (file)
@@ -324,6 +324,7 @@ protected:
     virtual void startRedirectionTimer();
     virtual void stopRedirectionTimer();
     virtual void cleanupPluginObjects();
+    virtual bool isLoadTypeReload();
     
 private:
     virtual void handleMousePressEvent(const MouseEventWithHitTestResults&);
index f01f8998bf542b7cfe3009e2f1c718acabd6c7a2..4b7f054acad87ced52b5ce75792f95c0edbac082 100644 (file)
@@ -3570,4 +3570,9 @@ KURL FrameMac::originalRequestURL() const
     return [_bridge originalRequestURL];
 }
 
+bool FrameMac::isLoadTypeReload()
+{
+    return [_bridge isLoadTypeReload];
+}
+
 }
index 551b243bee31df8c799fcd76e2cc6107a8d39fae..b5231682e8d76e2b334a201b46841ecadcb64df7 100644 (file)
@@ -688,6 +688,7 @@ typedef enum {
 
 - (void)notifyIconChanged:(NSURL*)iconURL;
 - (NSURL*)originalRequestURL;
+- (BOOL)isLoadTypeReload;
 @end
 
 // This interface definition allows those who hold a WebCoreFrameBridge * to call all the methods
index acb3c29d340014dc90e0d78151fdb1727d4020ba..7fca39e3d5c49f2b2f88399c24c011a9c9cb5e27 100644 (file)
@@ -126,6 +126,9 @@ public:
 
     bool keyPress(const PlatformKeyboardEvent&);
     virtual KURL originalRequestURL() const;
+    
+protected:
+    virtual bool isLoadTypeReload();
 
 private:
     virtual bool passMouseDownEventToWidget(Widget*);
index 517ce59d2eb35516d4bcf0bdff7329ebeec4c979..d9668e38afe18200da3126ee7f67bb6cb743a1a3 100644 (file)
@@ -3481,4 +3481,19 @@ FormElementKey FormElementKeyHashTraits::deletedValue()
     return HashTraits<AtomicStringImpl*>::deletedValue();
 }
 
+
+String Document::iconURL()
+{
+    return m_iconURL;
+}
+
+void Document::setIconURL(const String& iconURL, const String& type)
+{
+    // FIXME - <rdar://problem/4727645> - At some point in the future, we might actually honor the "type" 
+    if (m_iconURL.isEmpty())
+        m_iconURL = iconURL;
+    else if (!type.isEmpty())
+        m_iconURL = iconURL;
+}
+
 }
index adeac3191d994cf86bed430a61620fc09e4f8056..cd465e84d55155d59d73d39c035775ad39c36378 100644 (file)
@@ -598,6 +598,8 @@ public:
 
     bool didLayoutWithPendingStylesheets() const { return m_pendingSheetLayout == DidLayoutWithPendingSheets; }
 
+    String iconURL();
+    void setIconURL(const String& iconURL, const String& type);
 protected:
     CSSStyleSelector* m_styleSelector;
     FrameView* m_view;
@@ -607,7 +609,7 @@ protected:
     DeprecatedString m_url;
     DeprecatedString m_baseURL;
     String m_baseTarget;
-
+    
     RefPtr<DocumentType> m_docType;
     RefPtr<DOMImplementation> m_implementation;
 
@@ -812,6 +814,7 @@ private:
     mutable bool m_accessKeyMapValid;
     bool m_createRenderers;
     bool m_inPageCache;
+    String m_iconURL;
 };
 
 } //namespace
index 317318fed5726c8091ac541b8600e661e0c28c02..13924a9783ccd59338092c82679f40d13ff3ed15 100644 (file)
@@ -422,5 +422,5 @@ void HTMLDocument::determineParseMode(const String& str)
     m_styleSelector->strictParsing = !inCompatMode();
  
 }
-
+    
 }
index 1769970c9da78d8557090bfbb4ec15d8736a53ed..e531182cda858a67d17728cd050f067b231fb492 100644 (file)
@@ -65,7 +65,7 @@ public:
     bool hasDocExtraNamedItem(const String& name);
 
     typedef HashMap<StringImpl*, int> NameCountMap;
-
+    
 protected:
     HTMLElement* bodyElement;
     HTMLElement* htmlElement;
index 343cb98fbc12c6a5739274433c20696b68e0103d..f5d7ca62282270e308d4f68bdeebc86b1bb58d64 100644 (file)
@@ -152,12 +152,11 @@ void HTMLLinkElement::process()
         return;
 
     String type = m_type.lower();
-    
-    Frame* frame = document()->frame();
 
     // IE extension: location of small icon for locationbar / bookmarks
-    if (frame && m_isIcon && !m_url.isEmpty() && !frame->tree()->parent())
-        frame->setIconURL(m_url, type);
+    // We'll record this URL per document, even if we later only use it in top level frames
+    if (m_isIcon && !m_url.isEmpty())
+        document()->setIconURL(m_url, type);
 
     // Stylesheet
     // This was buggy and would incorrectly match <link rel="alternate">, which has a different specified meaning. -dwh
index 3ce28a952babc17c07f5375365963a977bac1341..99b3dffee0bcead8b71a09cf10e2a4f5f2468734 100644 (file)
@@ -231,8 +231,8 @@ KURL Frame::iconURL()
         return "";
         
     // If we have an iconURL from a Link element, return that
-    if (!d->m_iconURL.isEmpty())
-        return KURL(d->m_iconURL.deprecatedString());
+    if (!document()->iconURL().isEmpty())
+        return KURL(document()->iconURL().deprecatedString());
         
     // Don't return a favicon iconURL unless we're http or https
     if (d->m_url.protocol() != "http" && d->m_url.protocol() != "https")
@@ -245,15 +245,6 @@ KURL Frame::iconURL()
     return url;
 }
 
-void Frame::setIconURL(const String& url, const String& type)
-{
-    // FIXME - <rdar://problem/4727645> - At some point in the future, we might actually honor the "type" 
-    if (d->m_iconURL.isEmpty())
-        d->m_iconURL = url;
-    else if (!type.isEmpty())
-        d->m_iconURL = url;
-}
-
 bool Frame::didOpenURL(const KURL& url)
 {
   if (d->m_scheduledRedirection == locationChangeScheduledDuringLoad) {
@@ -782,7 +773,7 @@ void Frame::endIfNotLoading()
     
     IconDatabase* sharedIconDatabase = IconDatabase::sharedIconDatabase();
     // If we already have an unexpired icon, we won't kick off a load but we *will* map the appropriate URLs to it
-    if (sharedIconDatabase->hasEntryForIconURL(url) && !sharedIconDatabase->isIconExpiredForIconURL(url)) {
+    if (sharedIconDatabase->hasEntryForIconURL(url) && !isLoadTypeReload() && !sharedIconDatabase->isIconExpiredForIconURL(url)) {
         commitIconURLToIconDatabase();
         return;
     }
index fbca5dca734958e60a70bca11208b4ad385e97b1..735416082a8955fcb7f279cc56dd32264286f377 100644 (file)
@@ -107,7 +107,6 @@ public:
   void didExplicitOpen();
 
   KURL iconURL();
-  void setIconURL(const String& url, const String& type);
   void commitIconURLToIconDatabase();
   
   Page* page() const;
@@ -590,6 +589,8 @@ protected:
   virtual ObjectContentType objectContentType(const KURL& url, const String& mimeType) = 0;
 
   virtual void redirectionTimerFired(Timer<Frame>*);
+  
+  virtual bool isLoadTypeReload() = 0;
 
 public:
   void loadDone();
index 6d9bca5e53119bae367f19a96f0eda13e76b6fe8..0b74c50d91d1d529db9ff3b342edfaf9be861611 100644 (file)
@@ -173,8 +173,6 @@ namespace WebCore {
 
         String m_referrer;
 
-        String m_iconURL;
-
         struct SubmitForm {
             const char* submitAction;
             String submitUrl;
index af20889ccc87eaf1bd688a221ca4927cf3507238..806a2019d3d1337810b6705e1e78f1b874ac30ca 100644 (file)
@@ -182,6 +182,7 @@ bool FrameWin::canPaste() const { notImplemented(); return 0; }
 bool FrameWin::canGoBackOrForward(int) const { notImplemented(); return 0; }
 void FrameWin::issuePasteAndMatchStyleCommand() { notImplemented(); }
 KURL FrameWin::originalRequestURL() const { return KURL(); }
+bool FrameWin::isLoadTypeReload() { notImplemented(); return false; }
 
 bool BrowserExtensionWin::canRunModal() { notImplemented(); return 0; }
 void BrowserExtensionWin::createNewWindow(struct WebCore::ResourceRequest const&,struct WebCore::WindowArgs const&,Frame*&) { notImplemented(); }
index b6aa3357096feddb4840fa58333fb2446613f556..ed0a19642485c13fc9df6ffd218839698b7087ea 100644 (file)
@@ -1,3 +1,12 @@
+2006-09-18  Brady Eidson  <beidson@apple.com>
+
+        Reviewed by Anders
+
+        Implement a bridge method so WebCore can find the reload type of a frame load
+
+        * WebCoreSupport/WebFrameBridge.m:
+        (-[WebFrameBridge isLoadTypeReload]):
+
 2006-09-18  Sam Weinig  <sam.weinig@gmail.com>
 
         Reviewed by Tim H.
index aa3f5f45b3ac5759277a4096498a4aaef2abb569..dd502707ed569357b08c5f251c3f1c9c94cbbe76 100644 (file)
@@ -1713,4 +1713,11 @@ static id <WebFormDelegate> formDelegate(WebFrameBridge *self)
     return [[[[_frame _frameLoader] activeDataSource] initialRequest] URL];
 }
 
+- (BOOL)isLoadTypeReload
+{
+    return [_frame _loadType] == WebFrameLoadTypeReload;
+}
+
+
+
 @end