Changeset 207840 in webkit
- Timestamp:
- Oct 25, 2016 1:17:36 PM (7 years ago)
- Location:
- trunk
- Files:
-
- 5 added
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r207839 r207840 1 2016-10-25 Andy Estes <aestes@apple.com> 2 3 Implement rel=noopener 4 https://bugs.webkit.org/show_bug.cgi?id=155166 5 <rdar://problem/25193787> 6 7 Reviewed by Brent Fulgham. 8 9 * fast/dom/DOMTokenList-supports-expected.txt: 10 * fast/dom/DOMTokenList-supports.html: 11 * fast/dom/Window/a-rel-noopener-expected.txt: Added. 12 * fast/dom/Window/a-rel-noopener.html: Added. 13 * fast/dom/Window/area-rel-noopener-expected.txt: Added. 14 * fast/dom/Window/area-rel-noopener.html: Added. 15 * fast/dom/Window/resources/rel-noopener.js: Added. 16 1 17 2016-10-25 Eric Carlson <eric.carlson@apple.com> 2 18 -
trunk/LayoutTests/fast/dom/DOMTokenList-supports-expected.txt
r206561 r207840 22 22 PASS anchor.relList.supports(anchorRelSupportedValues[i]) is true 23 23 PASS anchor.relList.supports(anchorRelSupportedValues[i].toUpperCase()) is true 24 PASS anchor.relList.supports(anchorRelSupportedValues[i]) is true 25 PASS anchor.relList.supports(anchorRelSupportedValues[i].toUpperCase()) is true 24 26 PASS anchor.relList.supports('unsupported') is false 25 27 26 28 * HTMLAreaElement.relList 27 29 PASS area.relList.__proto__ is DOMTokenList.prototype 30 PASS area.relList.supports(areaRelSupportedValues[i]) is true 31 PASS area.relList.supports(areaRelSupportedValues[i].toUpperCase()) is true 28 32 PASS area.relList.supports(areaRelSupportedValues[i]) is true 29 33 PASS area.relList.supports(areaRelSupportedValues[i].toUpperCase()) is true -
trunk/LayoutTests/fast/dom/DOMTokenList-supports.html
r206561 r207840 23 23 var anchor = document.createElement("a"); 24 24 shouldBe("anchor.relList.__proto__", "DOMTokenList.prototype"); 25 var anchorRelSupportedValues = ["noreferrer" ];25 var anchorRelSupportedValues = ["noreferrer", "noopener"]; 26 26 for (var i = 0; i < anchorRelSupportedValues.length; i++) { 27 27 shouldBeTrue("anchor.relList.supports(anchorRelSupportedValues[i])"); … … 34 34 var area = document.createElement("area"); 35 35 shouldBe("area.relList.__proto__", "DOMTokenList.prototype"); 36 var areaRelSupportedValues = ["noreferrer" ];36 var areaRelSupportedValues = ["noreferrer", "noopener"]; 37 37 for (var i = 0; i < areaRelSupportedValues.length; i++) { 38 38 shouldBeTrue("area.relList.supports(areaRelSupportedValues[i])"); -
trunk/Source/WebCore/ChangeLog
r207839 r207840 1 2016-10-25 Andy Estes <aestes@apple.com> 2 3 Implement rel=noopener 4 https://bugs.webkit.org/show_bug.cgi?id=155166 5 <rdar://problem/25193787> 6 7 Reviewed by Brent Fulgham. 8 9 Added support for rel=noopener to a and area elements. 10 11 Tests: fast/dom/Window/a-rel-noopener.html 12 fast/dom/Window/area-rel-noopener.html 13 14 * html/HTMLAnchorElement.cpp: 15 (WebCore::HTMLAnchorElement::HTMLAnchorElement): Stopped initializing m_linkRelations to 0. 16 (WebCore::HTMLAnchorElement::parseAttribute): Declared static AtomicStrings for "noreferrer" 17 and "noopener", and created a SpaceSplitString from the rel attribute value to test for these 18 two values. 19 (WebCore::HTMLAnchorElement::hasRel): Updated to use OptionSet::contains(). 20 (WebCore::HTMLAnchorElement::relList): Added a check for "noopener". 21 (WebCore::HTMLAnchorElement::handleClick): Passed NewFrameOpenerPolicy::Suppress to 22 FrameLoader::urlSelected() if rel=noopener was specified. 23 * html/HTMLAnchorElement.h: Changed the Relation enum to an enum class, removed unused enum 24 values, and changed m_linkRelations from a 30-bit unsigned integer to an OptionSet<Relation> 25 (HTMLAnchorElement is still 128 bytes on 64-bit). 26 * loader/FrameLoader.cpp: 27 (WebCore::FrameLoader::urlSelected): Changed to only compute a NewFrameOpenerPolicy from the 28 referrer policy if an explicit NewFrameOpenerPolicy isn't specified. Removed the version of 29 urlSelected() that did not take a downloadAttribute parameter. 30 * loader/FrameLoader.h: Added an Optional<NewFrameOpenerPolicy> parameter to urlSelected(), 31 and set a default argument for downloadAttribute instead of having a second version of 32 urlSelected(). 33 1 34 2016-10-25 Eric Carlson <eric.carlson@apple.com> 2 35 -
trunk/Source/WebCore/html/HTMLAnchorElement.cpp
r207458 r207840 60 60 , m_hasRootEditableElementForSelectionOnMouseDown(false) 61 61 , m_wasShiftKeyDownOnMouseDown(false) 62 , m_linkRelations(0)63 62 , m_cachedVisitedLinkHash(0) 64 63 { … … 251 250 } else if (name == relAttr) { 252 251 // Update HTMLAnchorElement::relList() if more rel attributes values are supported. 253 if (SpaceSplitString::spaceSplitStringContainsValue(value, "noreferrer", true)) 254 m_linkRelations |= RelationNoReferrer; 252 static NeverDestroyed<AtomicString> noReferrer("noreferrer", AtomicString::ConstructFromLiteral); 253 static NeverDestroyed<AtomicString> noOpener("noopener", AtomicString::ConstructFromLiteral); 254 const bool shouldFoldCase = true; 255 SpaceSplitString relValue(value, shouldFoldCase); 256 if (relValue.contains(noReferrer)) 257 m_linkRelations |= Relation::NoReferrer; 258 if (relValue.contains(noOpener)) 259 m_linkRelations |= Relation::NoOpener; 255 260 if (m_relList) 256 261 m_relList->associatedAttributeValueChanged(value); … … 297 302 } 298 303 299 bool HTMLAnchorElement::hasRel( uint32_trelation) const300 { 301 return m_linkRelations & relation;304 bool HTMLAnchorElement::hasRel(Relation relation) const 305 { 306 return m_linkRelations.contains(relation); 302 307 } 303 308 … … 306 311 if (!m_relList) 307 312 m_relList = std::make_unique<DOMTokenList>(*this, HTMLNames::relAttr, [](StringView token) { 308 return equalIgnoringASCIICase(token, "noreferrer") ;313 return equalIgnoringASCIICase(token, "noreferrer") || equalIgnoringASCIICase(token, "noopener"); 309 314 }); 310 315 return *m_relList; … … 390 395 #endif 391 396 392 frame->loader().urlSelected(completedURL, target(), &event, LockHistory::No, LockBackForwardList::No, hasRel(RelationNoReferrer) ? NeverSendReferrer : MaybeSendReferrer, document().shouldOpenExternalURLsPolicyToPropagate(), downloadAttribute); 397 ShouldSendReferrer shouldSendReferrer = hasRel(Relation::NoReferrer) ? NeverSendReferrer : MaybeSendReferrer; 398 auto newFrameOpenerPolicy = hasRel(Relation::NoOpener) ? makeOptional(NewFrameOpenerPolicy::Suppress) : Nullopt; 399 frame->loader().urlSelected(completedURL, target(), &event, LockHistory::No, LockBackForwardList::No, shouldSendReferrer, document().shouldOpenExternalURLsPolicyToPropagate(), newFrameOpenerPolicy, downloadAttribute); 393 400 394 401 sendPings(completedURL); -
trunk/Source/WebCore/html/HTMLAnchorElement.h
r205249 r207840 3 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 4 4 * (C) 2000 Simon Hausmann <hausmann@kde.org> 5 * Copyright (C) 2007 , 2008, 2009, 2010Apple Inc. All rights reserved.5 * Copyright (C) 2007-2016 Apple Inc. All rights reserved. 6 6 * 7 7 * This library is free software; you can redistribute it and/or … … 28 28 #include "LinkHash.h" 29 29 #include "URLUtils.h" 30 #include <wtf/OptionSet.h> 30 31 31 32 namespace WebCore { … … 34 35 35 36 // Link relation bitmask values. 36 // FIXME: Uncomment as the various link relations are implemented. 37 enum { 38 // RelationAlternate = 0x00000001, 39 // RelationArchives = 0x00000002, 40 // RelationAuthor = 0x00000004, 41 // RelationBoomark = 0x00000008, 42 // RelationExternal = 0x00000010, 43 // RelationFirst = 0x00000020, 44 // RelationHelp = 0x00000040, 45 // RelationIndex = 0x00000080, 46 // RelationLast = 0x00000100, 47 // RelationLicense = 0x00000200, 48 // RelationNext = 0x00000400, 49 // RelationNoFolow = 0x00000800, 50 RelationNoReferrer = 0x00001000, 51 // RelationPrev = 0x00002000, 52 // RelationSearch = 0x00004000, 53 // RelationSidebar = 0x00008000, 54 // RelationTag = 0x00010000, 55 // RelationUp = 0x00020000, 37 enum class Relation { 38 NoReferrer = 1 << 0, 39 NoOpener = 1 << 1, 56 40 }; 57 41 … … 77 61 bool willRespondToMouseClickEvents() final; 78 62 79 bool hasRel( uint32_t relation) const;63 bool hasRel(Relation) const; 80 64 81 65 LinkHash visitedLinkHash() const; … … 118 102 void clearRootEditableElementForSelectionOnMouseDown(); 119 103 120 bool m_hasRootEditableElementForSelectionOnMouseDown : 1;121 bool m_wasShiftKeyDownOnMouseDown : 1;122 uint32_t m_linkRelations : 30;104 bool m_hasRootEditableElementForSelectionOnMouseDown; 105 bool m_wasShiftKeyDownOnMouseDown; 106 OptionSet<Relation> m_linkRelations; 123 107 mutable LinkHash m_cachedVisitedLinkHash; 124 108 -
trunk/Source/WebCore/loader/FrameLoader.cpp
r207086 r207840 346 346 } 347 347 348 void FrameLoader::urlSelected(const URL& url, const String& passedTarget, Event* triggeringEvent, LockHistory lockHistory, LockBackForwardList lockBackForwardList, ShouldSendReferrer shouldSendReferrer, ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy, const AtomicString& downloadAttribute) 349 { 350 NewFrameOpenerPolicy newFrameOpenerPolicy = shouldSendReferrer == NeverSendReferrer ? NewFrameOpenerPolicy::Suppress : NewFrameOpenerPolicy::Allow; 351 348 void FrameLoader::urlSelected(const URL& url, const String& passedTarget, Event* triggeringEvent, LockHistory lockHistory, LockBackForwardList lockBackForwardList, ShouldSendReferrer shouldSendReferrer, ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy, Optional<NewFrameOpenerPolicy> openerPolicy, const AtomicString& downloadAttribute) 349 { 350 NewFrameOpenerPolicy newFrameOpenerPolicy = openerPolicy.valueOr(shouldSendReferrer == NeverSendReferrer ? NewFrameOpenerPolicy::Suppress : NewFrameOpenerPolicy::Allow); 352 351 urlSelected(FrameLoadRequest(m_frame.document()->securityOrigin(), ResourceRequest(url), passedTarget, lockHistory, lockBackForwardList, shouldSendReferrer, AllowNavigationToInvalidURL::Yes, newFrameOpenerPolicy, DoNotReplaceDocumentIfJavaScriptURL, shouldOpenExternalURLsPolicy, downloadAttribute), triggeringEvent); 353 }354 355 void FrameLoader::urlSelected(const URL& url, const String& passedTarget, Event* triggeringEvent, LockHistory lockHistory, LockBackForwardList lockBackForwardList, ShouldSendReferrer shouldSendReferrer, ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy)356 {357 NewFrameOpenerPolicy newFrameOpenerPolicy = shouldSendReferrer == NeverSendReferrer ? NewFrameOpenerPolicy::Suppress : NewFrameOpenerPolicy::Allow;358 359 urlSelected(FrameLoadRequest(m_frame.document()->securityOrigin(), ResourceRequest(url), passedTarget, lockHistory, lockBackForwardList, shouldSendReferrer, AllowNavigationToInvalidURL::Yes, newFrameOpenerPolicy, DoNotReplaceDocumentIfJavaScriptURL, shouldOpenExternalURLsPolicy, nullAtom), triggeringEvent);360 352 } 361 353 -
trunk/Source/WebCore/loader/FrameLoader.h
r207086 r207840 120 120 121 121 void changeLocation(const FrameLoadRequest&); 122 WEBCORE_EXPORT void urlSelected(const URL&, const String& target, Event*, LockHistory, LockBackForwardList, ShouldSendReferrer, ShouldOpenExternalURLsPolicy, const AtomicString& downloadAttribute); 123 WEBCORE_EXPORT void urlSelected(const URL&, const String& target, Event*, LockHistory, LockBackForwardList, ShouldSendReferrer, ShouldOpenExternalURLsPolicy); 122 WEBCORE_EXPORT void urlSelected(const URL&, const String& target, Event*, LockHistory, LockBackForwardList, ShouldSendReferrer, ShouldOpenExternalURLsPolicy, Optional<NewFrameOpenerPolicy> = Nullopt, const AtomicString& downloadAttribute = nullAtom); 124 123 void submitForm(PassRefPtr<FormSubmission>); 125 124
Note: See TracChangeset
for help on using the changeset viewer.