blob: 1afc0c91e020b5c62550ca3122bf6db6d0c465f2 [file] [log] [blame]
/*
* Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
*
* Copyright (C) 2004-2007 Apple Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
*/
#include "config.h"
#if ENABLE(WML)
#include "WMLPageState.h"
#include "HistoryItem.h"
#include "KURL.h"
#include "Page.h"
namespace WebCore {
WMLPageState::WMLPageState(Page* page)
: m_page(page)
, m_historyLength(0)
, m_activeCard(0)
, m_hasDeckAccess(false)
{
}
WMLPageState::~WMLPageState()
{
m_variables.clear();
}
void WMLPageState::reset()
{
// remove all the variables in the current browser context
m_variables.clear();
// clear the navigation history state
if (m_page)
m_page->backForwardList()->clearWmlPageHistory();
// reset implementation-specfic state if UA has
m_historyLength = 0;
}
bool WMLPageState::setNeedCheckDeckAccess(bool need)
{
if (m_hasDeckAccess && need)
return false;
m_hasDeckAccess = need;
m_accessPath = String();
m_accessDomain = String();
return true;
}
// FIXME: We may want another name, it does far more than just checking wheter the deck is accessable
bool WMLPageState::isDeckAccessible()
{
if (!m_hasDeckAccess || !m_page || !m_page->backForwardList() || !m_page->backForwardList()->backItem())
return true;
HistoryItem* histItem = m_page->backForwardList()->backItem();
KURL url(histItem->urlString());
String prevHost = url.host();
String prevPath = url.path();
// for 'file' URI, the host part may be empty, so we should complete it.
if (prevHost.isEmpty())
prevHost = "localhost";
histItem = m_page->backForwardList()->currentItem();
KURL curUrl(histItem->urlString());
String curPath = curUrl.path();
if (equalIgnoringRef(url, curUrl))
return true;
// "/" is the default value if not specified
if (m_accessPath.isEmpty())
m_accessPath = "/";
else if (m_accessPath.endsWith("/") && (m_accessPath != "/"))
m_accessPath = m_accessPath.left((m_accessPath.length()-1));
// current deck domain is the default value if not specified
if (m_accessDomain.isEmpty())
m_accessDomain = prevHost;
// convert relative URL to absolute URL before performing path matching
if (prevHost == m_accessDomain) {
if (!m_accessPath.startsWith("/")) {
int index = curPath.reverseFind('/');
if (index != -1) {
curPath = curPath.left(index + 1);
curPath += m_accessPath;
curUrl.setPath(curPath);
m_accessPath = curUrl.path();
}
}
}
// path prefix matching
if (prevPath.startsWith(m_accessPath) &&
(prevPath[m_accessPath.length()] == '/' || prevPath.length() == m_accessPath.length())) {
// domain suffix matching
unsigned domainLength = m_accessDomain.length();
unsigned hostLength = prevHost.length();
return (prevHost.endsWith(m_accessDomain) && prevHost[hostLength - domainLength - 1] == '.') || hostLength == domainLength;
}
return false;
}
}
#endif