summaryrefslogtreecommitdiffstats
path: root/WebCore/wml/WMLDocument.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/wml/WMLDocument.cpp')
-rw-r--r--WebCore/wml/WMLDocument.cpp61
1 files changed, 45 insertions, 16 deletions
diff --git a/WebCore/wml/WMLDocument.cpp b/WebCore/wml/WMLDocument.cpp
index 7f73848..f2287be 100644
--- a/WebCore/wml/WMLDocument.cpp
+++ b/WebCore/wml/WMLDocument.cpp
@@ -23,6 +23,7 @@
#if ENABLE(WML)
#include "WMLDocument.h"
+#include "Frame.h"
#include "Page.h"
#include "Tokenizer.h"
#include "WMLCardElement.h"
@@ -34,6 +35,7 @@ namespace WebCore {
WMLDocument::WMLDocument(Frame* frame)
: Document(frame, false)
+ , m_activeCard(0)
{
clearXMLVersion();
}
@@ -51,38 +53,65 @@ void WMLDocument::finishedParsing()
}
}
- WMLPageState* wmlPageState = wmlPageStateForDocument(this);
- if (!wmlPageState->isDeckAccessible()) {
- reportWMLError(this, WMLErrorDeckNotAccessible);
- Document::finishedParsing();
+ bool hasAccess = initialize(true);
+ Document::finishedParsing();
+
+ if (!hasAccess) {
+ m_activeCard = 0;
+
+ WMLPageState* wmlPageState = wmlPageStateForDocument(this);
+ if (!wmlPageState)
+ return;
+
+ Page* page = wmlPageState->page();
+ if (!page)
+ return;
+
+ BackForwardList* list = page->backForwardList();
+ if (!list)
+ return;
+
+ HistoryItem* item = list->backItem();
+ if (!item)
+ return;
+
+ page->goToItem(item, FrameLoadTypeBackWMLDeckNotAccessible);
return;
}
- // Remember that we'e successfully entered the deck
- wmlPageState->setNeedCheckDeckAccess(false);
-
- initialize();
- Document::finishedParsing();
+ if (m_activeCard) {
+ m_activeCard->handleIntrinsicEventIfNeeded();
+ m_activeCard = 0;
+ }
}
-void WMLDocument::initialize()
+bool WMLDocument::initialize(bool aboutToFinishParsing)
{
+ WMLPageState* wmlPageState = wmlPageStateForDocument(this);
+ if (!wmlPageState || !wmlPageState->canAccessDeck())
+ return false;
+
+ // Remember that we'e successfully entered the deck
+ wmlPageState->resetAccessControlData();
+
// Notify the existance of templates to all cards of the current deck
WMLTemplateElement::registerTemplatesInDocument(this);
// Set destination card
- WMLCardElement* card = WMLCardElement::determineActiveCard(this);
- if (!card) {
+ m_activeCard = WMLCardElement::determineActiveCard(this);
+ if (!m_activeCard) {
reportWMLError(this, WMLErrorNoCardInDocument);
- Document::finishedParsing();
- return;
+ return true;
}
// Handle deck-level task overrides
- card->handleDeckLevelTaskOverridesIfNeeded();
+ m_activeCard->handleDeckLevelTaskOverridesIfNeeded();
// Handle card-level intrinsic event
- card->handleIntrinsicEventIfNeeded();
+ if (!aboutToFinishParsing)
+ m_activeCard->handleIntrinsicEventIfNeeded();
+
+ return true;
}
WMLPageState* wmlPageStateForDocument(Document* doc)