109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)/*
209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * Copyright (c) 2014, Google Inc. All rights reserved.
309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) *
409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * modification, are permitted provided that the following conditions are
609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * met:
709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) *
809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) *     * Redistributions of source code must retain the above copyright
909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * notice, this list of conditions and the following disclaimer.
1009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) *     * Redistributions in binary form must reproduce the above
1109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
1209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * in the documentation and/or other materials provided with the
1309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * distribution.
1409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
1509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * contributors may be used to endorse or promote products derived from
1609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * this software without specific prior written permission.
1709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) *
1809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) */
3009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
3109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "config.h"
3209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/dom/Document.h"
3309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
34d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "core/html/HTMLHeadElement.h"
35d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "core/html/HTMLLinkElement.h"
3609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/testing/DummyPageHolder.h"
37c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "platform/heap/Handle.h"
3809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include <gmock/gmock.h>
3909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include <gtest/gtest.h>
4009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
41c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)using namespace blink;
4209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
4309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)namespace {
4409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
4509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class DocumentTest : public ::testing::Test {
4609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)protected:
4709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void SetUp() OVERRIDE;
4809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
49c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#if ENABLE(OILPAN)
50c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    virtual void TearDown() OVERRIDE
51c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
52c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        Heap::collectAllGarbage();
53c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
54c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#endif
55c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
5609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Document& document() const { return m_dummyPageHolder->document(); }
5709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Page& page() const { return m_dummyPageHolder->page(); }
5809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
5909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)private:
6009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    OwnPtr<DummyPageHolder> m_dummyPageHolder;
6109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)};
6209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
6309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void DocumentTest::SetUp()
6409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
6509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_dummyPageHolder = DummyPageHolder::create(IntSize(800, 600));
6609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
6709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
68f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuclass MockDocumentVisibilityObserver
69f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    : public NoBaseWillBeGarbageCollectedFinalized<MockDocumentVisibilityObserver>
70f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    , public DocumentVisibilityObserver {
71f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(MockDocumentVisibilityObserver);
7209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)public:
73f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    static PassOwnPtrWillBeRawPtr<MockDocumentVisibilityObserver> create(Document& document)
74f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    {
75f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return adoptPtrWillBeNoop(new MockDocumentVisibilityObserver(document));
76f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    }
77f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
78f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    virtual void trace(Visitor*) { }
7909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
8009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    MOCK_METHOD1(didChangeVisibilityState, void(PageVisibilityState));
81f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
82f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuprivate:
83f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    MockDocumentVisibilityObserver(Document& document) : DocumentVisibilityObserver(document) { }
8409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)};
8509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
8609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)TEST_F(DocumentTest, VisibilityOberver)
8709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
8809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    page().setVisibilityState(PageVisibilityStateVisible, true); // initial state
89f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    OwnPtrWillBeRawPtr<MockDocumentVisibilityObserver> observer1 = MockDocumentVisibilityObserver::create(document());
9009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
9109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
92f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        OwnPtrWillBeRawPtr<MockDocumentVisibilityObserver> observer2 = MockDocumentVisibilityObserver::create(document());
93f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        EXPECT_CALL(*observer1, didChangeVisibilityState(PageVisibilityStateHidden)).Times(0);
94f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        EXPECT_CALL(*observer1, didChangeVisibilityState(PageVisibilityStateVisible)).Times(0);
95f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        EXPECT_CALL(*observer2, didChangeVisibilityState(PageVisibilityStateHidden)).Times(0);
96f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        EXPECT_CALL(*observer2, didChangeVisibilityState(PageVisibilityStateVisible)).Times(0);
97f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        ::testing::Mock::VerifyAndClearExpectations(observer1.get());
98f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        ::testing::Mock::VerifyAndClearExpectations(observer2.get());
99f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
100f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        EXPECT_CALL(*observer1, didChangeVisibilityState(PageVisibilityStateHidden)).Times(1);
101f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        EXPECT_CALL(*observer1, didChangeVisibilityState(PageVisibilityStateVisible)).Times(0);
102f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        EXPECT_CALL(*observer2, didChangeVisibilityState(PageVisibilityStateHidden)).Times(1);
103f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        EXPECT_CALL(*observer2, didChangeVisibilityState(PageVisibilityStateVisible)).Times(0);
10409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        page().setVisibilityState(PageVisibilityStateHidden, false);
105f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        ::testing::Mock::VerifyAndClearExpectations(observer1.get());
106f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        ::testing::Mock::VerifyAndClearExpectations(observer2.get());
10709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
108f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        EXPECT_CALL(*observer1, didChangeVisibilityState(PageVisibilityStateHidden)).Times(0);
109f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        EXPECT_CALL(*observer1, didChangeVisibilityState(PageVisibilityStateVisible)).Times(0);
110f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        EXPECT_CALL(*observer2, didChangeVisibilityState(PageVisibilityStateHidden)).Times(0);
111f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        EXPECT_CALL(*observer2, didChangeVisibilityState(PageVisibilityStateVisible)).Times(0);
11209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        page().setVisibilityState(PageVisibilityStateHidden, false);
113f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        ::testing::Mock::VerifyAndClearExpectations(observer1.get());
114f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        ::testing::Mock::VerifyAndClearExpectations(observer2.get());
11509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
116f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        EXPECT_CALL(*observer1, didChangeVisibilityState(PageVisibilityStateHidden)).Times(0);
117f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        EXPECT_CALL(*observer1, didChangeVisibilityState(PageVisibilityStateVisible)).Times(1);
118f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        EXPECT_CALL(*observer2, didChangeVisibilityState(PageVisibilityStateHidden)).Times(0);
119f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        EXPECT_CALL(*observer2, didChangeVisibilityState(PageVisibilityStateVisible)).Times(0);
12009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        OwnPtr<DummyPageHolder> alternatePage = DummyPageHolder::create(IntSize(800, 600));
12109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        Document& alternateDocument = alternatePage->document();
122f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        observer2->setObservedDocument(alternateDocument);
12309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        page().setVisibilityState(PageVisibilityStateVisible, false);
124f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        ::testing::Mock::VerifyAndClearExpectations(observer1.get());
125f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        ::testing::Mock::VerifyAndClearExpectations(observer2.get());
126f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
127f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        EXPECT_CALL(*observer1, didChangeVisibilityState(PageVisibilityStateHidden)).Times(1);
128f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        EXPECT_CALL(*observer1, didChangeVisibilityState(PageVisibilityStateVisible)).Times(0);
129f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        EXPECT_CALL(*observer2, didChangeVisibilityState(PageVisibilityStateHidden)).Times(1);
130f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        EXPECT_CALL(*observer2, didChangeVisibilityState(PageVisibilityStateVisible)).Times(0);
131f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        observer2->setObservedDocument(document());
13209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        page().setVisibilityState(PageVisibilityStateHidden, false);
133f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        ::testing::Mock::VerifyAndClearExpectations(observer1.get());
134f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        ::testing::Mock::VerifyAndClearExpectations(observer2.get());
13509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
13609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
13709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // observer2 destroyed
138f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    EXPECT_CALL(*observer1, didChangeVisibilityState(PageVisibilityStateHidden)).Times(0);
139f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    EXPECT_CALL(*observer1, didChangeVisibilityState(PageVisibilityStateVisible)).Times(1);
14009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    page().setVisibilityState(PageVisibilityStateVisible, false);
14109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
14209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
143d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)// This test checks that Documunt::linkManifest() returns a value conform to the specification.
144d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)TEST_F(DocumentTest, LinkManifest)
145d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
146d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // Test the default result.
147d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_EQ(0, document().linkManifest());
148d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
149d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // Check that we use the first manifest with <link rel=manifest>
150d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<HTMLLinkElement> link = HTMLLinkElement::create(document(), false);
151c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    link->setAttribute(blink::HTMLNames::relAttr, "manifest");
152c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    link->setAttribute(blink::HTMLNames::hrefAttr, "foo.json");
153d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    document().head()->appendChild(link);
154d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_EQ(link, document().linkManifest());
155d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
156d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<HTMLLinkElement> link2 = HTMLLinkElement::create(document(), false);
157c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    link2->setAttribute(blink::HTMLNames::relAttr, "manifest");
158c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    link2->setAttribute(blink::HTMLNames::hrefAttr, "bar.json");
159d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    document().head()->insertBefore(link2, link.get());
160d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_EQ(link2, document().linkManifest());
161d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    document().head()->appendChild(link2);
162d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_EQ(link, document().linkManifest());
163d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
164d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // Check that crazy URLs are accepted.
165c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    link->setAttribute(blink::HTMLNames::hrefAttr, "http:foo.json");
166d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_EQ(link, document().linkManifest());
167d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
168d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // Check that empty URLs are accepted.
169c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    link->setAttribute(blink::HTMLNames::hrefAttr, "");
170d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_EQ(link, document().linkManifest());
171d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
172d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // Check that URLs from different origins are accepted.
173c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    link->setAttribute(blink::HTMLNames::hrefAttr, "http://example.org/manifest.json");
174d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_EQ(link, document().linkManifest());
175c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    link->setAttribute(blink::HTMLNames::hrefAttr, "http://foo.example.org/manifest.json");
176d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_EQ(link, document().linkManifest());
177c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    link->setAttribute(blink::HTMLNames::hrefAttr, "http://foo.bar/manifest.json");
178d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_EQ(link, document().linkManifest());
179d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
180d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // More than one token in @rel is accepted.
181c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    link->setAttribute(blink::HTMLNames::relAttr, "foo bar manifest");
182d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_EQ(link, document().linkManifest());
183d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
184d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // Such as spaces around the token.
185c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    link->setAttribute(blink::HTMLNames::relAttr, " manifest ");
186d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_EQ(link, document().linkManifest());
187d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
188d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // Check that rel=manifest actually matters.
189c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    link->setAttribute(blink::HTMLNames::relAttr, "");
190d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_EQ(link2, document().linkManifest());
191c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    link->setAttribute(blink::HTMLNames::relAttr, "manifest");
192d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
193d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // Check that link outside of the <head> are ignored.
194d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    document().head()->removeChild(link.get(), ASSERT_NO_EXCEPTION);
195d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    document().head()->removeChild(link2.get(), ASSERT_NO_EXCEPTION);
196d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_EQ(0, document().linkManifest());
197d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    document().body()->appendChild(link);
198d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_EQ(0, document().linkManifest());
199d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    document().head()->appendChild(link);
200d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    document().head()->appendChild(link2);
201d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
202d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // Check that some attribute values do not have an effect.
203c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    link->setAttribute(blink::HTMLNames::crossoriginAttr, "use-credentials");
204d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_EQ(link, document().linkManifest());
205c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    link->setAttribute(blink::HTMLNames::hreflangAttr, "klingon");
206d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_EQ(link, document().linkManifest());
207c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    link->setAttribute(blink::HTMLNames::typeAttr, "image/gif");
208d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_EQ(link, document().linkManifest());
209c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    link->setAttribute(blink::HTMLNames::sizesAttr, "16x16");
210d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_EQ(link, document().linkManifest());
211c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    link->setAttribute(blink::HTMLNames::mediaAttr, "print");
212d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EXPECT_EQ(link, document().linkManifest());
213d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
214d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
21509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} // unnamed namespace
216