WebBackForwardList.cpp [plain text]
#include "WebKitDLL.h"
#include "WebBackForwardList.h"
#include "WebFrame.h"
#include "WebKit.h"
#include "WebPreferences.h"
#include <WebCore/BackForwardList.h>
#include <WebCore/COMPtr.h>
#include <WebCore/HistoryItem.h>
using std::min;
using namespace WebCore;
static HashMap<BackForwardList*, WebBackForwardList*>& backForwardListWrappers()
{
static HashMap<BackForwardList*, WebBackForwardList*> staticBackForwardListWrappers;
return staticBackForwardListWrappers;
}
WebBackForwardList::WebBackForwardList(PassRefPtr<BackForwardList> backForwardList)
: m_refCount(0)
, m_backForwardList(backForwardList)
{
ASSERT(!backForwardListWrappers().contains(m_backForwardList.get()));
backForwardListWrappers().set(m_backForwardList.get(), this);
gClassCount++;
gClassNameCount().add("WebBackForwardList");
}
WebBackForwardList::~WebBackForwardList()
{
ASSERT(m_backForwardList->closed());
ASSERT(backForwardListWrappers().contains(m_backForwardList.get()));
backForwardListWrappers().remove(m_backForwardList.get());
gClassCount--;
gClassNameCount().remove("WebBackForwardList");
}
WebBackForwardList* WebBackForwardList::createInstance(PassRefPtr<BackForwardList> backForwardList)
{
WebBackForwardList* instance;
instance = backForwardListWrappers().get(backForwardList.get());
if (!instance)
instance = new WebBackForwardList(backForwardList);
instance->AddRef();
return instance;
}
HRESULT STDMETHODCALLTYPE WebBackForwardList::QueryInterface(REFIID riid, void** ppvObject)
{
*ppvObject = 0;
if (IsEqualGUID(riid, IID_IUnknown))
*ppvObject = static_cast<IWebBackForwardList*>(this);
else if (IsEqualGUID(riid, IID_IWebBackForwardList))
*ppvObject = static_cast<IWebBackForwardList*>(this);
else if (IsEqualGUID(riid, IID_IWebBackForwardListPrivate))
*ppvObject = static_cast<IWebBackForwardListPrivate*>(this);
else
return E_NOINTERFACE;
AddRef();
return S_OK;
}
ULONG STDMETHODCALLTYPE WebBackForwardList::AddRef(void)
{
return ++m_refCount;
}
ULONG STDMETHODCALLTYPE WebBackForwardList::Release(void)
{
ULONG newRef = --m_refCount;
if (!newRef)
delete(this);
return newRef;
}
HRESULT STDMETHODCALLTYPE WebBackForwardList::addItem(
IWebHistoryItem* item)
{
COMPtr<WebHistoryItem> webHistoryItem;
if (!item || FAILED(item->QueryInterface(&webHistoryItem)))
return E_FAIL;
m_backForwardList->addItem(*webHistoryItem->historyItem());
return S_OK;
}
HRESULT STDMETHODCALLTYPE WebBackForwardList::goBack( void)
{
m_backForwardList->goBack();
return S_OK;
}
HRESULT STDMETHODCALLTYPE WebBackForwardList::goForward( void)
{
m_backForwardList->goForward();
return S_OK;
}
HRESULT STDMETHODCALLTYPE WebBackForwardList::goToItem(
IWebHistoryItem* item)
{
COMPtr<WebHistoryItem> webHistoryItem;
if (!item || FAILED(item->QueryInterface(&webHistoryItem)))
return E_FAIL;
m_backForwardList->goToItem(webHistoryItem->historyItem());
return S_OK;
}
HRESULT STDMETHODCALLTYPE WebBackForwardList::backItem(
IWebHistoryItem** item)
{
if (!item)
return E_POINTER;
HistoryItem* historyItem = m_backForwardList->backItem();
if (!historyItem)
return E_FAIL;
*item = WebHistoryItem::createInstance(historyItem);
return S_OK;
}
HRESULT STDMETHODCALLTYPE WebBackForwardList::currentItem(
IWebHistoryItem** item)
{
if (!item)
return E_POINTER;
HistoryItem* historyItem = m_backForwardList->currentItem();
if (!historyItem)
return E_FAIL;
*item = WebHistoryItem::createInstance(historyItem);
return S_OK;
}
HRESULT STDMETHODCALLTYPE WebBackForwardList::forwardItem(
IWebHistoryItem** item)
{
if (!item)
return E_POINTER;
HistoryItem* historyItem = m_backForwardList->forwardItem();
if (!historyItem)
return E_FAIL;
*item = WebHistoryItem::createInstance(historyItem);
return S_OK;
}
HRESULT STDMETHODCALLTYPE WebBackForwardList::backListWithLimit(
int limit,
int* listCount,
IWebHistoryItem** list)
{
HistoryItemVector historyItemVector;
m_backForwardList->backListWithLimit(limit, historyItemVector);
*listCount = static_cast<int>(historyItemVector.size());
if (list)
for (unsigned i = 0; i < historyItemVector.size(); i++)
list[i] = WebHistoryItem::createInstance(historyItemVector[i].ptr());
return S_OK;
}
HRESULT STDMETHODCALLTYPE WebBackForwardList::forwardListWithLimit(
int limit,
int* listCount,
IWebHistoryItem** list)
{
HistoryItemVector historyItemVector;
m_backForwardList->forwardListWithLimit(limit, historyItemVector);
*listCount = static_cast<int>(historyItemVector.size());
if (list)
for (unsigned i = 0; i < historyItemVector.size(); i++)
list[i] = WebHistoryItem::createInstance(historyItemVector[i].ptr());
return S_OK;
}
HRESULT STDMETHODCALLTYPE WebBackForwardList::capacity(
int* result)
{
*result = (int)m_backForwardList->capacity();
return S_OK;
}
HRESULT STDMETHODCALLTYPE WebBackForwardList::setCapacity(
int size)
{
if (size < 0)
return E_FAIL;
m_backForwardList->setCapacity(size);
return S_OK;
}
HRESULT STDMETHODCALLTYPE WebBackForwardList::backListCount(
int* count)
{
*count = m_backForwardList->backListCount();
return S_OK;
}
HRESULT STDMETHODCALLTYPE WebBackForwardList::forwardListCount(
int* count)
{
*count = m_backForwardList->forwardListCount();
return S_OK;
}
HRESULT STDMETHODCALLTYPE WebBackForwardList::containsItem(
IWebHistoryItem* item,
BOOL* result)
{
COMPtr<WebHistoryItem> webHistoryItem;
if (!item || FAILED(item->QueryInterface(&webHistoryItem)))
return E_FAIL;
*result = m_backForwardList->containsItem(webHistoryItem->historyItem());
return S_OK;
}
HRESULT STDMETHODCALLTYPE WebBackForwardList::itemAtIndex(
int index,
IWebHistoryItem** item)
{
if (!item)
return E_POINTER;
HistoryItem* historyItem = m_backForwardList->itemAtIndex(index);
if (!historyItem)
return E_FAIL;
*item = WebHistoryItem::createInstance(historyItem);
return S_OK;
}
HRESULT STDMETHODCALLTYPE WebBackForwardList::removeItem(
IWebHistoryItem* item)
{
COMPtr<WebHistoryItem> webHistoryItem;
if (!item || FAILED(item->QueryInterface(&webHistoryItem)))
return E_FAIL;
m_backForwardList->removeItem(webHistoryItem->historyItem());
return S_OK;
}