1dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/* 2dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2010 Google Inc. All rights reserved. 3dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 4dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Redistribution and use in source and binary forms, with or without 5dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * modification, are permitted provided that the following conditions are 6dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * met: 7dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 8dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * * Redistributions of source code must retain the above copyright 9dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * notice, this list of conditions and the following disclaimer. 10dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * * Redistributions in binary form must reproduce the above 11dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * copyright notice, this list of conditions and the following disclaimer 12dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * in the documentation and/or other materials provided with the 13dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * distribution. 14dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * * Neither the name of Google Inc. nor the names of its 15dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * contributors may be used to endorse or promote products derived from 16dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * this software without specific prior written permission. 17dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 18dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */ 30dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 31dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "config.h" 32dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "TestNavigationController.h" 33dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 34dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "TestShell.h" 35dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <wtf/Assertions.h> 36dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 37dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockusing namespace WebKit; 38dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockusing namespace std; 39dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 40dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// ---------------------------------------------------------------------------- 41dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// TestNavigationEntry 42dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 43dd8bb3de4f353a81954234999f1fea748aee2ea9Ben MurdochPassRefPtr<TestNavigationEntry> TestNavigationEntry::create() 44dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{ 45dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch return adoptRef(new TestNavigationEntry); 46dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch} 47dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 48dd8bb3de4f353a81954234999f1fea748aee2ea9Ben MurdochPassRefPtr<TestNavigationEntry> TestNavigationEntry::create( 49dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch int pageID, const WebURL& url, const WebString& title, const WebString& targetFrame) 50dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{ 51dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch return adoptRef(new TestNavigationEntry(pageID, url, title, targetFrame)); 52dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch} 53dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 54dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockTestNavigationEntry::TestNavigationEntry() 55dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block : m_pageID(-1) {} 56dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 57dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockTestNavigationEntry::TestNavigationEntry( 58dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block int pageID, const WebURL& url, const WebString& title, const WebString& targetFrame) 59dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block : m_pageID(pageID) 60dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block , m_url(url) 61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block , m_title(title) 62dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block , m_targetFrame(targetFrame) {} 63dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 64dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockTestNavigationEntry::~TestNavigationEntry() {} 65dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 66dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid TestNavigationEntry::setContentState(const WebHistoryItem& state) 67dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 68dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_state = state; 69dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 70dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 71dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// ---------------------------------------------------------------------------- 72dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// TestNavigationController 73dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 74dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockTestNavigationController::TestNavigationController(NavigationHost* host) 75dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block : m_pendingEntry(0) 76dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block , m_lastCommittedEntryIndex(-1) 77dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block , m_pendingEntryIndex(-1) 78dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block , m_host(host) 79dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block , m_maxPageID(-1) {} 80dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 81dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockTestNavigationController::~TestNavigationController() 82dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 83dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block discardPendingEntry(); 84dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 85dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 86dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid TestNavigationController::reset() 87dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 88dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_entries.clear(); 89dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block discardPendingEntry(); 90dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 91dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_lastCommittedEntryIndex = -1; 92dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 93dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 94dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid TestNavigationController::reload() 95dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 96dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Base the navigation on where we are now... 97dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block int currentIndex = currentEntryIndex(); 98dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 99dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // If we are no where, then we can't reload. TODO(darin): We should add a 100dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // CanReload method. 101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (currentIndex == -1) 102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 103dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block discardPendingEntry(); 105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 106dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_pendingEntryIndex = currentIndex; 107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block navigateToPendingEntry(true); 108dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 109dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid TestNavigationController::goToOffset(int offset) 111dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 112dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block int index = m_lastCommittedEntryIndex + offset; 113dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (index < 0 || index >= entryCount()) 114dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 115dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block goToIndex(index); 117dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 119dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid TestNavigationController::goToIndex(int index) 120dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ASSERT(index >= 0); 122dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ASSERT(index < static_cast<int>(m_entries.size())); 123dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 124dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block discardPendingEntry(); 125dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 126dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_pendingEntryIndex = index; 127dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block navigateToPendingEntry(false); 128dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 129dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 130dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid TestNavigationController::loadEntry(TestNavigationEntry* entry) 131dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 132dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // When navigating to a new page, we don't know for sure if we will actually 133dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // end up leaving the current page. The new page load could for example 134dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // result in a download or a 'no content' response (e.g., a mailto: URL). 135dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block discardPendingEntry(); 136dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_pendingEntry = entry; 137dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block navigateToPendingEntry(false); 138dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 139dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 140dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 141dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockTestNavigationEntry* TestNavigationController::lastCommittedEntry() const 142dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 143dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_lastCommittedEntryIndex == -1) 144dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return 0; 145dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return m_entries[m_lastCommittedEntryIndex].get(); 146dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 147dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 148dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockTestNavigationEntry* TestNavigationController::activeEntry() const 149dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 150dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch TestNavigationEntry* entry = m_pendingEntry.get(); 151dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!entry) 152dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block entry = lastCommittedEntry(); 153dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return entry; 154dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 155dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 156dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockint TestNavigationController::currentEntryIndex() const 157dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 158dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_pendingEntryIndex != -1) 159dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return m_pendingEntryIndex; 160dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return m_lastCommittedEntryIndex; 161dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 162dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 163dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 164dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockTestNavigationEntry* TestNavigationController::entryAtIndex(int index) const 165dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 166dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (index < 0 || index >= entryCount()) 167dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return 0; 168dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return m_entries[index].get(); 169dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 170dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 171dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockTestNavigationEntry* TestNavigationController::entryWithPageID(int32_t pageID) const 172dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 173dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block int index = entryIndexWithPageID(pageID); 174dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return (index != -1) ? m_entries[index].get() : 0; 175dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 176dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 177dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid TestNavigationController::didNavigateToEntry(TestNavigationEntry* entry) 178dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 179dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // If the entry is that of a page with PageID larger than any this Tab has 180dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // seen before, then consider it a new navigation. 181dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (entry->pageID() > maxPageID()) { 182dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block insertEntry(entry); 183dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 184dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 185dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 186dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Otherwise, we just need to update an existing entry with matching PageID. 187dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // If the existing entry corresponds to the entry which is pending, then we 188dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // must update the current entry index accordingly. When navigating to the 189dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // same URL, a new PageID is not created. 190dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 191dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block int existingEntryIndex = entryIndexWithPageID(entry->pageID()); 192dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block TestNavigationEntry* existingEntry = (existingEntryIndex != -1) ? 193dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_entries[existingEntryIndex].get() : 0; 194dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!existingEntry) { 195dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // No existing entry, then simply ignore this navigation! 196dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch } else if (existingEntry == m_pendingEntry.get()) { 197dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // The given entry might provide a new URL... e.g., navigating back to a 198dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // page in session history could have resulted in a new client redirect. 199dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block existingEntry->setURL(entry->URL()); 200dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block existingEntry->setContentState(entry->contentState()); 201dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_lastCommittedEntryIndex = m_pendingEntryIndex; 202dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_pendingEntryIndex = -1; 203dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch m_pendingEntry.clear(); 204dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } else if (m_pendingEntry && m_pendingEntry->pageID() == -1 205dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block && GURL(m_pendingEntry->URL()) == GURL(existingEntry->URL().spec())) { 206dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Not a new navigation 207dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block discardPendingEntry(); 208dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } else { 209dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // The given entry might provide a new URL... e.g., navigating to a page 210dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // might result in a client redirect, which should override the URL of the 211dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // existing entry. 212dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block existingEntry->setURL(entry->URL()); 213dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block existingEntry->setContentState(entry->contentState()); 214dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 215dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // The navigation could have been issued by the renderer, so be sure that 216dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // we update our current index. 217dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_lastCommittedEntryIndex = existingEntryIndex; 218dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 219dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 220dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block updateMaxPageID(); 221dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 222dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 223dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid TestNavigationController::discardPendingEntry() 224dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 225dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch m_pendingEntry.clear(); 226dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_pendingEntryIndex = -1; 227dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 228dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 229dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid TestNavigationController::insertEntry(TestNavigationEntry* entry) 230dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 231dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block discardPendingEntry(); 232dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 233dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Prune any entry which are in front of the current entry 234dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block int currentSize = static_cast<int>(m_entries.size()); 235dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (currentSize > 0) { 236dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block while (m_lastCommittedEntryIndex < (currentSize - 1)) { 237dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_entries.removeLast(); 238dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block currentSize--; 239dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 240dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 241dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 242dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch m_entries.append(RefPtr<TestNavigationEntry>(entry)); 243dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_lastCommittedEntryIndex = static_cast<int>(m_entries.size()) - 1; 244dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block updateMaxPageID(); 245dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 246dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 247dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockint TestNavigationController::entryIndexWithPageID(int32 pageID) const 248dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 249dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block for (int i = static_cast<int>(m_entries.size()) - 1; i >= 0; --i) { 250dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (m_entries[i]->pageID() == pageID) 251dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return i; 252dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 253dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return -1; 254dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 255dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 256dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid TestNavigationController::navigateToPendingEntry(bool reload) 257dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 258dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // For session history navigations only the pending_entry_index_ is set. 259dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!m_pendingEntry) { 260dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ASSERT(m_pendingEntryIndex != -1); 261dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch m_pendingEntry = m_entries[m_pendingEntryIndex]; 262dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 263dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 264dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch if (m_host->navigate(*m_pendingEntry.get(), reload)) { 265dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Note: this is redundant if navigation completed synchronously because 266dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // DidNavigateToEntry call this as well. 267dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block updateMaxPageID(); 268dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } else 269dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block discardPendingEntry(); 270dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 271dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 272dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid TestNavigationController::updateMaxPageID() 273dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 274dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block TestNavigationEntry* entry = activeEntry(); 275dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (entry) 276dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_maxPageID = max(m_maxPageID, entry->pageID()); 277dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 278