1926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/*
2926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Copyright (C) 2012 Google Inc. All rights reserved.
3926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *
4926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without
5926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * modification, are permitted provided that the following conditions are
6926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * met:
7926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *
8926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *     * Redistributions of source code must retain the above copyright
9926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * notice, this list of conditions and the following disclaimer.
10926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *     * Redistributions in binary form must reproduce the above
11926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
12926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * in the documentation and/or other materials provided with the
13926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * distribution.
14926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
15926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * contributors may be used to endorse or promote products derived from
16926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * this software without specific prior written permission.
17926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *
18926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */
30926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
31926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#include "config.h"
32926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
339e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)#include "core/testing/URLTestHelpers.h"
34f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebCache.h"
35f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebDocument.h"
36f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebElement.h"
37f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebFrame.h"
38f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebNode.h"
39f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebNodeList.h"
40f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebPrerendererClient.h"
41f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebScriptSource.h"
42f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebView.h"
43f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebViewClient.h"
44f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/tests/FrameTestHelpers.h"
45926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
465267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/Platform.h"
475267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebPrerender.h"
485267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebPrerenderingSupport.h"
495267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebString.h"
505267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebUnitTestSupport.h"
51591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/OwnPtr.h"
52f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include <functional>
53f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include <gtest/gtest.h>
54f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include <list>
55926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
5651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)using namespace blink;
5751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)using blink::URLTestHelpers::toKURL;
58926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)namespace {
60926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
61926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebURL toWebURL(const char* url)
62926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return WebURL(toKURL(url));
64926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
65926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
66926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class TestPrerendererClient : public WebPrerendererClient {
67926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)public:
68926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    TestPrerendererClient() { }
69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual ~TestPrerendererClient() { }
70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void setExtraDataForNextPrerender(WebPrerender::ExtraData* extraData)
72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
73926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(!m_extraData);
74926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_extraData = adoptPtr(extraData);
75926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
76926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
77926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WebPrerender releaseWebPrerender()
78926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
79926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(!m_webPrerenders.empty());
80926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        WebPrerender retval(m_webPrerenders.front());
81926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_webPrerenders.pop_front();
82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return retval;
83926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
8402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
85926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool empty() const
86926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
87926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return m_webPrerenders.empty();
88926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
89926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
90926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void clear()
91926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
92926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_webPrerenders.clear();
93926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
94926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
95926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)private:
96926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // From WebPrerendererClient:
97926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual void willAddPrerender(WebPrerender* prerender) OVERRIDE
98926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        prerender->setExtraData(m_extraData.leakPtr());
100926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
101926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(!prerender->isNull());
102926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_webPrerenders.push_back(*prerender);
103926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
105926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    OwnPtr<WebPrerender::ExtraData> m_extraData;
106926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    std::list<WebPrerender> m_webPrerenders;
107926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)};
108926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
109926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class TestPrerenderingSupport : public WebPrerenderingSupport {
110926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)public:
111926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    TestPrerenderingSupport()
112926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
113926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        initialize(this);
114926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
115926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual ~TestPrerenderingSupport()
117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
118926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        shutdown();
119926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
120926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
121926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void clear()
122926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_addedPrerenders.clear();
124926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_canceledPrerenders.clear();
125926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_abandonedPrerenders.clear();
126926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
128926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    size_t totalCount() const
129926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
130926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return m_addedPrerenders.size() + m_canceledPrerenders.size() + m_abandonedPrerenders.size();
131926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
13202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
133926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    size_t addCount(const WebPrerender& prerender) const
134926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return std::count_if(m_addedPrerenders.begin(), m_addedPrerenders.end(), std::bind1st(WebPrerenderEqual(), prerender));
136926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
138926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    size_t cancelCount(const WebPrerender& prerender) const
139926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
140926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return std::count_if(m_canceledPrerenders.begin(), m_canceledPrerenders.end(), std::bind1st(WebPrerenderEqual(), prerender));
141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
142926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
143926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    size_t abandonCount(const WebPrerender& prerender) const
144926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
145926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return std::count_if(m_abandonedPrerenders.begin(), m_abandonedPrerenders.end(), std::bind1st(WebPrerenderEqual(), prerender));
146926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
147926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
148926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)private:
149926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    class WebPrerenderEqual : public std::binary_function<WebPrerender, WebPrerender, bool> {
150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    public:
151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        bool operator()(const WebPrerender& first, const WebPrerender& second) const
152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        {
153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return first.toPrerender() == second.toPrerender();
154926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
155926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    };
156926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
157926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // From WebPrerenderingSupport:
158926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual void add(const WebPrerender& prerender) OVERRIDE
159926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
160926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_addedPrerenders.push_back(prerender);
161926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
162926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
163926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual void cancel(const WebPrerender& prerender) OVERRIDE
164926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
165926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_canceledPrerenders.push_back(prerender);
166926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
167926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
168926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual void abandon(const WebPrerender& prerender) OVERRIDE
169926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
170926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_abandonedPrerenders.push_back(prerender);
171926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
172926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
173926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    std::vector<WebPrerender> m_addedPrerenders;
174926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    std::vector<WebPrerender> m_canceledPrerenders;
175926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    std::vector<WebPrerender> m_abandonedPrerenders;
176926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)};
177926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
178926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class PrerenderingTest : public testing::Test {
179926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)public:
180926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ~PrerenderingTest()
181926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
182926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        Platform::current()->unitTestSupport()->unregisterAllMockedURLs();
183926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
18402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
185926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void initialize(const char* baseURL, const char* fileName)
186926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
187926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(baseURL), WebString::fromUTF8(fileName));
188926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        const bool RunJavascript = true;
1891e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        m_webViewHelper.initialize(RunJavascript);
1901e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        m_webViewHelper.webView()->setPrerendererClient(&m_prerendererClient);
191926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1921e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        FrameTestHelpers::loadFrame(m_webViewHelper.webView()->mainFrame(), std::string(baseURL) + fileName);
193926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
194926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
195926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void navigateAway()
196926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
1971e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        FrameTestHelpers::loadFrame(m_webViewHelper.webView()->mainFrame(), "about:blank");
198926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
199926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
200926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void close()
201926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
2021e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        m_webViewHelper.webView()->mainFrame()->collectGarbage();
2031e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        m_webViewHelper.reset();
204926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
205926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        WebCache::clear();
206926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
207926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
208926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WebElement console()
209926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
2101e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        WebElement console = m_webViewHelper.webView()->mainFrame()->document().getElementById("console");
211926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(console.nodeName() == "UL");
212926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return console;
213926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
214926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
215926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    unsigned consoleLength()
216926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
217926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return console().childNodes().length() - 1;
218926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
219926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
220926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    std::string consoleAt(unsigned i)
221926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
222926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(consoleLength() > i);
223926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
224926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        WebNode consoleListItem = console().childNodes().item(1 + i);
225926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(consoleListItem.nodeName() == "LI");
226926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(consoleListItem.hasChildNodes());
227926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
228926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        WebNode textNode = consoleListItem.firstChild();
229926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(textNode.nodeName() == "#text");
23002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
231926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return textNode.nodeValue().utf8().data();
232926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
233926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
234926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void executeScript(const char* code)
235926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
2361e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        m_webViewHelper.webView()->mainFrame()->executeScript(WebScriptSource(WebString::fromUTF8(code)));
237926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
238926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
239926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    TestPrerenderingSupport* prerenderingSupport()
240926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
241926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return &m_prerenderingSupport;
242926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
243926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
244926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    TestPrerendererClient* prerendererClient()
245926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
246926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return &m_prerendererClient;
247926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
248926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
249926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)private:
250926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    TestPrerenderingSupport m_prerenderingSupport;
251926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    TestPrerendererClient m_prerendererClient;
252926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2531e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    FrameTestHelpers::WebViewHelper m_webViewHelper;
254926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)};
255926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
256926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)TEST_F(PrerenderingTest, SinglePrerender)
257926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
258926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    initialize("http://www.foo.com/", "prerender/single_prerender.html");
259926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
260926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WebPrerender webPrerender = prerendererClient()->releaseWebPrerender();
261926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_FALSE(webPrerender.isNull());
262926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(toWebURL("http://prerender.com/"), webPrerender.url());
26309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(PrerenderRelTypePrerender, webPrerender.relTypes());
264926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
265926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(1u, prerenderingSupport()->addCount(webPrerender));
266926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(1u, prerenderingSupport()->totalCount());
267926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
268926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    webPrerender.didStartPrerender();
269926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(1u, consoleLength());
270926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ("webkitprerenderstart", consoleAt(0));
271926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
272926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    webPrerender.didSendDOMContentLoadedForPrerender();
273926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(2u, consoleLength());
274926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ("webkitprerenderdomcontentloaded", consoleAt(1));
275926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
276926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    webPrerender.didSendLoadForPrerender();
277926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(3u, consoleLength());
278926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ("webkitprerenderload", consoleAt(2));
279926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
280926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    webPrerender.didStopPrerender();
281926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(4u, consoleLength());
282926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ("webkitprerenderstop", consoleAt(3));
283926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
284926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
285926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)TEST_F(PrerenderingTest, CancelPrerender)
286926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
287926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    initialize("http://www.foo.com/", "prerender/single_prerender.html");
288926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
289926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WebPrerender webPrerender = prerendererClient()->releaseWebPrerender();
290926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_FALSE(webPrerender.isNull());
291926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
292926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(1u, prerenderingSupport()->addCount(webPrerender));
293926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(1u, prerenderingSupport()->totalCount());
294926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
295926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    executeScript("removePrerender()");
29602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
297926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(1u, prerenderingSupport()->cancelCount(webPrerender));
298926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(2u, prerenderingSupport()->totalCount());
299926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
300926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
301926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)TEST_F(PrerenderingTest, AbandonPrerender)
302926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
303926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    initialize("http://www.foo.com/", "prerender/single_prerender.html");
304926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
305926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WebPrerender webPrerender = prerendererClient()->releaseWebPrerender();
306926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_FALSE(webPrerender.isNull());
307926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
308926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(1u, prerenderingSupport()->addCount(webPrerender));
309926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(1u, prerenderingSupport()->totalCount());
310926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
311926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    navigateAway();
31202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
313926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(1u, prerenderingSupport()->abandonCount(webPrerender));
314926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(2u, prerenderingSupport()->totalCount());
315f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
316f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    // Check that the prerender does not emit an extra cancel when garbage-collecting everything.
317f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    close();
318f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
319f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    EXPECT_EQ(2u, prerenderingSupport()->totalCount());
320926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
321926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
322926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)TEST_F(PrerenderingTest, ExtraData)
323926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
324926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    class TestExtraData : public WebPrerender::ExtraData {
325926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    public:
326926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        explicit TestExtraData(bool* alive) : m_alive(alive)
327926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        {
328926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            *alive = true;
329926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
330926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
331926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        virtual ~TestExtraData() { *m_alive = false; }
332926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
333926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    private:
334926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        bool* m_alive;
335926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    };
336926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
337926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool alive = false;
338926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
339926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        prerendererClient()->setExtraDataForNextPrerender(new TestExtraData(&alive));
340926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        initialize("http://www.foo.com/", "prerender/single_prerender.html");
341926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        EXPECT_TRUE(alive);
342926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
343926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        WebPrerender webPrerender = prerendererClient()->releaseWebPrerender();
344926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
345926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        executeScript("removePrerender()");
346926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        close();
347926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        prerenderingSupport()->clear();
348926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
349926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_FALSE(alive);
350926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
351926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
352926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)TEST_F(PrerenderingTest, TwoPrerenders)
353926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
354926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    initialize("http://www.foo.com/", "prerender/multiple_prerenders.html");
35502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
356926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WebPrerender firstPrerender = prerendererClient()->releaseWebPrerender();
357926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_FALSE(firstPrerender.isNull());
358926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(toWebURL("http://first-prerender.com/"), firstPrerender.url());
359926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
360926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WebPrerender secondPrerender = prerendererClient()->releaseWebPrerender();
361926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_FALSE(firstPrerender.isNull());
362926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(toWebURL("http://second-prerender.com/"), secondPrerender.url());
363926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
364926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(1u, prerenderingSupport()->addCount(firstPrerender));
365926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(1u, prerenderingSupport()->addCount(secondPrerender));
366926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(2u, prerenderingSupport()->totalCount());
367926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
368926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    firstPrerender.didStartPrerender();
369926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(1u, consoleLength());
370926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ("first_webkitprerenderstart", consoleAt(0));
371926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
372926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    secondPrerender.didStartPrerender();
373926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(2u, consoleLength());
374926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ("second_webkitprerenderstart", consoleAt(1));
375926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
376926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
377926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)TEST_F(PrerenderingTest, TwoPrerendersRemovingFirstThenNavigating)
378926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
379926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    initialize("http://www.foo.com/", "prerender/multiple_prerenders.html");
38002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
381926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WebPrerender firstPrerender = prerendererClient()->releaseWebPrerender();
382926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WebPrerender secondPrerender = prerendererClient()->releaseWebPrerender();
383926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
384926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(1u, prerenderingSupport()->addCount(firstPrerender));
385926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(1u, prerenderingSupport()->addCount(secondPrerender));
386926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(2u, prerenderingSupport()->totalCount());
387926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
388926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    executeScript("removeFirstPrerender()");
389926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
390926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(1u, prerenderingSupport()->cancelCount(firstPrerender));
391926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(3u, prerenderingSupport()->totalCount());
392926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
393926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    navigateAway();
394926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
395926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(1u, prerenderingSupport()->abandonCount(secondPrerender));
396f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    EXPECT_EQ(4u, prerenderingSupport()->totalCount());
397926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
398926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
399926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)TEST_F(PrerenderingTest, TwoPrerendersAddingThird)
400926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
401926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    initialize("http://www.foo.com/", "prerender/multiple_prerenders.html");
40202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
403926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WebPrerender firstPrerender = prerendererClient()->releaseWebPrerender();
404926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WebPrerender secondPrerender = prerendererClient()->releaseWebPrerender();
405926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
406926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(1u, prerenderingSupport()->addCount(firstPrerender));
407926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(1u, prerenderingSupport()->addCount(secondPrerender));
408926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(2u, prerenderingSupport()->totalCount());
409926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
410926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    executeScript("addThirdPrerender()");
411926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
412926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WebPrerender thirdPrerender = prerendererClient()->releaseWebPrerender();
413926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(1u, prerenderingSupport()->addCount(thirdPrerender));
414926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(3u, prerenderingSupport()->totalCount());
415926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
416926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
417926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)TEST_F(PrerenderingTest, ShortLivedClient)
418926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
419926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    initialize("http://www.foo.com/", "prerender/single_prerender.html");
420926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
421926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WebPrerender webPrerender = prerendererClient()->releaseWebPrerender();
422926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_FALSE(webPrerender.isNull());
423926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
424926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(1u, prerenderingSupport()->addCount(webPrerender));
425926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(1u, prerenderingSupport()->totalCount());
426926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
427926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    navigateAway();
428926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    close();
429926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
430926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // This test passes if this next line doesn't crash.
431926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    webPrerender.didStartPrerender();
432926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
433926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
434926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)TEST_F(PrerenderingTest, FastRemoveElement)
435926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
436926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    initialize("http://www.foo.com/", "prerender/single_prerender.html");
437926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
438926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WebPrerender webPrerender = prerendererClient()->releaseWebPrerender();
439926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_FALSE(webPrerender.isNull());
440926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
441926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(1u, prerenderingSupport()->addCount(webPrerender));
442926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(1u, prerenderingSupport()->totalCount());
443926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
444926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Race removing & starting the prerender against each other, as if the element was removed very quickly.
445926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    executeScript("removePrerender()");
446926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_FALSE(webPrerender.isNull());
447926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    webPrerender.didStartPrerender();
448926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
449926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // The page should be totally disconnected from the Prerender at this point, so the console should not have updated.
450926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EXPECT_EQ(0u, consoleLength());
451926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
452926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
45353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)TEST_F(PrerenderingTest, MutateTarget)
45453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
45553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    initialize("http://www.foo.com/", "prerender/single_prerender.html");
45653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
45753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    WebPrerender webPrerender = prerendererClient()->releaseWebPrerender();
45853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_FALSE(webPrerender.isNull());
45953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ(toWebURL("http://prerender.com/"), webPrerender.url());
46053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
46153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ(1u, prerenderingSupport()->addCount(webPrerender));
46253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ(0u, prerenderingSupport()->cancelCount(webPrerender));
46353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ(1u, prerenderingSupport()->totalCount());
46453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
46553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // Change the href of this prerender, make sure this is treated as a remove and add.
46653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    executeScript("mutateTarget()");
46753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ(1u, prerenderingSupport()->cancelCount(webPrerender));
46853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
46953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    WebPrerender mutatedPrerender = prerendererClient()->releaseWebPrerender();
47053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ(toWebURL("http://mutated.com/"), mutatedPrerender.url());
47153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ(1u, prerenderingSupport()->addCount(webPrerender));
47253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ(1u, prerenderingSupport()->addCount(mutatedPrerender));
47353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ(3u, prerenderingSupport()->totalCount());
47453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
47553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
47653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)TEST_F(PrerenderingTest, MutateRel)
47753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
47853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    initialize("http://www.foo.com/", "prerender/single_prerender.html");
47953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
48053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    WebPrerender webPrerender = prerendererClient()->releaseWebPrerender();
48153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_FALSE(webPrerender.isNull());
48253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ(toWebURL("http://prerender.com/"), webPrerender.url());
48353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
48453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ(1u, prerenderingSupport()->addCount(webPrerender));
48553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ(0u, prerenderingSupport()->cancelCount(webPrerender));
48653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ(1u, prerenderingSupport()->totalCount());
48753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
48853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // Change the rel of this prerender, make sure this is treated as a remove.
48953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    executeScript("mutateRel()");
49053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ(1u, prerenderingSupport()->cancelCount(webPrerender));
49153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EXPECT_EQ(2u, prerenderingSupport()->totalCount());
49253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
49353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
49409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)TEST_F(PrerenderingTest, RelNext)
49509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
49609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    initialize("http://www.foo.com/", "prerender/rel_next_prerender.html");
49709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
49809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    WebPrerender relNextOnly = prerendererClient()->releaseWebPrerender();
49909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(toWebURL("http://rel-next-only.com/"), relNextOnly.url());
50009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(PrerenderRelTypeNext, relNextOnly.relTypes());
50109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
50209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    WebPrerender relNextAndPrerender = prerendererClient()->releaseWebPrerender();
50309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(toWebURL("http://rel-next-and-prerender.com/"), relNextAndPrerender.url());
50409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(static_cast<unsigned>(PrerenderRelTypeNext | PrerenderRelTypePrerender), relNextAndPrerender.relTypes());
50509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
50609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
507926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} // namespace
508