summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/webkit/WebCore/wml/WMLPageState.cpp
blob: 1afc0c91e020b5c62550ca3122bf6db6d0c465f2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*
 * 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