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