/**
* 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 "WMLErrorHandling.h"
#include "Console.h"
#include "CString.h"
#include "Frame.h"
#include "Document.h"
#include "DOMWindow.h"
#include "XMLTokenizer.h"
namespace WebCore {
void reportWMLError(Document* doc, WMLErrorCode error)
{
if (!doc || error == WMLErrorUnknown)
return;
String errorMessage = errorMessageForErrorCode(error);
if (XMLTokenizer* tokenizer = static_cast<XMLTokenizer*>(doc->tokenizer())) {
// Some errors are reported as result of an insertedIntoDocument() call.
// If this happened, parsing has been stopped, and the document fragment
// is wrapped in a XHTML error document. That means insertedIntoDocument()
// will be called again - do NOT report the error twice, that would result
// in an infinite error reporting loop.
if (!tokenizer->wellFormed())
return;
tokenizer->handleError(XMLTokenizer::fatal, errorMessage.latin1().data(), tokenizer->lineNumber(), tokenizer->columnNumber());
} else {
Frame* frame = doc->frame();
if (!frame)
return;
DOMWindow* domWindow = frame->domWindow();
if (!domWindow)
return;
Console* console = domWindow->console();
if (!console)
return;
console->addMessage(WMLMessageSource, ErrorMessageLevel, errorMessage, 0, String());
}
}
String errorMessageForErrorCode(WMLErrorCode error)
{
switch (error) {
case WMLErrorConflictingEventBinding:
return "Conflicting event bindings within an element.";
case WMLErrorDeckNotAccessible:
return "Deck not accessible.";
case WMLErrorDuplicatedDoElement:
return "At least two do elements share a name, which is not allowed.";
case WMLErrorForbiddenTaskInAnchorElement:
return "Forbidden task contained in anchor element.";
case WMLErrorInvalidColumnsNumberInTable:
return "A table contains an invalid number of columns.";
case WMLErrorInvalidVariableName:
return "A variable name contains invalid characters.";
case WMLErrorInvalidVariableReference:
return "A variable reference uses invalid syntax.";
case WMLErrorInvalidVariableReferenceLocation:
return "A variable reference is placed in an invalid location.";
case WMLErrorMultipleAccessElements:
return "Only one access element is allowed in a deck.";
case WMLErrorMultipleTemplateElements:
return "Only one template element is allowed in a deck.";
case WMLErrorNoCardInDocument:
return "No card contained in document.";
case WMLErrorMultipleTimerElements:
return "Only one timer element is allowed in a card.";
case WMLErrorUnknown:
return String();
};
ASSERT_NOT_REACHED();
return String();
}
}
#endif