void WMLRefreshElement::executeTask() { ASSERT(document()->isWMLDocument()); WMLDocument* document = static_cast<WMLDocument*>(this->document()); WMLPageState* pageState = wmlPageStateForDocument(document); if (!pageState) return; WMLCardElement* card = document->activeCard(); if (!card) return; // Before perform refresh task, we store the current timeout // value in the page state and then stop the timer WMLTimerElement* timer = card->eventTimer(); if (timer) { timer->storeIntervalToPageState(); timer->stop(); } storeVariableState(pageState); // Redisplay curremt card with current variable state if (Frame* frame = document->frame()) { if (FrameLoader* loader = frame->loader()) loader->reload(); } // After refreshing task, resume the timer if it exsits if (timer) timer->start(); }
WMLCardElement* WMLCardElement::determineActiveCard(Document* doc) { WMLPageState* pageState = wmlPageStateForDocument(doc); if (!pageState) return 0; RefPtr<NodeList> nodeList = doc->getElementsByTagName("card"); if (!nodeList) return 0; unsigned length = nodeList->length(); if (length < 1) return 0; // Figure out the new target card String cardName = doc->url().fragmentIdentifier(); WMLCardElement* activeCard = findNamedCardInDocument(doc, cardName); if (activeCard) { // Hide all cards - except the destination card - in document for (unsigned i = 0; i < length; ++i) { WMLCardElement* card = static_cast<WMLCardElement*>(nodeList->item(i)); if (card == activeCard) card->showCard(); else card->hideCard(); } } else { // If the target URL didn't contain a fragment identifier, activeCard // is 0, and has to be set to the first card element in the deck. activeCard = static_cast<WMLCardElement*>(nodeList->item(0)); activeCard->showCard(); } // Assure destination card is visible ASSERT(activeCard->isVisible()); ASSERT(activeCard->attached()); ASSERT(activeCard->renderer()); // Update the document title doc->setTitle(activeCard->title()); #if ENABLE(WMLSCRIPT) static_cast<WMLDocument*>(doc)->setActiveCardId(activeCard->getIDAttribute()) ; #endif // SAMSUNG_WML_FIXES+ // Set the active activeCard in the Document object static_cast<WMLDocument*>(doc)->setActiveCard(activeCard); // Set the active activeCard in the WMLPageState object //pageState->setActiveCard(activeCard); // SAMSUNG_WML_FIXES- return activeCard; }
void WMLPrevElement::executeTask(Event*) { WMLPageState* pageState = wmlPageStateForDocument(document()); if (!pageState) return; WMLCardElement* card = pageState->activeCard(); if (!card) return; storeVariableState(pageState); // Stop the timer of the current card if it is active if (WMLTimerElement* eventTimer = card->eventTimer()) eventTimer->stop(); pageState->page()->goBack(); }
void WMLPrevElement::executeTask() { ASSERT(document()->isWMLDocument()); WMLDocument* document = static_cast<WMLDocument*>(this->document()); WMLPageState* pageState = wmlPageStateForDocument(document); if (!pageState) return; WMLCardElement* card = document->activeCard(); if (!card) return; storeVariableState(pageState); // Stop the timer of the current card if it is active if (WMLTimerElement* eventTimer = card->eventTimer()) eventTimer->stop(); pageState->page()->goBack(); }
void WMLDocument::finishedParsing() { if (Tokenizer* tokenizer = this->tokenizer()) { if (!tokenizer->wellFormed()) { Document::finishedParsing(); return; } } WMLPageState* wmlPageState = wmlPageStateForDocument(this); if (!wmlPageState->isDeckAccessible()) { reportWMLError(this, WMLErrorDeckNotAccessible); Document::finishedParsing(); return; } // Remember that we'e successfully entered the deck wmlPageState->setNeedCheckDeckAccess(false); // 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) { reportWMLError(this, WMLErrorNoCardInDocument); Document::finishedParsing(); return; } // Handle deck-level task overrides card->handleDeckLevelTaskOverridesIfNeeded(); // Handle card-level intrinsic event card->handleIntrinsicEventIfNeeded(); Document::finishedParsing(); }
WMLCardElement* WMLCardElement::findNamedCardInDocument(Document* doc, const String& cardName) { if (cardName.isEmpty()) return 0; RefPtr<NodeList> nodeList = doc->getElementsByTagName("card"); if (!nodeList) return 0; unsigned length = nodeList->length(); if (length < 1) return 0; for (unsigned i = 0; i < length; ++i) { WMLCardElement* card = static_cast<WMLCardElement*>(nodeList->item(i)); if (card->getIdAttribute() != cardName) continue; return card; } return 0; }
void WMLGoElement::executeTask() { ASSERT(document()->isWMLDocument()); WMLDocument* document = static_cast<WMLDocument*>(this->document()); WMLPageState* pageState = wmlPageStateForDocument(document); if (!pageState) return; WMLCardElement* card = document->activeCard(); if (!card) return; Frame* frame = document->frame(); if (!frame) return; FrameLoader* loader = frame->loader(); if (!loader) return; String href = getAttribute(HTMLNames::hrefAttr); if (href.isEmpty()) return; // Substitute variables within target url attribute value KURL url = document->completeURL(substituteVariableReferences(href, document, WMLVariableEscapingEscape)); if (url.isEmpty()) return; storeVariableState(pageState); // Stop the timer of the current card if it is active if (WMLTimerElement* eventTimer = card->eventTimer()) eventTimer->stop(); // FIXME: 'newcontext' handling not implemented for external cards bool inSameDeck = document->url().path() == url.path(); if (inSameDeck && url.hasFragmentIdentifier()) { if (WMLCardElement* card = WMLCardElement::findNamedCardInDocument(document, url.fragmentIdentifier())) { if (card->isNewContext()) pageState->reset(); } } // Prepare loading the destination url ResourceRequest request(url); if (getAttribute(sendrefererAttr) == "true") request.setHTTPReferrer(loader->outgoingReferrer()); String cacheControl = getAttribute(cache_controlAttr); if (m_formAttributes.method() == FormSubmission::PostMethod) preparePOSTRequest(request, inSameDeck, cacheControl); else prepareGETRequest(request, url); // Set HTTP cache-control header if needed if (!cacheControl.isEmpty()) { request.setHTTPHeaderField("cache-control", cacheControl); if (cacheControl == "no-cache") request.setCachePolicy(ReloadIgnoringCacheData); } loader->load(request, false); }