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 m_activeCard = WMLCardElement::determineActiveCard(this); if (!m_activeCard) { reportWMLError(this, WMLErrorNoCardInDocument); return true; } // Handle deck-level task overrides m_activeCard->handleDeckLevelTaskOverridesIfNeeded(); // Handle card-level intrinsic event if (!aboutToFinishParsing) m_activeCard->handleIntrinsicEventIfNeeded(); return true; }
void WMLSetvarElement::parseMappedAttribute(Attribute* attr) { if (attr->name() == HTMLNames::nameAttr) { if (!isValidVariableName(parseValueSubstitutingVariableReferences(attr->value(), WMLErrorInvalidVariableName))) { reportWMLError(document(), WMLErrorInvalidVariableName); return; } } else WMLElement::parseMappedAttribute(attr); }
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(); }
String substituteVariableReferences(const String& reference, Document* document, WMLVariableEscapingMode escapeMode) { ASSERT(document); if (reference.isEmpty()) return reference; WMLPageState* pageState = wmlPageStateForDocument(document); if (!pageState) return reference; bool isValid = true; String remainingInput = reference; String result; while (!remainingInput.isEmpty()) { ASSERT(isValid); int start = remainingInput.find("$"); if (start == -1) { // Consume all remaining characters, as there's nothing more to substitute result += remainingInput; break; } // Consume all characters until the variable reference beginning result += remainingInput.left(start); remainingInput.remove(0, start); // Transform adjacent dollar signs into a single dollar sign as string literal if (remainingInput[1] == '$') { result += "$"; remainingInput.remove(0, 2); continue; } String variableName; String conversionMode; if (remainingInput[1] == '(') { int referenceEndPosition = remainingInput.find(")"); if (referenceEndPosition == -1) { isValid = false; break; } variableName = remainingInput.substring(2, referenceEndPosition - 2); remainingInput.remove(0, referenceEndPosition + 1); // Determine variable conversion mode string int pos = variableName.find(':'); if (pos != -1) { conversionMode = variableName.substring(pos + 1, variableName.length() - (pos + 1)); variableName = variableName.left(pos); } } else { int length = remainingInput.length(); int referenceEndPosition = 1; for (; referenceEndPosition < length; ++referenceEndPosition) { if (!isValidVariableNameCharacter(remainingInput[referenceEndPosition])) break; } variableName = remainingInput.substring(1, referenceEndPosition - 1); remainingInput.remove(0, referenceEndPosition); } isValid = isValidVariableName(variableName); if (!isValid) break; ASSERT(!variableName.isEmpty()); String variableValue = pageState->getVariable(variableName); if (variableValue.isEmpty()) continue; if (containsVariableReference(variableValue, isValid)) { if (!isValid) break; variableValue = substituteVariableReferences(variableValue, document, escapeMode); continue; } if (!conversionMode.isEmpty()) { // Override default escape mode, if desired WMLVariableEscapingMode specifiedEscapeMode = WMLVariableEscapingNone; if ((isValid = isValidVariableEscapingModeString(conversionMode, specifiedEscapeMode))) escapeMode = specifiedEscapeMode; if (!isValid) break; } switch (escapeMode) { case WMLVariableEscapingNone: break; case WMLVariableEscapingEscape: variableValue = encodeWithURLEscapeSequences(variableValue); break; case WMLVariableEscapingUnescape: variableValue = decodeURLEscapeSequences(variableValue); break; } result += variableValue; ASSERT(isValid); } if (!isValid) { reportWMLError(document, WMLErrorInvalidVariableReference); return reference; } return result; }