108a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu/* 208a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu * Copyright (C) 2012 The Android Open Source Project 308a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu * 408a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu * Licensed under the Apache License, Version 2.0 (the "License"); 508a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu * you may not use this file except in compliance with the License. 608a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu * You may obtain a copy of the License at 708a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu * 808a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu * http://www.apache.org/licenses/LICENSE-2.0 908a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu * 1008a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu * Unless required by applicable law or agreed to in writing, software 1108a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu * distributed under the License is distributed on an "AS IS" BASIS, 1208a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1308a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu * See the License for the specific language governing permissions and 1408a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu * limitations under the License. 1508a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu */ 1608a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu 1708a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liupackage com.android.webview.chromium; 1808a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu 19318568c4b5933ce429c402d076bf65da69775706Bo Liuimport org.chromium.content_public.browser.NavigationHistory; 2008a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu 2108a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liuimport android.webkit.WebBackForwardList; 2208a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liuimport android.webkit.WebHistoryItem; 2308a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu 2408a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liuimport java.util.ArrayList; 2508a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liuimport java.util.List; 2608a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu 2708a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu/** 2808a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu * WebView Chromium implementation of WebBackForwardList. Simple immutable 2908a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu * wrapper around NavigationHistory. 3008a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu */ 3108a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liupublic class WebBackForwardListChromium extends WebBackForwardList { 3208a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu private final List<WebHistoryItemChromium> mHistroryItemList; 3308a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu private final int mCurrentIndex; 3408a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu 3508a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu /* package */ WebBackForwardListChromium(NavigationHistory nav_history) { 3608a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu mCurrentIndex = nav_history.getCurrentEntryIndex(); 37075c4696421fc54a5c21c746c900b9281e7ae476Bo Liu mHistroryItemList = new ArrayList<WebHistoryItemChromium>(nav_history.getEntryCount()); 3808a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu for (int i = 0; i < nav_history.getEntryCount(); ++i) { 3908a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu mHistroryItemList.add( 4008a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu new WebHistoryItemChromium(nav_history.getEntryAtIndex(i))); 4108a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu } 4208a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu } 4308a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu 4408a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu /** 4508a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu * See {@link android.webkit.WebBackForwardList#getCurrentItem}. 4608a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu */ 4708a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu @Override 4808a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu public synchronized WebHistoryItem getCurrentItem() { 4908a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu if (getSize() == 0) { 5008a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu return null; 5108a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu } else { 5208a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu return getItemAtIndex(getCurrentIndex()); 5308a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu } 5408a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu } 5508a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu 5608a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu /** 5708a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu * See {@link android.webkit.WebBackForwardList#getCurrentIndex}. 5808a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu */ 5908a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu @Override 6008a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu public synchronized int getCurrentIndex() { 6108a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu return mCurrentIndex; 6208a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu } 6308a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu 6408a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu /** 6508a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu * See {@link android.webkit.WebBackForwardList#getItemAtIndex}. 6608a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu */ 6708a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu @Override 6808a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu public synchronized WebHistoryItem getItemAtIndex(int index) { 6908a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu if (index < 0 || index >= getSize()) { 7008a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu return null; 7108a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu } else { 7208a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu return mHistroryItemList.get(index); 7308a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu } 7408a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu } 7508a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu 7608a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu /** 7708a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu * See {@link android.webkit.WebBackForwardList#getSize}. 7808a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu */ 7908a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu @Override 8008a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu public synchronized int getSize() { 8108a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu return mHistroryItemList.size(); 8208a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu } 8308a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu 8408a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu // Clone constructor. 8508a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu private WebBackForwardListChromium(List<WebHistoryItemChromium> list, 8608a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu int currentIndex) { 8708a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu mHistroryItemList = list; 8808a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu mCurrentIndex = currentIndex; 8908a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu } 9008a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu 9108a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu /** 9208a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu * See {@link android.webkit.WebBackForwardList#clone}. 9308a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu */ 9408a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu @Override 9508a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu protected synchronized WebBackForwardListChromium clone() { 9608a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu List<WebHistoryItemChromium> list = 9708a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu new ArrayList<WebHistoryItemChromium>(getSize()); 9808a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu for (int i = 0; i < getSize(); ++i) { 9908a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu list.add(mHistroryItemList.get(i).clone()); 10008a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu } 10108a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu return new WebBackForwardListChromium(list, mCurrentIndex); 10208a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu } 10308a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu} 104