| Index: third_party/WebKit/WebCore/wml/WMLGoElement.cpp
|
| ===================================================================
|
| --- third_party/WebKit/WebCore/wml/WMLGoElement.cpp (revision 9383)
|
| +++ third_party/WebKit/WebCore/wml/WMLGoElement.cpp (working copy)
|
| @@ -1,214 +1,214 @@
|
| -/**
|
| - * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
|
| - *
|
| - * 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 "WMLGoElement.h"
|
| -
|
| -#include "CString.h"
|
| -#include "FormData.h"
|
| -#include "Frame.h"
|
| -#include "FrameLoader.h"
|
| -#include "HTMLNames.h"
|
| -#include "ResourceRequest.h"
|
| -#include "TextEncoding.h"
|
| -#include "WMLCardElement.h"
|
| -#include "WMLDocument.h"
|
| -#include "WMLNames.h"
|
| -#include "WMLPageState.h"
|
| -#include "WMLPostfieldElement.h"
|
| -#include "WMLTimerElement.h"
|
| -#include "WMLVariables.h"
|
| -
|
| -namespace WebCore {
|
| -
|
| -using namespace WMLNames;
|
| -
|
| -WMLGoElement::WMLGoElement(const QualifiedName& tagName, Document* doc)
|
| - : WMLTaskElement(tagName, doc)
|
| -{
|
| -}
|
| -
|
| -void WMLGoElement::registerPostfieldElement(WMLPostfieldElement* postfield)
|
| -{
|
| - m_postfieldElements.append(postfield);
|
| -}
|
| -
|
| -void WMLGoElement::parseMappedAttribute(MappedAttribute* attr)
|
| -{
|
| - if (attr->name() == HTMLNames::methodAttr)
|
| - m_formDataBuilder.parseMethodType(attr->value());
|
| - else if (attr->name() == HTMLNames::enctypeAttr)
|
| - m_formDataBuilder.parseEncodingType(parseValueSubstitutingVariableReferences(attr->value()));
|
| - else if (attr->name() == HTMLNames::accept_charsetAttr)
|
| - m_formDataBuilder.setAcceptCharset(parseValueForbiddingVariableReferences(attr->value()));
|
| - else
|
| - WMLTaskElement::parseMappedAttribute(attr);
|
| -}
|
| -
|
| -void WMLGoElement::executeTask(Event* event)
|
| -{
|
| - Document* doc = document();
|
| - WMLPageState* pageState = wmlPageStateForDocument(doc);
|
| - if (!pageState)
|
| - return;
|
| -
|
| - WMLCardElement* card = pageState->activeCard();
|
| - if (!card)
|
| - return;
|
| -
|
| - Frame* frame = doc->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 = doc->completeURL(substituteVariableReferences(href, doc, 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 = doc->url().path() == url.path();
|
| - if (inSameDeck && url.hasRef()) {
|
| - // Force frame loader to load the URL with fragment identifier
|
| - loader->setForceReloadWmlDeck(true);
|
| -
|
| - if (WMLCardElement* card = WMLCardElement::findNamedCardInDocument(doc, url.ref())) {
|
| - 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_formDataBuilder.isPostMethod())
|
| - 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);
|
| -}
|
| -
|
| -void WMLGoElement::preparePOSTRequest(ResourceRequest& request, bool inSameDeck, const String& cacheControl)
|
| -{
|
| - request.setHTTPMethod("POST");
|
| -
|
| - if (inSameDeck && cacheControl != "no-cache") {
|
| - request.setCachePolicy(ReturnCacheDataDontLoad);
|
| - return;
|
| - }
|
| -
|
| - RefPtr<FormData> data;
|
| -
|
| - if (m_formDataBuilder.isMultiPartForm()) { // multipart/form-data
|
| - Vector<char> boundary = m_formDataBuilder.generateUniqueBoundaryString();
|
| - data = createFormData(boundary.data());
|
| - request.setHTTPContentType(m_formDataBuilder.encodingType() + "; boundary=" + boundary.data());
|
| - } else {
|
| - // text/plain or application/x-www-form-urlencoded
|
| - data = createFormData(CString());
|
| - request.setHTTPContentType(m_formDataBuilder.encodingType());
|
| - }
|
| -
|
| - request.setHTTPBody(data.get());
|
| -}
|
| -
|
| -void WMLGoElement::prepareGETRequest(ResourceRequest& request, const KURL& url)
|
| -{
|
| - request.setHTTPMethod("GET");
|
| -
|
| - // Eventually display error message?
|
| - if (m_formDataBuilder.isMultiPartForm())
|
| - return;
|
| -
|
| - RefPtr<FormData> data = createFormData(CString());
|
| -
|
| - KURL remoteURL(url);
|
| - remoteURL.setQuery(data->flattenToString());
|
| - request.setURL(remoteURL);
|
| -}
|
| -
|
| -PassRefPtr<FormData> WMLGoElement::createFormData(const CString& boundary)
|
| -{
|
| - CString key;
|
| - CString value;
|
| -
|
| - Vector<char> encodedData;
|
| - TextEncoding encoding = m_formDataBuilder.dataEncoding(document()).encodingForFormSubmission();
|
| -
|
| - Vector<WMLPostfieldElement*>::iterator it = m_postfieldElements.begin();
|
| - Vector<WMLPostfieldElement*>::iterator end = m_postfieldElements.end();
|
| -
|
| - RefPtr<FormData> result = FormData::create();
|
| - for (; it != end; ++it) {
|
| - (*it)->encodeData(encoding, key, value);
|
| -
|
| - if (m_formDataBuilder.isMultiPartForm()) {
|
| - Vector<char> header;
|
| - m_formDataBuilder.beginMultiPartHeader(header, boundary, key);
|
| - m_formDataBuilder.finishMultiPartHeader(header);
|
| - result->appendData(header.data(), header.size());
|
| -
|
| - if (size_t dataSize = value.length())
|
| - result->appendData(value.data(), dataSize);
|
| -
|
| - result->appendData("\r\n", 2);
|
| - } else
|
| - m_formDataBuilder.addKeyValuePairAsFormData(encodedData, key, value);
|
| - }
|
| -
|
| - if (m_formDataBuilder.isMultiPartForm())
|
| - m_formDataBuilder.addBoundaryToMultiPartHeader(encodedData, boundary, true);
|
| -
|
| - result->appendData(encodedData.data(), encodedData.size());
|
| - return result;
|
| -}
|
| -
|
| -}
|
| -
|
| -#endif
|
| +/**
|
| + * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
|
| + *
|
| + * 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 "WMLGoElement.h"
|
| +
|
| +#include "CString.h"
|
| +#include "FormData.h"
|
| +#include "Frame.h"
|
| +#include "FrameLoader.h"
|
| +#include "HTMLNames.h"
|
| +#include "ResourceRequest.h"
|
| +#include "TextEncoding.h"
|
| +#include "WMLCardElement.h"
|
| +#include "WMLDocument.h"
|
| +#include "WMLNames.h"
|
| +#include "WMLPageState.h"
|
| +#include "WMLPostfieldElement.h"
|
| +#include "WMLTimerElement.h"
|
| +#include "WMLVariables.h"
|
| +
|
| +namespace WebCore {
|
| +
|
| +using namespace WMLNames;
|
| +
|
| +WMLGoElement::WMLGoElement(const QualifiedName& tagName, Document* doc)
|
| + : WMLTaskElement(tagName, doc)
|
| +{
|
| +}
|
| +
|
| +void WMLGoElement::registerPostfieldElement(WMLPostfieldElement* postfield)
|
| +{
|
| + m_postfieldElements.append(postfield);
|
| +}
|
| +
|
| +void WMLGoElement::parseMappedAttribute(MappedAttribute* attr)
|
| +{
|
| + if (attr->name() == HTMLNames::methodAttr)
|
| + m_formDataBuilder.parseMethodType(attr->value());
|
| + else if (attr->name() == HTMLNames::enctypeAttr)
|
| + m_formDataBuilder.parseEncodingType(parseValueSubstitutingVariableReferences(attr->value()));
|
| + else if (attr->name() == HTMLNames::accept_charsetAttr)
|
| + m_formDataBuilder.setAcceptCharset(parseValueForbiddingVariableReferences(attr->value()));
|
| + else
|
| + WMLTaskElement::parseMappedAttribute(attr);
|
| +}
|
| +
|
| +void WMLGoElement::executeTask(Event* event)
|
| +{
|
| + Document* doc = document();
|
| + WMLPageState* pageState = wmlPageStateForDocument(doc);
|
| + if (!pageState)
|
| + return;
|
| +
|
| + WMLCardElement* card = pageState->activeCard();
|
| + if (!card)
|
| + return;
|
| +
|
| + Frame* frame = doc->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 = doc->completeURL(substituteVariableReferences(href, doc, 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 = doc->url().path() == url.path();
|
| + if (inSameDeck && url.hasRef()) {
|
| + // Force frame loader to load the URL with fragment identifier
|
| + loader->setForceReloadWmlDeck(true);
|
| +
|
| + if (WMLCardElement* card = WMLCardElement::findNamedCardInDocument(doc, url.ref())) {
|
| + 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_formDataBuilder.isPostMethod())
|
| + 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);
|
| +}
|
| +
|
| +void WMLGoElement::preparePOSTRequest(ResourceRequest& request, bool inSameDeck, const String& cacheControl)
|
| +{
|
| + request.setHTTPMethod("POST");
|
| +
|
| + if (inSameDeck && cacheControl != "no-cache") {
|
| + request.setCachePolicy(ReturnCacheDataDontLoad);
|
| + return;
|
| + }
|
| +
|
| + RefPtr<FormData> data;
|
| +
|
| + if (m_formDataBuilder.isMultiPartForm()) { // multipart/form-data
|
| + Vector<char> boundary = m_formDataBuilder.generateUniqueBoundaryString();
|
| + data = createFormData(boundary.data());
|
| + request.setHTTPContentType(m_formDataBuilder.encodingType() + "; boundary=" + boundary.data());
|
| + } else {
|
| + // text/plain or application/x-www-form-urlencoded
|
| + data = createFormData(CString());
|
| + request.setHTTPContentType(m_formDataBuilder.encodingType());
|
| + }
|
| +
|
| + request.setHTTPBody(data.get());
|
| +}
|
| +
|
| +void WMLGoElement::prepareGETRequest(ResourceRequest& request, const KURL& url)
|
| +{
|
| + request.setHTTPMethod("GET");
|
| +
|
| + // Eventually display error message?
|
| + if (m_formDataBuilder.isMultiPartForm())
|
| + return;
|
| +
|
| + RefPtr<FormData> data = createFormData(CString());
|
| +
|
| + KURL remoteURL(url);
|
| + remoteURL.setQuery(data->flattenToString());
|
| + request.setURL(remoteURL);
|
| +}
|
| +
|
| +PassRefPtr<FormData> WMLGoElement::createFormData(const CString& boundary)
|
| +{
|
| + CString key;
|
| + CString value;
|
| +
|
| + Vector<char> encodedData;
|
| + TextEncoding encoding = m_formDataBuilder.dataEncoding(document()).encodingForFormSubmission();
|
| +
|
| + Vector<WMLPostfieldElement*>::iterator it = m_postfieldElements.begin();
|
| + Vector<WMLPostfieldElement*>::iterator end = m_postfieldElements.end();
|
| +
|
| + RefPtr<FormData> result = FormData::create();
|
| + for (; it != end; ++it) {
|
| + (*it)->encodeData(encoding, key, value);
|
| +
|
| + if (m_formDataBuilder.isMultiPartForm()) {
|
| + Vector<char> header;
|
| + m_formDataBuilder.beginMultiPartHeader(header, boundary, key);
|
| + m_formDataBuilder.finishMultiPartHeader(header);
|
| + result->appendData(header.data(), header.size());
|
| +
|
| + if (size_t dataSize = value.length())
|
| + result->appendData(value.data(), dataSize);
|
| +
|
| + result->appendData("\r\n", 2);
|
| + } else
|
| + m_formDataBuilder.addKeyValuePairAsFormData(encodedData, key, value);
|
| + }
|
| +
|
| + if (m_formDataBuilder.isMultiPartForm())
|
| + m_formDataBuilder.addBoundaryToMultiPartHeader(encodedData, boundary, true);
|
| +
|
| + result->appendData(encodedData.data(), encodedData.size());
|
| + return result;
|
| +}
|
| +
|
| +}
|
| +
|
| +#endif
|
|
|