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