/*
* Copyright (C) 2008 Apple Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef PreloadScanner_h
#define PreloadScanner_h
#include "AtomicString.h"
#include "SegmentedString.h"
#include <wtf/Noncopyable.h>
#include <wtf/Vector.h>
namespace WebCore {
class CachedResource;
class CachedResourceClient;
class Document;
class PreloadScanner : Noncopyable {
public:
PreloadScanner(Document*);
~PreloadScanner();
void begin();
void write(const SegmentedString&);
void end();
bool inProgress() const { return m_inProgress; }
bool scanningBody() const;
static unsigned consumeEntity(SegmentedString&, bool& notEnoughCharacters);
private:
void tokenize(const SegmentedString&);
void reset();
void emitTag();
void emitCharacter(UChar);
void tokenizeCSS(UChar);
void emitCSSRule();
void processAttribute();
void clearLastCharacters();
void rememberCharacter(UChar);
bool lastCharactersMatch(const char*, unsigned count) const;
bool m_inProgress;
SegmentedString m_source;
enum State {
Data,
EntityData,
TagOpen,
CloseTagOpen,
TagName,
BeforeAttributeName,
AttributeName,
AfterAttributeName,
BeforeAttributeValue,
AttributeValueDoubleQuoted,
AttributeValueSingleQuoted,
AttributeValueUnquoted,
EntityInAttributeValue,
BogusComment,
MarkupDeclarationOpen,
CommentStart,
CommentStartDash,
Comment,
CommentEndDash,
CommentEnd
};
State m_state;
bool m_escape;
enum ContentModel {
PCDATA,
RCDATA,
CDATA,
PLAINTEXT
};
ContentModel m_contentModel;
unsigned m_commentPos;
State m_stateBeforeEntityInAttributeValue;
static const unsigned lastCharactersBufferSize = 8;
UChar m_lastCharacters[lastCharactersBufferSize];
unsigned m_lastCharacterIndex;
bool m_closeTag;
Vector<UChar, 32> m_tagName;
Vector<UChar, 32> m_attributeName;
Vector<UChar> m_attributeValue;
AtomicString m_lastStartTag;
String m_urlToLoad;
String m_charset;
bool m_linkIsStyleSheet;
enum CSSState {
CSSInitial,
CSSMaybeComment,
CSSComment,
CSSMaybeCommentEnd,
CSSRuleStart,
CSSRule,
CSSAfterRule,
CSSRuleValue,
CSSAfterRuleValue
};
CSSState m_cssState;
Vector<UChar, 16> m_cssRule;
Vector<UChar> m_cssRuleValue;
double m_timeUsed;
bool m_bodySeen;
Document* m_document;
};
}
#endif