[SCM] WebKit Debian packaging branch, webkit-1.1, updated. upstream/1.1.15.1-1414-gc69ee75

japhet at chromium.org japhet at chromium.org
Thu Oct 29 20:48:04 UTC 2009


The following commit has been merged in the webkit-1.1 branch:
commit 3ded96331b0eb8d29b67ba766841e8cd69a17fc4
Author: japhet at chromium.org <japhet at chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Mon Oct 19 21:15:06 2009 +0000

    2009-10-19  Nate Chapin  <japhet at chromium.org>
    
            Reviewed by Alexey Proskuryakov.
    
            Add support for link relations in HTMLAnchorElement and implement rel="noreferrer".
    
            https://bugs.webkit.org/show_bug.cgi?id=28986
    
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@49809 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index d3c357d..dbac4d8 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,5 +1,25 @@
 2009-10-19  Nate Chapin  <japhet at chromium.org>
 
+        Reviewed by Alexey Proskuryakov.
+
+        Add tests for noreferrer link relation.
+
+        https://bugs.webkit.org/show_bug.cgi?id=28986
+
+        * http/tests/navigation/no-referrer-reset-expected.txt: Added.
+        * http/tests/navigation/no-referrer-reset.html: Added.
+        * http/tests/navigation/no-referrer-same-window-expected.txt: Added.
+        * http/tests/navigation/no-referrer-same-window.html: Added.
+        * http/tests/navigation/no-referrer-subframe-expected.txt: Added.
+        * http/tests/navigation/no-referrer-subframe.html: Added.
+        * http/tests/navigation/no-referrer-target-blank-expected.txt: Added.
+        * http/tests/navigation/no-referrer-target-blank.html: Added.
+        * http/tests/navigation/resources/no-referrer-helper.php: Added.
+        * http/tests/navigation/resources/no-referrer-reset-helper.php: Added.
+        * http/tests/navigation/resources/no-referrer-same-window-helper.php: Added.
+
+2009-10-19  Nate Chapin  <japhet at chromium.org>
+
         Reviewed by Geoffrey Garen.
 
         Add plugins/netscape-invoke-failures.html to Snow Leopard skipped list.
diff --git a/LayoutTests/http/tests/navigation/no-referrer-reset-expected.txt b/LayoutTests/http/tests/navigation/no-referrer-reset-expected.txt
new file mode 100644
index 0000000..ce6eae0
--- /dev/null
+++ b/LayoutTests/http/tests/navigation/no-referrer-reset-expected.txt
@@ -0,0 +1,11 @@
+This tests whether referrer information gets properly set and reset when "noreferrer" links are present. We do the following:
+1. Open a link in a new window: referrer is sent and window.opener is sent.
+2. Click a rel="noreferrer" link: referrer and window.opener are nulled.
+3. Click a link without rel="noreferrer": referrer is sent, but window.opener is still null (since it was nulled in the previous step). 
+Start reset test
+Referrer: http://127.0.0.1:8000/navigation/no-referrer-reset.html
+window.opener: http://127.0.0.1:8000/navigation/no-referrer-reset.html
+Referrer:
+window.opener:
+Referrer: http://127.0.0.1:8000/navigation/resources/no-referrer-reset-helper.php
+window.opener:
diff --git a/LayoutTests/http/tests/navigation/no-referrer-reset.html b/LayoutTests/http/tests/navigation/no-referrer-reset.html
new file mode 100644
index 0000000..abd394b
--- /dev/null
+++ b/LayoutTests/http/tests/navigation/no-referrer-reset.html
@@ -0,0 +1,30 @@
+<html><body>
+This tests whether referrer information gets properly set and reset when "noreferrer" links are present. We do the following:<br/>
+1. Open a link in a new window: referrer is sent and window.opener is sent.<br/>
+2. Click a rel="noreferrer" link: referrer and window.opener are nulled.<br/>
+3. Click a link without rel="noreferrer": referrer is sent, but window.opener is still null (since it was nulled in the previous step).
+<br/>
+<a id="link" href="resources/no-referrer-reset-helper.php" target="_blank">Start reset test</a>
+<script>
+    window.name = "consoleWindow";
+    window.noreferrerStepDone = false;
+    if (window.layoutTestController) {
+        layoutTestController.dumpAsText();
+        layoutTestController.setCanOpenWindows(true);
+        layoutTestController.waitUntilDone();
+    }
+
+    var target = document.getElementById("link");
+    eventSender.mouseMoveTo(target.offsetLeft + 2, target.offsetTop + 2);
+    eventSender.mouseDown();
+    eventSender.mouseUp();
+    
+function log(msg)
+{
+    var line = document.createElement('div');
+    line.appendChild(document.createTextNode(msg));
+    document.getElementById('console').appendChild(line);
+}
+</script>
+<div id="console"></div>
+</body></html>
diff --git a/LayoutTests/http/tests/navigation/no-referrer-same-window-expected.txt b/LayoutTests/http/tests/navigation/no-referrer-same-window-expected.txt
new file mode 100644
index 0000000..e547d98
--- /dev/null
+++ b/LayoutTests/http/tests/navigation/no-referrer-same-window-expected.txt
@@ -0,0 +1,3 @@
+The Referrer displayed below should be empty.
+Referrer:
+PASS
diff --git a/LayoutTests/http/tests/navigation/no-referrer-same-window.html b/LayoutTests/http/tests/navigation/no-referrer-same-window.html
new file mode 100644
index 0000000..a9feb7a
--- /dev/null
+++ b/LayoutTests/http/tests/navigation/no-referrer-same-window.html
@@ -0,0 +1,27 @@
+<html><body>
+This tests the basic functionality of the "noreferrer" link relation on anchor tags. The link below should not
+send an http referrer, and the resulting window should have its opener attribute set to null.  The values
+of the referrer and window.opener should be empty below.
+<br/>
+<a id="link" href="resources/no-referrer-same-window-helper.php" rel="noreferrer">Start no referrer test</a>
+<script>
+    window.name = "consoleWindow";
+    if (window.layoutTestController) {
+        layoutTestController.dumpAsText();
+        layoutTestController.waitUntilDone();
+    }
+
+    var target = document.getElementById("link");
+    eventSender.mouseMoveTo(target.offsetLeft + 2, target.offsetTop + 2);
+    eventSender.mouseDown();
+    eventSender.mouseUp();
+    
+function log(msg)
+{
+    var line = document.createElement('div');
+    line.appendChild(document.createTextNode(msg));
+    document.getElementById('console').appendChild(line);
+}
+</script>
+<div id="console"></div>
+</body></html>
diff --git a/LayoutTests/http/tests/navigation/no-referrer-subframe-expected.txt b/LayoutTests/http/tests/navigation/no-referrer-subframe-expected.txt
new file mode 100644
index 0000000..8f6b790
--- /dev/null
+++ b/LayoutTests/http/tests/navigation/no-referrer-subframe-expected.txt
@@ -0,0 +1,4 @@
+This tests behavior of "noreferrer" links in subframes. A referrer should not be sent and window.opener should remain null.
+Load subframe 
+Referrer:
+window.opener:
diff --git a/LayoutTests/http/tests/navigation/no-referrer-subframe.html b/LayoutTests/http/tests/navigation/no-referrer-subframe.html
new file mode 100644
index 0000000..db16904
--- /dev/null
+++ b/LayoutTests/http/tests/navigation/no-referrer-subframe.html
@@ -0,0 +1,25 @@
+<html><body>
+This tests behavior of "noreferrer" links in subframes. A referrer should not be sent and window.opener should remain null.<br/>
+<a id="link" href="resources/no-referrer-helper.php" rel="noreferrer" target="subframe">Load subframe</a>
+<iframe id="subframe" src="about:blank"></iframe>
+<script>
+    window.name = "consoleWindow";
+    if (window.layoutTestController) {
+        layoutTestController.dumpAsText();
+        layoutTestController.waitUntilDone();
+    }
+
+    var target = document.getElementById("link");
+    eventSender.mouseMoveTo(target.offsetLeft + 2, target.offsetTop + 2);
+    eventSender.mouseDown();
+    eventSender.mouseUp();
+    
+function log(msg)
+{
+    var line = document.createElement('div');
+    line.appendChild(document.createTextNode(msg));
+    document.getElementById('console').appendChild(line);
+}
+</script>
+<div id="console"></div>
+</body></html>
diff --git a/LayoutTests/http/tests/navigation/no-referrer-target-blank-expected.txt b/LayoutTests/http/tests/navigation/no-referrer-target-blank-expected.txt
new file mode 100644
index 0000000..5c32e5e
--- /dev/null
+++ b/LayoutTests/http/tests/navigation/no-referrer-target-blank-expected.txt
@@ -0,0 +1,4 @@
+This tests the functionality of the "noreferrer" link relation on anchor tags. The link below should not send an http referrer, and the resulting window should have its opener attribute set to null. The values of the referrer and window.opener should be empty below.
+Start no referrer test
+Referrer:
+window.opener:
diff --git a/LayoutTests/http/tests/navigation/no-referrer-target-blank.html b/LayoutTests/http/tests/navigation/no-referrer-target-blank.html
new file mode 100644
index 0000000..c2a005b
--- /dev/null
+++ b/LayoutTests/http/tests/navigation/no-referrer-target-blank.html
@@ -0,0 +1,27 @@
+<html><body>
+This tests the functionality of the "noreferrer" link relation on anchor tags. The link below should not
+send an http referrer, and the resulting window should have its opener attribute set to null.  The values
+of the referrer and window.opener should be empty below.<br/>
+<a id="link" href="resources/no-referrer-helper.php" rel="noreferrer" target="_blank">Start no referrer test</a>
+<script>
+    window.name = "consoleWindow";
+    if (window.layoutTestController) {
+        layoutTestController.dumpAsText();
+        layoutTestController.setCanOpenWindows(true);
+        layoutTestController.waitUntilDone();
+    }
+
+    var target = document.getElementById("link");
+    eventSender.mouseMoveTo(target.offsetLeft + 2, target.offsetTop + 2);
+    eventSender.mouseDown();
+    eventSender.mouseUp();
+
+function log(msg)
+{
+    var line = document.createElement('div');
+    line.appendChild(document.createTextNode(msg));
+    document.getElementById('console').appendChild(line);
+}
+</script>
+<div id="console"></div>
+</body></html>
diff --git a/LayoutTests/http/tests/navigation/resources/no-referrer-helper.php b/LayoutTests/http/tests/navigation/resources/no-referrer-helper.php
new file mode 100644
index 0000000..cb6a749
--- /dev/null
+++ b/LayoutTests/http/tests/navigation/resources/no-referrer-helper.php
@@ -0,0 +1,31 @@
+<?php
+    // Prevent from being cached.
+    header("Cache-Control: no-store, private, max-age=0");
+    header("Content-Type: text/html");
+?>
+
+<html><body>
+<div id="console"></div>
+<div id="referrer">
+Referrer: <?php echo $_SERVER['HTTP_REFERER']; ?>
+</div>
+<br/>
+<script>
+function log(msg)
+{
+    var line = document.createElement('div');
+    line.appendChild(document.createTextNode(msg));
+    document.getElementById('console').appendChild(line);
+}
+
+    var consoleWindow = window.open("", "consoleWindow");
+    if (consoleWindow) {
+        consoleWindow.log(document.getElementById("referrer").innerText);
+        consoleWindow.log("window.opener: " + (window.opener ? window.opener.location : ""));
+    }
+    
+    if (window.layoutTestController)
+        layoutTestController.notifyDone();
+</script>
+
+</body></html>
diff --git a/LayoutTests/http/tests/navigation/resources/no-referrer-reset-helper.php b/LayoutTests/http/tests/navigation/resources/no-referrer-reset-helper.php
new file mode 100644
index 0000000..7ef315f
--- /dev/null
+++ b/LayoutTests/http/tests/navigation/resources/no-referrer-reset-helper.php
@@ -0,0 +1,31 @@
+<?php
+    // Prevent from being cached.
+    header("Cache-Control: no-store, private, max-age=0");
+    header("Content-Type: text/html");
+?>
+
+<html><body>
+<div id="referrer">
+Referrer: <?php echo $_SERVER['HTTP_REFERER']; ?>
+</div>
+<br/>
+<a id="noreferrer-link" href="no-referrer-reset-helper.php" rel="noreferrer">Doesn't send referrer</a>
+<a id="referrer-link" href="no-referrer-helper.php">Sends referrer</a>
+<script>
+    var consoleWindow = window.open("", "consoleWindow");
+    if (consoleWindow) {
+        consoleWindow.log(document.getElementById("referrer").innerText);
+        consoleWindow.log("window.opener: " + (window.opener ? window.opener.location : ""));
+    }
+
+    var target;
+    if (!consoleWindow.noreferrerStepDone) {
+        consoleWindow.noreferrerStepDone = true;
+        target = document.getElementById("noreferrer-link");
+    } else 
+        target = document.getElementById("referrer-link");
+    var newEvent = document.createEvent("MouseEvent");
+    newEvent.initMouseEvent("click", false, false, window, 0, 10, 10, 10, 10, false, false, false, false, 0, target);
+    target.dispatchEvent(newEvent);
+</script>
+</body></html>
diff --git a/LayoutTests/http/tests/navigation/resources/no-referrer-same-window-helper.php b/LayoutTests/http/tests/navigation/resources/no-referrer-same-window-helper.php
new file mode 100644
index 0000000..73a5fd8
--- /dev/null
+++ b/LayoutTests/http/tests/navigation/resources/no-referrer-same-window-helper.php
@@ -0,0 +1,19 @@
+<?php
+    // Prevent from being cached.
+    header("Cache-Control: no-store, private, max-age=0");
+    header("Content-Type: text/html");
+?>
+
+<html><body>
+The Referrer displayed below should be empty.<br/>
+<div id="referrer">Referrer: <?php echo $_SERVER['HTTP_REFERER']; ?></div>
+<div id="console"></div>
+<script>
+    var line = document.createElement('div');
+    line.appendChild(document.createTextNode(document.getElementById("referrer").innerText == "Referrer:" ? "PASS" : "FAIL"));
+    document.getElementById('console').appendChild(line);
+    
+    if (window.layoutTestController)
+        layoutTestController.notifyDone();
+</script>
+</body></html>
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index b71093e..7bf08ec 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,41 @@
+2009-10-19  Nate Chapin  <japhet at chromium.org>
+
+        Reviewed by Alexey Proskuryakov.
+
+        Add support for link relations in HTMLAnchorElement and implement rel="noreferrer".
+
+        https://bugs.webkit.org/show_bug.cgi?id=28986
+
+        Tests: http/tests/navigation/no-referrer-reset.html
+               http/tests/navigation/no-referrer-same-window.html
+               http/tests/navigation/no-referrer-subframe.html
+               http/tests/navigation/no-referrer-target-blank.html
+
+        * WebCore.base.exp: Update FrameLoader::loadFrameRequest export symbol
+        * html/HTMLAnchorElement.cpp: Add support for link relations and implement noreferrer
+        (WebCore::HTMLAnchorElement::HTMLAnchorElement):
+        (WebCore::HTMLAnchorElement::defaultEventHandler):
+        (WebCore::HTMLAnchorElement::parseMappedAttribute):
+        (WebCore::HTMLAnchorElement::hasRel):
+        (WebCore::HTMLAnchorElement::setRel):
+        * html/HTMLAnchorElement.h: Add support for link relations and implement noreferrer
+        * loader/FrameLoader.cpp:
+        (WebCore::FrameLoader::FrameLoader):
+        (WebCore::FrameLoader::createWindow):
+        (WebCore::FrameLoader::changeLocation):
+        (WebCore::FrameLoader::urlSelected): Add parameter for referrer policy
+        (WebCore::FrameLoader::loadFrameRequest): Add parameter for referrer policy
+        (WebCore::FrameLoader::continueLoadAfterNewWindowPolicy): Suppress opener if requested by ReferrerPolicy
+        * loader/FrameLoader.h: Update urlSelected and loadFrameRequest prototypes
+        * loader/FrameLoaderTypes.h: Add enum for referrer policy
+        * loader/RedirectScheduler.cpp:
+        (WebCore::RedirectScheduler::timerFired):
+        * page/ContextMenuController.cpp:
+        (WebCore::ContextMenuController::contextMenuItemSelected): Update call to urlSelected()
+        * svg/SVGAElement.cpp:
+        (WebCore::SVGAElement::defaultEventHandler): Update call to urlSelected()
+
+
 2009-10-19  Alpha Lam  <hclam at chromium.org>
 
         Reviewed by Dimitri Glazkov (dglazkov at chromium.org).
diff --git a/WebCore/WebCore.base.exp b/WebCore/WebCore.base.exp
index 3712906..25ebc66 100644
--- a/WebCore/WebCore.base.exp
+++ b/WebCore/WebCore.base.exp
@@ -160,7 +160,7 @@ __ZN7WebCore11FrameLoader14detachChildrenEv
 __ZN7WebCore11FrameLoader14scrollToAnchorERKNS_4KURLE
 __ZN7WebCore11FrameLoader14stopAllLoadersENS_14DatabasePolicyE
 __ZN7WebCore11FrameLoader16detachFromParentEv
-__ZN7WebCore11FrameLoader16loadFrameRequestERKNS_16FrameLoadRequestEbbN3WTF10PassRefPtrINS_5EventEEENS5_INS_9FormStateEEE
+__ZN7WebCore11FrameLoader16loadFrameRequestERKNS_16FrameLoadRequestEbbN3WTF10PassRefPtrINS_5EventEEENS5_INS_9FormStateEEENS_14ReferrerPolicyE
 __ZN7WebCore11FrameLoader17stopForUserCancelEb
 __ZN7WebCore11FrameLoader21loadURLIntoChildFrameERKNS_4KURLERKNS_6StringEPNS_5FrameE
 __ZN7WebCore11FrameLoader22findFrameForNavigationERKNS_12AtomicStringE
diff --git a/WebCore/html/HTMLAnchorElement.cpp b/WebCore/html/HTMLAnchorElement.cpp
index 927c81f..968f144 100644
--- a/WebCore/html/HTMLAnchorElement.cpp
+++ b/WebCore/html/HTMLAnchorElement.cpp
@@ -27,6 +27,7 @@
 #include "DNS.h"
 #include "EventNames.h"
 #include "Frame.h"
+#include "FrameLoaderTypes.h"
 #include "HTMLImageElement.h"
 #include "HTMLNames.h"
 #include "KeyboardEvent.h"
@@ -43,6 +44,7 @@ using namespace HTMLNames;
 HTMLAnchorElement::HTMLAnchorElement(const QualifiedName& tagName, Document* document)
     : HTMLElement(tagName, document, CreateElement)
     , m_wasShiftKeyDownOnMouseDown(false)
+    , m_linkRelations(0)
 {
 }
 
@@ -200,7 +202,7 @@ void HTMLAnchorElement::defaultEventHandler(Event* evt)
         }
 
         if (!evt->defaultPrevented() && document()->frame())
-            document()->frame()->loader()->urlSelected(document()->completeURL(url), getAttribute(targetAttr), evt, false, false, true);
+            document()->frame()->loader()->urlSelected(document()->completeURL(url), getAttribute(targetAttr), evt, false, false, true, hasRel(RelationNoReferrer) ? NoReferrer : SendReferrer);
 
         evt->setDefaultHandled();
     } else if (isLink() && isContentEditable()) {
@@ -274,10 +276,11 @@ void HTMLAnchorElement::parseMappedAttribute(MappedAttribute *attr)
             }
         }
     } else if (attr->name() == nameAttr ||
-             attr->name() == titleAttr ||
-             attr->name() == relAttr) {
+             attr->name() == titleAttr) {
         // Do nothing.
-    } else
+    } else if (attr->name() == relAttr)
+        setRel(attr->value());
+    else
         HTMLElement::parseMappedAttribute(attr);
 }
 
@@ -321,6 +324,20 @@ void HTMLAnchorElement::setHref(const AtomicString& value)
     setAttribute(hrefAttr, value);
 }
 
+bool HTMLAnchorElement::hasRel(uint32_t relation) const
+{
+    return m_linkRelations & relation;
+}
+
+void HTMLAnchorElement::setRel(const String& value)
+{
+    m_linkRelations = 0;
+    ClassNames newLinkRelations(value, true);
+    // FIXME: Add link relations as they are implemented
+    if (newLinkRelations.contains("noreferrer"))
+        m_linkRelations |= RelationNoReferrer;
+}
+
 const AtomicString& HTMLAnchorElement::name() const
 {
     return getAttribute(nameAttr);
diff --git a/WebCore/html/HTMLAnchorElement.h b/WebCore/html/HTMLAnchorElement.h
index f538be2..e47ea99 100644
--- a/WebCore/html/HTMLAnchorElement.h
+++ b/WebCore/html/HTMLAnchorElement.h
@@ -28,6 +28,29 @@
 
 namespace WebCore {
 
+// Link relation bitmask values.
+// FIXME: Uncomment as the various link relations are implemented.
+enum {
+//     RelationAlternate   = 0x00000001,
+//     RelationArchives    = 0x00000002,
+//     RelationAuthor      = 0x00000004,
+//     RelationBoomark     = 0x00000008,
+//     RelationExternal    = 0x00000010,
+//     RelationFirst       = 0x00000020,
+//     RelationHelp        = 0x00000040,
+//     RelationIndex       = 0x00000080,
+//     RelationLast        = 0x00000100,
+//     RelationLicense     = 0x00000200,
+//     RelationNext        = 0x00000400,
+//     RelationNoFolow    = 0x00000800,
+    RelationNoReferrer     = 0x00001000,
+//     RelationPrev        = 0x00002000,
+//     RelationSearch      = 0x00004000,
+//     RelationSidebar     = 0x00008000,
+//     RelationTag         = 0x00010000,
+//     RelationUp          = 0x00020000,
+};
+
 class HTMLAnchorElement : public HTMLElement {
 public:
     static PassRefPtr<HTMLAnchorElement> create(Document*);
@@ -51,6 +74,9 @@ public:
 
     bool isLiveLink() const;
 
+    bool hasRel(uint32_t relation) const;
+    void setRel(const String&);
+
 protected:
     HTMLAnchorElement(const QualifiedName&, Document*);
 
@@ -73,6 +99,7 @@ private:
 
     RefPtr<Element> m_rootEditableElementForSelectionOnMouseDown;
     bool m_wasShiftKeyDownOnMouseDown;
+    uint32_t m_linkRelations;
 };
 
 } // namespace WebCore
diff --git a/WebCore/loader/FrameLoader.cpp b/WebCore/loader/FrameLoader.cpp
index 5c27c85..449e9a6 100644
--- a/WebCore/loader/FrameLoader.cpp
+++ b/WebCore/loader/FrameLoader.cpp
@@ -55,6 +55,7 @@
 #include "FrameLoaderClient.h"
 #include "FrameTree.h"
 #include "FrameView.h"
+#include "HTMLAnchorElement.h"
 #include "HTMLAppletElement.h"
 #include "HTMLFormElement.h"
 #include "HTMLFrameElement.h"
@@ -195,6 +196,7 @@ FrameLoader::FrameLoader(Frame* frame, FrameLoaderClient* client)
     , m_committedFirstRealDocumentLoad(false)
     , m_didPerformFirstNavigation(false)
     , m_loadingFromCachedPage(false)
+    , m_suppressOpenerInNewFrame(false)
 #ifndef NDEBUG
     , m_didDispatchDidCommitLoad(false)
 #endif
@@ -252,7 +254,7 @@ Frame* FrameLoader::createWindow(FrameLoader* frameLoaderForFrameLookup, const F
         Frame* frame = frameLoaderForFrameLookup->frame()->tree()->find(request.frameName());
         if (frame && shouldAllowNavigation(frame)) {
             if (!request.resourceRequest().url().isEmpty())
-                frame->loader()->loadFrameRequest(request, false, false, 0, 0);
+                frame->loader()->loadFrameRequest(request, false, false, 0, 0, SendReferrer);
             if (Page* page = frame->page())
                 page->chrome()->focus();
             created = false;
@@ -319,11 +321,13 @@ void FrameLoader::changeLocation(const KURL& url, const String& referrer, bool l
     if (m_frame->script()->executeIfJavaScriptURL(request.url(), userGesture))
         return;
 
-    urlSelected(request, "_self", 0, lockHistory, lockBackForwardList, userGesture);
+    urlSelected(request, "_self", 0, lockHistory, lockBackForwardList, userGesture, SendReferrer);
 }
 
-void FrameLoader::urlSelected(const ResourceRequest& request, const String& passedTarget, PassRefPtr<Event> triggeringEvent, bool lockHistory, bool lockBackForwardList, bool userGesture)
+void FrameLoader::urlSelected(const ResourceRequest& request, const String& passedTarget, PassRefPtr<Event> triggeringEvent, bool lockHistory, bool lockBackForwardList, bool userGesture, ReferrerPolicy referrerPolicy)
 {
+    ASSERT(!m_suppressOpenerInNewFrame);
+
     if (m_frame->script()->executeIfJavaScriptURL(request.url(), userGesture, false))
         return;
 
@@ -333,11 +337,16 @@ void FrameLoader::urlSelected(const ResourceRequest& request, const String& pass
 
     FrameLoadRequest frameRequest(request, target);
 
-    if (frameRequest.resourceRequest().httpReferrer().isEmpty())
+    if (referrerPolicy == NoReferrer) {
+        m_suppressOpenerInNewFrame = true;
+        setOpener(0);
+    } else if (frameRequest.resourceRequest().httpReferrer().isEmpty())
         frameRequest.resourceRequest().setHTTPReferrer(m_outgoingReferrer);
     addHTTPOriginIfNeeded(frameRequest.resourceRequest(), outgoingOrigin());
 
-    loadFrameRequest(frameRequest, lockHistory, lockBackForwardList, triggeringEvent, 0);
+    loadFrameRequest(frameRequest, lockHistory, lockBackForwardList, triggeringEvent, 0, referrerPolicy);
+
+    m_suppressOpenerInNewFrame = false;
 }
 
 bool FrameLoader::requestFrame(HTMLFrameOwnerElement* ownerElement, const String& urlString, const AtomicString& frameName)
@@ -1774,7 +1783,7 @@ static bool isFeedWithNestedProtocolInHTTPFamily(const KURL& url)
 }
 
 void FrameLoader::loadFrameRequest(const FrameLoadRequest& request, bool lockHistory, bool lockBackForwardList,
-    PassRefPtr<Event> event, PassRefPtr<FormState> formState)
+    PassRefPtr<Event> event, PassRefPtr<FormState> formState, ReferrerPolicy referrerPolicy)
 {    
     KURL url = request.resourceRequest().url();
 
@@ -1793,7 +1802,7 @@ void FrameLoader::loadFrameRequest(const FrameLoadRequest& request, bool lockHis
         }
     }
 
-    if (SecurityOrigin::shouldHideReferrer(url, referrer))
+    if (SecurityOrigin::shouldHideReferrer(url, referrer) || referrerPolicy == NoReferrer)
         referrer = String();
     
     FrameLoadType loadType;
@@ -3464,7 +3473,8 @@ void FrameLoader::continueLoadAfterNewWindowPolicy(const ResourceRequest& reques
 
     mainFrame->page()->setOpenedByDOM();
     mainFrame->loader()->m_client->dispatchShow();
-    mainFrame->loader()->setOpener(frame.get());
+    if (!m_suppressOpenerInNewFrame)
+        mainFrame->loader()->setOpener(frame.get());
     mainFrame->loader()->loadWithNavigationAction(request, NavigationAction(), false, FrameLoadTypeStandard, formState);
 }
 
diff --git a/WebCore/loader/FrameLoader.h b/WebCore/loader/FrameLoader.h
index eecabca..c4a8ff7 100644
--- a/WebCore/loader/FrameLoader.h
+++ b/WebCore/loader/FrameLoader.h
@@ -105,7 +105,7 @@ public:
     void loadURLIntoChildFrame(const KURL&, const String& referer, Frame*);
 
     void loadFrameRequest(const FrameLoadRequest&, bool lockHistory, bool lockBackForwardList,  // Called by submitForm, calls loadPostRequest and loadURL.
-        PassRefPtr<Event>, PassRefPtr<FormState>);
+        PassRefPtr<Event>, PassRefPtr<FormState>, ReferrerPolicy);
 
     void load(const ResourceRequest&, bool lockHistory);                                        // Called by WebFrame, calls load(ResourceRequest, SubstituteData).
     void load(const ResourceRequest&, const SubstituteData&, bool lockHistory);                 // Called both by WebFrame and internally, calls load(DocumentLoader*).
@@ -207,7 +207,7 @@ public:
     void setDefersLoading(bool);
 
     void changeLocation(const KURL&, const String& referrer, bool lockHistory = true, bool lockBackForwardList = true, bool userGesture = false, bool refresh = false);
-    void urlSelected(const ResourceRequest&, const String& target, PassRefPtr<Event>, bool lockHistory, bool lockBackForwardList, bool userGesture);
+    void urlSelected(const ResourceRequest&, const String& target, PassRefPtr<Event>, bool lockHistory, bool lockBackForwardList, bool userGesture, ReferrerPolicy);
     bool requestFrame(HTMLFrameOwnerElement*, const String& url, const AtomicString& frameName);
 
     void submitForm(const char* action, const String& url,
@@ -498,6 +498,7 @@ private:
 
     bool m_didPerformFirstNavigation;
     bool m_loadingFromCachedPage;
+    bool m_suppressOpenerInNewFrame;
     
 #ifndef NDEBUG
     bool m_didDispatchDidCommitLoad;
diff --git a/WebCore/loader/FrameLoaderTypes.h b/WebCore/loader/FrameLoaderTypes.h
index 76299f5..e7d51c7 100644
--- a/WebCore/loader/FrameLoaderTypes.h
+++ b/WebCore/loader/FrameLoaderTypes.h
@@ -87,6 +87,11 @@ namespace WebCore {
         UnloadEventPolicyUnloadOnly,
         UnloadEventPolicyUnloadAndPageHide
     };
+
+    enum ReferrerPolicy {
+        SendReferrer,
+        NoReferrer
+    };
 }
 
 #endif
diff --git a/WebCore/loader/RedirectScheduler.cpp b/WebCore/loader/RedirectScheduler.cpp
index 819cbdd..f015c12 100644
--- a/WebCore/loader/RedirectScheduler.cpp
+++ b/WebCore/loader/RedirectScheduler.cpp
@@ -277,7 +277,7 @@ void RedirectScheduler::timerFired(Timer<RedirectScheduler>*)
         case ScheduledRedirection::historyNavigation:
             if (redirection->historySteps == 0) {
                 // Special case for go(0) from a frame -> reload only the frame
-                loader->urlSelected(loader->url(), "", 0, redirection->lockHistory, redirection->lockBackForwardList, redirection->wasUserGesture);
+                loader->urlSelected(loader->url(), "", 0, redirection->lockHistory, redirection->lockBackForwardList, redirection->wasUserGesture, SendReferrer);
                 return;
             }
             // go(i!=0) from a frame navigates into the history of the frame only,
@@ -293,7 +293,7 @@ void RedirectScheduler::timerFired(Timer<RedirectScheduler>*)
             if (!redirection->formState->sourceFrame()->loader()->shouldAllowNavigation(m_frame))
                 return;
             loader->loadFrameRequest(redirection->frameRequest, redirection->lockHistory, redirection->lockBackForwardList,
-                redirection->event, redirection->formState);
+                redirection->event, redirection->formState, SendReferrer);
             return;
     }
 
diff --git a/WebCore/page/ContextMenuController.cpp b/WebCore/page/ContextMenuController.cpp
index 1cf0014..7d773ca 100644
--- a/WebCore/page/ContextMenuController.cpp
+++ b/WebCore/page/ContextMenuController.cpp
@@ -217,7 +217,7 @@ void ContextMenuController::contextMenuItemSelected(ContextMenuItem* item)
         break;
     case ContextMenuItemTagOpenLink:
         if (Frame* targetFrame = result.targetFrame())
-            targetFrame->loader()->loadFrameRequest(FrameLoadRequest(ResourceRequest(result.absoluteLinkURL(), frame->loader()->outgoingReferrer())), false, false, 0, 0);
+            targetFrame->loader()->loadFrameRequest(FrameLoadRequest(ResourceRequest(result.absoluteLinkURL(), frame->loader()->outgoingReferrer())), false, false, 0, 0, SendReferrer);
         else
             openNewWindow(result.absoluteLinkURL(), frame);
         break;
diff --git a/WebCore/svg/SVGAElement.cpp b/WebCore/svg/SVGAElement.cpp
index a804efc..7cb7b3e 100644
--- a/WebCore/svg/SVGAElement.cpp
+++ b/WebCore/svg/SVGAElement.cpp
@@ -33,6 +33,7 @@
 #include "EventNames.h"
 #include "Frame.h"
 #include "FrameLoader.h"
+#include "FrameLoaderTypes.h"
 #include "KeyboardEvent.h"
 #include "MappedAttribute.h"
 #include "MouseEvent.h"
@@ -154,7 +155,7 @@ void SVGAElement::defaultEventHandler(Event* evt)
             }
 #endif
             if (document()->frame())
-                document()->frame()->loader()->urlSelected(document()->completeURL(url), target, evt, false, false, true);
+                document()->frame()->loader()->urlSelected(document()->completeURL(url), target, evt, false, false, true, SendReferrer);
         }
 
         evt->setDefaultHandled();
diff --git a/WebKit/mac/ChangeLog b/WebKit/mac/ChangeLog
index 8772695..0a43975 100644
--- a/WebKit/mac/ChangeLog
+++ b/WebKit/mac/ChangeLog
@@ -1,3 +1,12 @@
+2009-10-19  Nate Chapin  <japhet at chromium.org>
+
+        Reviewed by Alexey Proskuryakov.
+
+        Update call to loadFrameRequest to match new parameters.
+
+        * WebView/WebPDFView.mm:
+        (-[WebPDFView PDFViewWillClickOnLink:withURL:]): Update call to loadFrameRequest.
+
 2009-10-19  David Kilzer  <ddkilzer at apple.com>
 
         Documentation fix for -[NSObject(WebResourceLoadDelegate) webView:resource:willSendRequest:redirectResponse:fromDataSource:]
diff --git a/WebKit/mac/WebView/WebPDFView.mm b/WebKit/mac/WebView/WebPDFView.mm
index dea3819..a38412e 100644
--- a/WebKit/mac/WebView/WebPDFView.mm
+++ b/WebKit/mac/WebView/WebPDFView.mm
@@ -953,7 +953,7 @@ static BOOL _PDFSelectionsAreEqual(PDFSelection *selectionA, PDFSelection *selec
     }
 
     // Call to the frame loader because this is where our security checks are made.
-    core([dataSource webFrame])->loader()->loadFrameRequest(ResourceRequest(URL), false, false, event.get(), 0);
+    core([dataSource webFrame])->loader()->loadFrameRequest(ResourceRequest(URL), false, false, event.get(), 0, SendReferrer);
 }
 
 - (void)PDFViewOpenPDFInNativeApplication:(PDFView *)sender

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list