#endif
Page::Page(const PageClients& pageClients)
- : m_chrome(new Chrome(this, pageClients.chromeClient))
- , m_dragCaretController(new SelectionController(0, true))
+ : m_chrome(adoptPtr(new Chrome(this, pageClients.chromeClient)))
+ , m_dragCaretController(adoptPtr(new SelectionController(0, true)))
#if ENABLE(DRAG_SUPPORT)
- , m_dragController(new DragController(this, pageClients.dragClient))
+ , m_dragController(adoptPtr(new DragController(this, pageClients.dragClient)))
#endif
- , m_focusController(new FocusController(this))
+ , m_focusController(adoptPtr(new FocusController(this)))
#if ENABLE(CONTEXT_MENUS)
- , m_contextMenuController(new ContextMenuController(this, pageClients.contextMenuClient))
+ , m_contextMenuController(adoptPtr(new ContextMenuController(this, pageClients.contextMenuClient)))
#endif
#if ENABLE(INSPECTOR)
- , m_inspectorController(new InspectorController(this, pageClients.inspectorClient))
+ , m_inspectorController(adoptPtr(new InspectorController(this, pageClients.inspectorClient)))
#endif
#if ENABLE(CLIENT_BASED_GEOLOCATION)
- , m_geolocationController(new GeolocationController(this, pageClients.geolocationControllerClient))
+ , m_geolocationController(adoptPtr(new GeolocationController(this, pageClients.geolocationControllerClient)))
#endif
#if ENABLE(DEVICE_ORIENTATION)
, m_deviceMotionController(RuntimeEnabledFeatures::deviceMotionEnabled() ? new DeviceMotionController(pageClients.deviceMotionClient) : 0)
#if ENABLE(INPUT_SPEECH)
, m_speechInputClient(pageClients.speechInputClient)
#endif
- , m_settings(new Settings(this))
- , m_progress(new ProgressTracker)
- , m_backForwardController(new BackForwardController(this, pageClients.backForwardControllerClient))
+ , m_settings(adoptPtr(new Settings(this)))
+ , m_progress(adoptPtr(new ProgressTracker))
+ , m_backForwardController(adoptPtr(new BackForwardController(this, pageClients.backForwardClient)))
, m_theme(RenderTheme::themeForPage(this))
, m_editorClient(pageClients.editorClient)
, m_frameCount(0)
m_inspectorController->inspectedPageDestroyed();
#endif
- backForwardList()->close();
+ backForward()->close();
#ifndef NDEBUG
pageCounter.decrement();
BackForwardList* Page::backForwardList() const
{
- return m_backForwardController->list();
+ return m_backForwardController->client();
}
bool Page::goBack()
{
- HistoryItem* item = backForwardList()->backItem();
+ HistoryItem* item = backForward()->backItem();
if (item) {
goToItem(item, FrameLoadTypeBack);
bool Page::goForward()
{
- HistoryItem* item = backForwardList()->forwardItem();
+ HistoryItem* item = backForward()->forwardItem();
if (item) {
goToItem(item, FrameLoadTypeForward);
{
if (distance == 0)
return true;
- if (distance > 0 && distance <= backForwardList()->forwardListCount())
+ if (distance > 0 && distance <= backForward()->forwardCount())
return true;
- if (distance < 0 && -distance <= backForwardList()->backListCount())
+ if (distance < 0 && -distance <= backForward()->backCount())
return true;
return false;
}
if (distance == 0)
return;
- HistoryItem* item = backForwardList()->itemAtIndex(distance);
+ HistoryItem* item = backForward()->itemAtIndex(distance);
if (!item) {
if (distance > 0) {
- int forwardListCount = backForwardList()->forwardListCount();
- if (forwardListCount > 0)
- item = backForwardList()->itemAtIndex(forwardListCount);
+ if (int forwardCount = backForward()->forwardCount())
+ item = backForward()->itemAtIndex(forwardCount);
} else {
- int backListCount = backForwardList()->backListCount();
- if (backListCount > 0)
- item = backForwardList()->itemAtIndex(-backListCount);
+ if (int backCount = backForward()->backCount())
+ item = backForward()->itemAtIndex(-backCount);
}
}
- ASSERT(item); // we should not reach this line with an empty back/forward list
- if (item)
- goToItem(item, FrameLoadTypeIndexedBackForward);
+ ASSERT(item);
+ if (!item)
+ return;
+
+ goToItem(item, FrameLoadTypeIndexedBackForward);
}
void Page::goToItem(HistoryItem* item, FrameLoadType type)
{
if (defersLoading())
return;
+
+ // stopAllLoaders may end up running onload handlers, which could cause further history traversals that may lead to the passed in HistoryItem
+ // being deref()-ed. Make sure we can still use it with HistoryController::goToItem later.
+ RefPtr<HistoryItem> protector(item);
// Abort any current load unless we're navigating the current document to a new state object
HistoryItem* currentItem = m_mainFrame->loader()->history()->currentItem();
int Page::getHistoryLength()
{
- return backForwardList()->backListCount() + 1 + backForwardList()->forwardListCount();
+ return backForward()->backCount() + 1 + backForward()->forwardCount();
}
void Page::setGlobalHistoryItem(HistoryItem* item)
ASSERT(m_frameCount + 1 == frameCount);
}
#endif
+
+Page::PageClients::PageClients()
+ : chromeClient(0)
+ , contextMenuClient(0)
+ , editorClient(0)
+ , dragClient(0)
+ , inspectorClient(0)
+ , pluginHalterClient(0)
+ , geolocationControllerClient(0)
+ , deviceMotionClient(0)
+ , deviceOrientationClient(0)
+ , speechInputClient(0)
+{
+}
+
+Page::PageClients::~PageClients()
+{
+}
+
} // namespace WebCore