Reviewed by John
authorbeidson <beidson@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 18 Sep 2006 18:13:26 +0000 (18:13 +0000)
committerbeidson <beidson@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 18 Sep 2006 18:13:26 +0000 (18:13 +0000)
        http://bugzilla.opendarwin.org/show_bug.cgi?id=10907
        REGRESSION: New Icon Loaders don't handle certain non-server-root URLs correctly

        * bridge/mac/FrameMac.h: Changed originalRequestURL() to virtual
        * bridge/win/FrameWin.h: Added originalRequestURL()
        * loader/icon/IconLoader.cpp:
        (IconLoader::receivedAllData): Moved the "pageURL to iconURL mapping logic" to Frame::commitIconURLToIconDatabase()
        * page/Frame.cpp:
        (WebCore::Frame::iconURL): Construct the icon URL from *only* the protocol and host of the frame's url.
        (WebCore::Frame::endIfNotLoading): Call commitIconURLToIconDatabase() if we're not kicking off an icon load
        (WebCore::Frame::commitIconURLToIconDatabase): Map the completed doc's pageURL to the iconURL
        * page/Frame.h: Added pure virtual originalRequestURL()
        * platform/win/TemporaryLinkStubs.cpp:
        (FrameWin::originalRequestURL): Added

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

WebCore/ChangeLog
WebCore/bridge/mac/FrameMac.h
WebCore/bridge/win/FrameWin.h
WebCore/loader/icon/IconLoader.cpp
WebCore/page/Frame.cpp
WebCore/page/Frame.h
WebCore/platform/win/TemporaryLinkStubs.cpp

index 8667ae1ca1cd9af5b4dc6dd4da455195d93d12cb..a83a668ed5134501aa1eb7b6a84621dfcf7d3ef0 100644 (file)
@@ -1,3 +1,22 @@
+2006-09-18  Brady Eidson  <beidson@apple.com>
+
+        Reviewed by John
+
+        http://bugzilla.opendarwin.org/show_bug.cgi?id=10907
+        REGRESSION: New Icon Loaders don't handle certain non-server-root URLs correctly
+
+        * bridge/mac/FrameMac.h: Changed originalRequestURL() to virtual
+        * bridge/win/FrameWin.h: Added originalRequestURL()
+        * loader/icon/IconLoader.cpp:
+        (IconLoader::receivedAllData): Moved the "pageURL to iconURL mapping logic" to Frame::commitIconURLToIconDatabase()
+        * page/Frame.cpp:
+        (WebCore::Frame::iconURL): Construct the icon URL from *only* the protocol and host of the frame's url.
+        (WebCore::Frame::endIfNotLoading): Call commitIconURLToIconDatabase() if we're not kicking off an icon load
+        (WebCore::Frame::commitIconURLToIconDatabase): Map the completed doc's pageURL to the iconURL
+        * page/Frame.h: Added pure virtual originalRequestURL()
+        * platform/win/TemporaryLinkStubs.cpp:
+        (FrameWin::originalRequestURL): Added
+
 2006-09-18  Rob Buis  <buis@kde.org>
 
         Reviewed by Maciej.
index 9c671d796499b3328a6f122ee6edab48a20b52d1..4a6fee740ababd67d90abd5f2084db6f3f6d1d4f 100644 (file)
@@ -318,7 +318,7 @@ public:
     void paintCustomHighlight(const AtomicString& type, const FloatRect& boxRect, const FloatRect& lineRect, bool text, bool line);
     
     NSEvent* currentEvent() { return _currentEvent; }
-    KURL originalRequestURL() const;
+    virtual KURL originalRequestURL() const;
     
 protected:
     virtual void startRedirectionTimer();
@@ -329,7 +329,7 @@ private:
     virtual void handleMousePressEvent(const MouseEventWithHitTestResults&);
     virtual void handleMouseMoveEvent(const MouseEventWithHitTestResults&);
     virtual void handleMouseReleaseEvent(const MouseEventWithHitTestResults&);
-    
+      
     NSView* mouseDownViewIfStillGood();
 
     NSView* nextKeyViewInFrame(Node* startingPoint, SelectionDirection, bool* focusCallResultedInViewBeingCreated = 0);
index f04f42d9bc8840cf2756aa470e74818db8499e84..acb3c29d340014dc90e0d78151fdb1727d4020ba 100644 (file)
@@ -125,6 +125,7 @@ public:
     virtual void print();
 
     bool keyPress(const PlatformKeyboardEvent&);
+    virtual KURL originalRequestURL() const;
 
 private:
     virtual bool passMouseDownEventToWidget(Widget*);
index f74391001a35ccb3b7ffe2505a138b4c3914faef..88e8eb8140972183197da0474bc179a591afd84e 100644 (file)
@@ -108,7 +108,7 @@ void IconLoader::receivedAllData(ResourceLoader* resourceLoader)
         size = m_data.size();
     }
         
-    IconDatabase * iconDatabase = IconDatabase::sharedIconDatabase();
+    IconDatabase* iconDatabase = IconDatabase::sharedIconDatabase();
     ASSERT(iconDatabase);
     
     KURL iconURL(resourceLoader->url());
@@ -118,16 +118,10 @@ void IconLoader::receivedAllData(ResourceLoader* resourceLoader)
     else
         iconDatabase->setHaveNoIconForIconURL(iconURL.url());
         
-    // We set both the original request URL and the final URL as the PageURLs as different parts
-    // of the app tend to want to retain both
-    iconDatabase->setIconURLForPageURL(iconURL.url(), m_frame->url().url());
-
-    // FIXME - Need to be able to do the following platform independently
-#if PLATFORM(MAC)
-    FrameMac* frameMac = Mac(m_frame);
-    iconDatabase->setIconURLForPageURL(iconURL.url(), frameMac->originalRequestURL().url());
-#endif
-
+    // Tell the Frame to map its url(s) to its iconURL in the database
+    m_frame->commitIconURLToIconDatabase();
+    
+    // Send the notification to the app that this icon is finished loading
     notifyIconChanged(iconURL);
 
     // ResourceLoaders delete themselves after they deliver their last data, so we can just forget about it
index b2c7e03b2c7f99259cff36b16f3656a2f21bb620..3ce28a952babc17c07f5375365963a977bac1341 100644 (file)
@@ -238,7 +238,9 @@ KURL Frame::iconURL()
     if (d->m_url.protocol() != "http" && d->m_url.protocol() != "https")
         return "";
         
-    KURL url = d->m_url;
+    KURL url;
+    url.setProtocol(d->m_url.protocol());
+    url.setHost(d->m_url.host());
     url.setPath("/favicon.ico");
     return url;
 }
@@ -777,16 +779,29 @@ void Frame::endIfNotLoading()
     String url(iconURL().url());
     if (url.isEmpty())
         return;
-        
+    
     IconDatabase* sharedIconDatabase = IconDatabase::sharedIconDatabase();
-    if (sharedIconDatabase->hasEntryForIconURL(url) && !sharedIconDatabase->isIconExpiredForIconURL(url))
+    // 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)) {
+        commitIconURLToIconDatabase();
         return;
+    }
     
     if (!d->m_iconLoader)
         d->m_iconLoader = IconLoader::createForFrame(this);
     d->m_iconLoader->startLoading();
 }
 
+void Frame::commitIconURLToIconDatabase()
+{
+    KURL icon = iconURL();
+    
+    IconDatabase* iconDatabase = IconDatabase::sharedIconDatabase();
+    ASSERT(iconDatabase);
+    iconDatabase->setIconURLForPageURL(icon.url(), this->url().url());
+    iconDatabase->setIconURLForPageURL(icon.url(), originalRequestURL().url());
+}
+
 void Frame::stop()
 {
     // http://bugzilla.opendarwin.org/show_bug.cgi?id=10854
index adf19404f8e632191d238eade35bd955409b7060..fbca5dca734958e60a70bca11208b4ad385e97b1 100644 (file)
@@ -108,6 +108,7 @@ public:
 
   KURL iconURL();
   void setIconURL(const String& url, const String& type);
+  void commitIconURLToIconDatabase();
   
   Page* page() const;
   void pageDestroyed();
@@ -600,7 +601,7 @@ public:
   void reparseConfiguration();
 
 private:
-
+  virtual KURL originalRequestURL() const = 0;
   void childBegin();
 
   void submitFormAgain();
index 197a4b102d3b7c22fc55891a552546ec3e8cb875..817adf19429cf33328204b4cd80e49eaf932422a 100644 (file)
@@ -181,6 +181,7 @@ void FrameWin::issueTransposeCommand() { notImplemented(); }
 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 BrowserExtensionWin::canRunModal() { notImplemented(); return 0; }
 void BrowserExtensionWin::createNewWindow(struct WebCore::ResourceRequest const&,struct WebCore::WindowArgs const&,Frame*&) { notImplemented(); }