diff options
Diffstat (limited to 'WebCore/wml/WMLCardElement.cpp')
-rw-r--r-- | WebCore/wml/WMLCardElement.cpp | 41 |
1 files changed, 28 insertions, 13 deletions
diff --git a/WebCore/wml/WMLCardElement.cpp b/WebCore/wml/WMLCardElement.cpp index c8e92af..63240f3 100644 --- a/WebCore/wml/WMLCardElement.cpp +++ b/WebCore/wml/WMLCardElement.cpp @@ -28,12 +28,14 @@ #include "HTMLNames.h" #include "MappedAttribute.h" #include "NodeList.h" +#include "Page.h" #include "RenderStyle.h" #include "WMLDocument.h" #include "WMLDoElement.h" #include "WMLInputElement.h" #include "WMLIntrinsicEventHandler.h" #include "WMLNames.h" +#include "WMLSelectElement.h" #include "WMLTemplateElement.h" #include "WMLTimerElement.h" #include "WMLVariables.h" @@ -130,20 +132,24 @@ void WMLCardElement::handleIntrinsicEventIfNeeded() FrameLoader* loader = frame->loader(); if (!loader) return; - - int currentHistoryLength = loader->getHistoryLength(); - int lastHistoryLength = pageState->historyLength(); // Calculate the entry method of current card WMLIntrinsicEventType eventType = WMLIntrinsicEventUnknown; - if (lastHistoryLength > currentHistoryLength) + + switch (loader->loadType()) { + case FrameLoadTypeReload: + break; + case FrameLoadTypeBack: eventType = WMLIntrinsicEventOnEnterBackward; - else if (lastHistoryLength < currentHistoryLength) + break; + case FrameLoadTypeBackWMLDeckNotAccessible: + reportWMLError(document(), WMLErrorDeckNotAccessible); + return; + default: eventType = WMLIntrinsicEventOnEnterForward; + break; + } - // Synchronize history length with WMLPageState - pageState->setHistoryLength(currentHistoryLength); - // Figure out target event handler WMLIntrinsicEventHandler* eventHandler = this->eventHandler(); bool hasIntrinsicEvent = false; @@ -165,17 +171,14 @@ void WMLCardElement::handleIntrinsicEventIfNeeded() if (m_eventTimer) m_eventTimer->start(); - // FIXME: Initialize select elements in this card for (Node* node = traverseNextNode(); node != 0; node = node->traverseNextNode()) { if (!node->isElementNode()) continue; if (node->hasTagName(inputTag)) static_cast<WMLInputElement*>(node)->initialize(); - /* else if (node->hasTagName(selectTag)) static_cast<WMLSelectElement*>(node)->selectInitialOptions(); - */ } } @@ -238,13 +241,25 @@ void WMLCardElement::parseMappedAttribute(MappedAttribute* attr) void WMLCardElement::insertedIntoDocument() { WMLElement::insertedIntoDocument(); + Document* document = this->document(); // The first card inserted into a document, is visible by default. if (!m_isVisible) { - RefPtr<NodeList> nodeList = document()->getElementsByTagName("card"); + RefPtr<NodeList> nodeList = document->getElementsByTagName("card"); if (nodeList && nodeList->length() == 1 && nodeList->item(0) == this) m_isVisible = true; } + + // For the WML layout tests we embed WML content in a XHTML document. Navigating to different cards + // within the same deck has a different behaviour in HTML than in WML. HTML wants to "scroll to anchor" + // (see FrameLoader) but WML wants a reload. Notify the root document of the layout test that we want + // to mimic WML behaviour. This is rather tricky, but has been tested extensively. Usually it's not possible + // at all to embed WML in HTML, it's not designed that way, we're just "abusing" it for dynamically created layout tests. + if (document->page() && document->page()->mainFrame()) { + Document* rootDocument = document->page()->mainFrame()->document(); + if (rootDocument && rootDocument != document) + rootDocument->setContainsWMLContent(true); + } } RenderObject* WMLCardElement::createRenderer(RenderArena* arena, RenderStyle* style) @@ -296,7 +311,7 @@ WMLCardElement* WMLCardElement::determineActiveCard(Document* doc) return 0; // Figure out the new target card - String cardName = doc->url().ref(); + String cardName = doc->url().fragmentIdentifier(); WMLCardElement* activeCard = findNamedCardInDocument(doc, cardName); if (activeCard) { |