diff options
author | Ben Murdoch <benm@google.com> | 2010-08-11 14:44:44 +0100 |
---|---|---|
committer | Ben Murdoch <benm@google.com> | 2010-08-12 19:15:41 +0100 |
commit | dd8bb3de4f353a81954234999f1fea748aee2ea9 (patch) | |
tree | 729b52bf09294f0d6c67cd5ea80aee1b727b7bd8 /WebCore/html | |
parent | f3d41ba51d86bf719c7a65ab5297aea3c17e2d98 (diff) | |
download | external_webkit-dd8bb3de4f353a81954234999f1fea748aee2ea9.zip external_webkit-dd8bb3de4f353a81954234999f1fea748aee2ea9.tar.gz external_webkit-dd8bb3de4f353a81954234999f1fea748aee2ea9.tar.bz2 |
Merge WebKit at r65072 : Initial merge by git.
Change-Id: Ibcf418498376b2660aacb7f8d46ea7085ef91585
Diffstat (limited to 'WebCore/html')
85 files changed, 5994 insertions, 5672 deletions
diff --git a/WebCore/html/Blob.cpp b/WebCore/html/Blob.cpp index a41fb2e..977ffa6 100644 --- a/WebCore/html/Blob.cpp +++ b/WebCore/html/Blob.cpp @@ -70,7 +70,7 @@ const String& Blob::path() const return m_items[0]->toFileBlobItem()->path(); } -#if ENABLE(BLOB_SLICE) +#if ENABLE(BLOB) PassRefPtr<Blob> Blob::slice(ScriptExecutionContext* scriptExecutionContext, long long start, long long length, const String& contentType) const { if (start < 0) @@ -97,6 +97,6 @@ PassRefPtr<Blob> Blob::slice(ScriptExecutionContext* scriptExecutionContext, lon } return Blob::create(scriptExecutionContext, contentType, items); } -#endif // ENABLE(BLOB_SLICE) +#endif // ENABLE(BLOB) } // namespace WebCore diff --git a/WebCore/html/Blob.h b/WebCore/html/Blob.h index 12ccca7..7afc7a0 100644 --- a/WebCore/html/Blob.h +++ b/WebCore/html/Blob.h @@ -67,7 +67,7 @@ public: const BlobItemList& items() const { return m_items; } -#if ENABLE(BLOB_SLICE) +#if ENABLE(BLOB) PassRefPtr<Blob> slice(ScriptExecutionContext*, long long start, long long length, const String& contentType = String()) const; #endif diff --git a/WebCore/html/Blob.idl b/WebCore/html/Blob.idl index 626bb73..e063b6d 100644 --- a/WebCore/html/Blob.idl +++ b/WebCore/html/Blob.idl @@ -35,7 +35,7 @@ module html { readonly attribute DOMString type; #if !defined(LANGUAGE_OBJECTIVE_C) -#if defined(ENABLE_BLOB_SLICE) && ENABLE_BLOB_SLICE +#if defined(ENABLE_BLOB) && ENABLE_BLOB [CallWith=ScriptExecutionContext] Blob slice(in long long start, in long long length, in [Optional, ConvertUndefinedOrNullToNullString] DOMString contentType); #endif #endif diff --git a/WebCore/html/CollectionCache.h b/WebCore/html/CollectionCache.h index 70a5af7..df1d1fa 100644 --- a/WebCore/html/CollectionCache.h +++ b/WebCore/html/CollectionCache.h @@ -21,12 +21,12 @@ #ifndef CollectionCache_h #define CollectionCache_h +#include <wtf/Forward.h> #include <wtf/HashMap.h> #include <wtf/Vector.h> namespace WebCore { -class AtomicStringImpl; class Element; struct CollectionCache : FastAllocBase { diff --git a/WebCore/html/DOMFormData.h b/WebCore/html/DOMFormData.h index f071d4a..6c24858 100644 --- a/WebCore/html/DOMFormData.h +++ b/WebCore/html/DOMFormData.h @@ -32,13 +32,13 @@ #define DOMFormData_h #include "FormDataList.h" +#include <wtf/Forward.h> #include <wtf/PassRefPtr.h> #include <wtf/RefCounted.h> namespace WebCore { class Blob; -class String; class TextEncoding; class DOMFormData : public FormDataList, public RefCounted<DOMFormData> { diff --git a/WebCore/html/DataGridColumnList.h b/WebCore/html/DataGridColumnList.h index ed72863..8a7ec75 100644 --- a/WebCore/html/DataGridColumnList.h +++ b/WebCore/html/DataGridColumnList.h @@ -5,13 +5,13 @@ #include "DataGridColumn.h" +#include <wtf/Forward.h> #include <wtf/PassRefPtr.h> #include <wtf/RefCounted.h> #include <wtf/Vector.h> namespace WebCore { -class AtomicString; class HTMLDataGridElement; class DataGridColumnList : public RefCounted<DataGridColumnList> { diff --git a/WebCore/html/DateComponents.h b/WebCore/html/DateComponents.h index a15d558..efc3248 100644 --- a/WebCore/html/DateComponents.h +++ b/WebCore/html/DateComponents.h @@ -32,12 +32,11 @@ #define DateComponents_h #include <limits> +#include <wtf/Forward.h> #include <wtf/unicode/Unicode.h> namespace WebCore { -class String; - // A DateComponents instance represents one of the following date and time combinations: // * Month type: year-month // * Date type: year-month-day diff --git a/WebCore/html/FileError.h b/WebCore/html/FileError.h index 8190883..1c74c07 100644 --- a/WebCore/html/FileError.h +++ b/WebCore/html/FileError.h @@ -31,7 +31,7 @@ #ifndef FileError_h #define FileError_h -#if ENABLE(FILE_READER) || ENABLE(FILE_WRITER) +#if ENABLE(BLOB) || ENABLE(FILE_WRITER) #include "ExceptionCode.h" #include <wtf/PassRefPtr.h> @@ -55,6 +55,6 @@ private: } // namespace WebCore -#endif // ENABLE(FILE_READER) || ENABLE(FILE_WRITER) +#endif // ENABLE(BLOB) || ENABLE(FILE_WRITER) #endif // FileError_h diff --git a/WebCore/html/FileError.idl b/WebCore/html/FileError.idl index 555d103..3423e72 100644 --- a/WebCore/html/FileError.idl +++ b/WebCore/html/FileError.idl @@ -30,7 +30,7 @@ module html { interface [ - Conditional=FILE_READER|FILE_WRITER, + Conditional=BLOB|FILE_WRITER, DontCheckEnums ] FileError { #if !defined(LANGUAGE_OBJECTIVE_C) diff --git a/WebCore/html/FileReader.cpp b/WebCore/html/FileReader.cpp index b44ec9d..88f218f 100644 --- a/WebCore/html/FileReader.cpp +++ b/WebCore/html/FileReader.cpp @@ -30,7 +30,7 @@ #include "config.h" -#if ENABLE(FILE_READER) +#if ENABLE(BLOB) #include "FileReader.h" @@ -311,4 +311,4 @@ void FileReader::convertToDataURL() } // namespace WebCore -#endif // ENABLE(FILE_READER) +#endif // ENABLE(BLOB) diff --git a/WebCore/html/FileReader.h b/WebCore/html/FileReader.h index 80d425c..a5339a9 100644 --- a/WebCore/html/FileReader.h +++ b/WebCore/html/FileReader.h @@ -31,7 +31,7 @@ #ifndef FileReader_h #define FileReader_h -#if ENABLE(FILE_READER) +#if ENABLE(BLOB) #include "ActiveDOMObject.h" #include "EventTarget.h" @@ -138,7 +138,7 @@ private: ReadType m_readType; TextEncoding m_encoding; - // Like XMLHttpRequest.m_responseText, we keep this as a ScriptString, not a WebCore::String. + // Like XMLHttpRequest.m_responseText, we keep this as a ScriptString, not a WTF::String. // That's because these strings can easily get huge (they are filled from the file) and // because JS can easily observe many intermediate states, so it's very useful to be // able to share the buffer with JavaScript versions of the whole or partial string. @@ -166,6 +166,6 @@ private: } // namespace WebCore -#endif +#endif // ENABLE(BLOB) #endif // FileReader_h diff --git a/WebCore/html/FileReader.idl b/WebCore/html/FileReader.idl index ad0e187..fb3b979 100644 --- a/WebCore/html/FileReader.idl +++ b/WebCore/html/FileReader.idl @@ -30,7 +30,7 @@ module html { interface [ - Conditional=FILE_READER, + Conditional=BLOB, CanBeConstructed, CallWith=ScriptExecutionContext, EventTarget, diff --git a/WebCore/html/FileStream.cpp b/WebCore/html/FileStream.cpp index f859b63..abe7bad 100644 --- a/WebCore/html/FileStream.cpp +++ b/WebCore/html/FileStream.cpp @@ -30,7 +30,7 @@ #include "config.h" -#if ENABLE(FILE_READER) || ENABLE(FILE_WRITER) +#if ENABLE(BLOB) || ENABLE(FILE_WRITER) #include "FileStream.h" @@ -98,7 +98,6 @@ void FileStream::openForRead(Blob* blob) return; } -#if ENABLE(BLOB_SLICE) const FileRangeBlobItem* fileRangeItem = fileItem->toFileRangeBlobItem(); if (fileRangeItem) { // Check the modificationt time for the possible file change. @@ -115,7 +114,6 @@ void FileStream::openForRead(Blob* blob) } } } -#endif // Get the size. m_totalBytesToRead = blob->size(); @@ -182,4 +180,4 @@ void FileStream::truncate(long long) } // namespace WebCore -#endif // ENABLE(FILE_READER) || ENABLE(FILE_WRITER) +#endif // ENABLE(BLOB) || ENABLE(FILE_WRITER) diff --git a/WebCore/html/FileStream.h b/WebCore/html/FileStream.h index 9d3f7b8..b5eccd4 100644 --- a/WebCore/html/FileStream.h +++ b/WebCore/html/FileStream.h @@ -31,17 +31,17 @@ #ifndef FileStream_h #define FileStream_h -#if ENABLE(FILE_READER) || ENABLE(FILE_WRITER) +#if ENABLE(BLOB) || ENABLE(FILE_WRITER) #include "FileStreamClient.h" #include "FileSystem.h" +#include <wtf/Forward.h> #include <wtf/PassRefPtr.h> #include <wtf/RefCounted.h> namespace WebCore { class Blob; -class String; // All methods are synchronous and should be called on File or Worker thread. class FileStream : public RefCounted<FileStream> { @@ -73,6 +73,6 @@ private: } // namespace WebCore -#endif // ENABLE(FILE_READER) || ENABLE(FILE_WRITER) +#endif // ENABLE(BLOB) || ENABLE(FILE_WRITER) #endif // FileStream_h diff --git a/WebCore/html/FileStreamClient.h b/WebCore/html/FileStreamClient.h index 05c7df5..2e7091f 100644 --- a/WebCore/html/FileStreamClient.h +++ b/WebCore/html/FileStreamClient.h @@ -31,7 +31,7 @@ #ifndef FileStreamClient_h #define FileStreamClient_h -#if ENABLE(FILE_READER) || ENABLE(FILE_WRITER) +#if ENABLE(BLOB) || ENABLE(FILE_WRITER) #include "ExceptionCode.h" @@ -58,6 +58,6 @@ protected: } // namespace WebCore -#endif // ENABLE(FILE_READER) || ENABLE(FILE_WRITER) +#endif // ENABLE(BLOB) || ENABLE(FILE_WRITER) #endif // FileStreamClient_h diff --git a/WebCore/html/FileStreamProxy.cpp b/WebCore/html/FileStreamProxy.cpp index e2516df..e3b9e79 100644 --- a/WebCore/html/FileStreamProxy.cpp +++ b/WebCore/html/FileStreamProxy.cpp @@ -30,7 +30,7 @@ #include "config.h" -#if ENABLE(FILE_READER) || ENABLE(FILE_WRITER) +#if ENABLE(BLOB) || ENABLE(FILE_WRITER) #include "FileStreamProxy.h" @@ -199,4 +199,4 @@ void FileStreamProxy::didStop() } // namespace WebCore -#endif // ENABLE(FILE_WRITER) +#endif // ENABLE(BLOB) || ENABLE(FILE_WRITER) diff --git a/WebCore/html/FileStreamProxy.h b/WebCore/html/FileStreamProxy.h index 66d8cb3..8523d4a 100644 --- a/WebCore/html/FileStreamProxy.h +++ b/WebCore/html/FileStreamProxy.h @@ -32,9 +32,10 @@ #ifndef FileStreamProxy_h #define FileStreamProxy_h -#if ENABLE(FILE_READER) || ENABLE(FILE_WRITER) +#if ENABLE(BLOB) || ENABLE(FILE_WRITER) #include "FileStreamClient.h" +#include <wtf/Forward.h> #include <wtf/PassRefPtr.h> #include <wtf/RefCounted.h> #include <wtf/RefPtr.h> @@ -45,7 +46,6 @@ class Blob; class FileStream; class FileThread; class ScriptExecutionContext; -class String; // A proxy module that calls corresponding FileStream methods on the file thread. Note: you must call stop() first and then release the reference to destruct the FileStreamProxy instance. class FileStreamProxy : public RefCounted<FileStreamProxy>, public FileStreamClient { @@ -87,6 +87,6 @@ private: } // namespace WebCore -#endif // ENABLE(FILE_READER) || ENABLE(FILE_WRITER) +#endif // ENABLE(BLOB) || ENABLE(FILE_WRITER) #endif // FileStreamProxy_h diff --git a/WebCore/html/FileThread.cpp b/WebCore/html/FileThread.cpp index 3a3413c..4e48cfb 100644 --- a/WebCore/html/FileThread.cpp +++ b/WebCore/html/FileThread.cpp @@ -30,7 +30,7 @@ #include "config.h" -#if ENABLE(FILE_WRITER) || ENABLE(FILE_READER) +#if ENABLE(BLOB) || ENABLE(FILE_WRITER) #include "FileThread.h" @@ -116,4 +116,4 @@ void* FileThread::runLoop() } // namespace WebCore -#endif // ENABLE(FILE_WRITER) || ENABLE(FILE_READER) +#endif // ENABLE(BLOB) || ENABLE(FILE_WRITER) diff --git a/WebCore/html/FileThread.h b/WebCore/html/FileThread.h index 2eba98e..16acacc 100644 --- a/WebCore/html/FileThread.h +++ b/WebCore/html/FileThread.h @@ -31,7 +31,7 @@ #ifndef FileThread_h #define FileThread_h -#if ENABLE(FILE_WRITER) || ENABLE(FILE_READER) +#if ENABLE(BLOB) || ENABLE(FILE_WRITER) #include <wtf/MessageQueue.h> #include <wtf/PassOwnPtr.h> @@ -83,6 +83,6 @@ private: } // namespace WebCore -#endif // ENABLE(FILE_WRITER) || ENABLE(FILE_READER) +#endif // ENABLE(BLOB) || ENABLE(FILE_WRITER) #endif // FileThread_h diff --git a/WebCore/html/FormDataList.h b/WebCore/html/FormDataList.h index f4bb905..38b07f9 100644 --- a/WebCore/html/FormDataList.h +++ b/WebCore/html/FormDataList.h @@ -23,6 +23,7 @@ #include "Blob.h" #include "TextEncoding.h" +#include <wtf/Forward.h> #include <wtf/text/CString.h> namespace WebCore { @@ -36,7 +37,7 @@ public: appendString(key); appendString(value); } - void appendData(const String& key, const WTF::CString& value) + void appendData(const String& key, const CString& value) { appendString(key); appendString(value); @@ -52,7 +53,7 @@ public: const TextEncoding& encoding() const { return m_encoding; } private: - void appendString(const WTF::CString&); + void appendString(const CString&); void appendString(const String&); TextEncoding m_encoding; diff --git a/WebCore/html/HTMLAnchorElement.cpp b/WebCore/html/HTMLAnchorElement.cpp index 6f9b17c..0d2e92d 100644 --- a/WebCore/html/HTMLAnchorElement.cpp +++ b/WebCore/html/HTMLAnchorElement.cpp @@ -237,8 +237,7 @@ void HTMLAnchorElement::setActive(bool down, bool pause) // Don't set the link to be active if the current selection is in the same editable block as // this link case EditableLinkLiveWhenNotFocused: - if (down && document()->frame() && document()->frame()->selection() && - document()->frame()->selection()->rootEditableElement() == rootEditableElement()) + if (down && document()->frame() && document()->frame()->selection()->rootEditableElement() == rootEditableElement()) return; break; diff --git a/WebCore/html/HTMLCanvasElement.cpp b/WebCore/html/HTMLCanvasElement.cpp index 6b5a3a3..ef5574a 100644 --- a/WebCore/html/HTMLCanvasElement.cpp +++ b/WebCore/html/HTMLCanvasElement.cpp @@ -169,6 +169,12 @@ CanvasRenderingContext* HTMLCanvasElement::getContext(const String& type, Canvas usesDashbardCompatibilityMode = settings->usesDashboardBackwardCompatibilityMode(); #endif m_context = new CanvasRenderingContext2D(this, document()->inCompatMode(), usesDashbardCompatibilityMode); +#if ENABLE(ACCELERATED_2D_CANVAS) && USE(ACCELERATED_COMPOSITING) + if (m_context) { + // Need to make sure a RenderLayer and compositing layer get created for the Canvas + setNeedsStyleRecalc(SyntheticStyleChange); + } +#endif } return m_context.get(); } @@ -216,7 +222,7 @@ void HTMLCanvasElement::willDraw(const FloatRect& rect) m_dirtyRect.unite(r); ro->repaintRectangle(enclosingIntRect(m_dirtyRect)); } - + if (m_observer) m_observer->canvasChanged(this, rect); } @@ -299,12 +305,8 @@ bool HTMLCanvasElement::is3D() const void HTMLCanvasElement::makeRenderingResultsAvailable() { -#if ENABLE(3D_CANVAS) - if (is3D()) { - WebGLRenderingContext* context3d = reinterpret_cast<WebGLRenderingContext*>(renderingContext()); - context3d->paintRenderingResultsToCanvas(); - } -#endif + if (m_context) + m_context->paintRenderingResultsToCanvas(); } void HTMLCanvasElement::recalcStyle(StyleChange change) diff --git a/WebCore/html/HTMLCollection.h b/WebCore/html/HTMLCollection.h index eea1777..4359724 100644 --- a/WebCore/html/HTMLCollection.h +++ b/WebCore/html/HTMLCollection.h @@ -31,12 +31,9 @@ namespace WebCore { -class AtomicString; -class AtomicStringImpl; class Element; class Node; class NodeList; -class String; struct CollectionCache; diff --git a/WebCore/html/HTMLConstructionSite.cpp b/WebCore/html/HTMLConstructionSite.cpp index 0b17086..1a9a373 100644 --- a/WebCore/html/HTMLConstructionSite.cpp +++ b/WebCore/html/HTMLConstructionSite.cpp @@ -141,6 +141,13 @@ HTMLConstructionSite::~HTMLConstructionSite() { } +void HTMLConstructionSite::setForm(HTMLFormElement* form) +{ + // This method should only be needed for HTMLTreeBuilder in the fragment case. + ASSERT(!m_form); + m_form = form; +} + PassRefPtr<HTMLFormElement> HTMLConstructionSite::takeForm() { return m_form.release(); @@ -182,7 +189,6 @@ void HTMLConstructionSite::insertHTMLHtmlStartTagInBody(AtomicHTMLToken& token) void HTMLConstructionSite::insertHTMLBodyStartTagInBody(AtomicHTMLToken& token) { // FIXME: parse error - notImplemented(); // fragment case mergeAttributesFromTokenIntoElement(token, m_openElements.bodyElement()); } diff --git a/WebCore/html/HTMLConstructionSite.h b/WebCore/html/HTMLConstructionSite.h index d9c8ac5..16ba56b 100644 --- a/WebCore/html/HTMLConstructionSite.h +++ b/WebCore/html/HTMLConstructionSite.h @@ -84,6 +84,7 @@ public: Element* head() const { return m_head.get(); } + void setForm(HTMLFormElement*); HTMLFormElement* form() const { return m_form.get(); } PassRefPtr<HTMLFormElement> takeForm(); diff --git a/WebCore/html/HTMLDocumentParser.cpp b/WebCore/html/HTMLDocumentParser.cpp index ee1c8af..bd2c590 100644 --- a/WebCore/html/HTMLDocumentParser.cpp +++ b/WebCore/html/HTMLDocumentParser.cpp @@ -29,6 +29,7 @@ #include "DocumentFragment.h" #include "Element.h" #include "Frame.h" +#include "HTMLNames.h" #include "HTMLParserScheduler.h" #include "HTMLTokenizer.h" #include "HTMLPreloadScanner.h" @@ -48,6 +49,8 @@ namespace WebCore { +using namespace HTMLNames; + namespace { class NestingLevelIncrementer : public Noncopyable { @@ -67,6 +70,31 @@ private: int* m_counter; }; +// This is a direct transcription of step 4 from: +// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#fragment-case +HTMLTokenizer::State tokenizerStateForContextElement(Element* contextElement, bool reportErrors) +{ + if (!contextElement) + return HTMLTokenizer::DataState; + + const QualifiedName& contextTag = contextElement->tagQName(); + + if (contextTag.matches(titleTag) || contextTag.matches(textareaTag)) + return HTMLTokenizer::RCDATAState; + if (contextTag.matches(styleTag) + || contextTag.matches(xmpTag) + || contextTag.matches(iframeTag) + || (contextTag.matches(noembedTag) && HTMLTreeBuilder::pluginsEnabled(contextElement->document()->frame())) + || (contextTag.matches(noscriptTag) && HTMLTreeBuilder::scriptEnabled(contextElement->document()->frame())) + || contextTag.matches(noframesTag)) + return reportErrors ? HTMLTokenizer::RAWTEXTState : HTMLTokenizer::PLAINTEXTState; + if (contextTag.matches(scriptTag)) + return reportErrors ? HTMLTokenizer::ScriptDataState : HTMLTokenizer::PLAINTEXTState; + if (contextTag.matches(plaintextTag)) + return HTMLTokenizer::PLAINTEXTState; + return HTMLTokenizer::DataState; +} + } // namespace HTMLDocumentParser::HTMLDocumentParser(HTMLDocument* document, bool reportErrors) @@ -78,19 +106,19 @@ HTMLDocumentParser::HTMLDocumentParser(HTMLDocument* document, bool reportErrors , m_endWasDelayed(false) , m_writeNestingLevel(0) { - begin(); } // FIXME: Member variables should be grouped into self-initializing structs to // minimize code duplication between these constructors. -HTMLDocumentParser::HTMLDocumentParser(DocumentFragment* fragment, FragmentScriptingPermission scriptingPermission) +HTMLDocumentParser::HTMLDocumentParser(DocumentFragment* fragment, Element* contextElement, FragmentScriptingPermission scriptingPermission) : ScriptableDocumentParser(fragment->document()) , m_tokenizer(new HTMLTokenizer) - , m_treeBuilder(new HTMLTreeBuilder(m_tokenizer.get(), fragment, scriptingPermission)) + , m_treeBuilder(new HTMLTreeBuilder(m_tokenizer.get(), fragment, contextElement, scriptingPermission)) , m_endWasDelayed(false) , m_writeNestingLevel(0) { - begin(); + bool reportErrors = false; // For now document fragment parsing never reports errors. + m_tokenizer->setState(tokenizerStateForContextElement(contextElement, reportErrors)); } HTMLDocumentParser::~HTMLDocumentParser() @@ -101,11 +129,6 @@ HTMLDocumentParser::~HTMLDocumentParser() // then we could ASSERT some invariants here. } -void HTMLDocumentParser::begin() -{ - // FIXME: Should we reset the tokenizer? -} - void HTMLDocumentParser::stopParsing() { DocumentParser::stopParsing(); @@ -427,9 +450,9 @@ ScriptController* HTMLDocumentParser::script() const return m_document->frame() ? m_document->frame()->script() : 0; } -void HTMLDocumentParser::parseDocumentFragment(const String& source, DocumentFragment* fragment, FragmentScriptingPermission scriptingPermission) +void HTMLDocumentParser::parseDocumentFragment(const String& source, DocumentFragment* fragment, Element* contextElement, FragmentScriptingPermission scriptingPermission) { - HTMLDocumentParser parser(fragment, scriptingPermission); + HTMLDocumentParser parser(fragment, contextElement, scriptingPermission); parser.insert(source); // Use insert() so that the parser will not yield. parser.finish(); ASSERT(!parser.processingData()); // Make sure we're done. <rdar://problem/3963151> diff --git a/WebCore/html/HTMLDocumentParser.h b/WebCore/html/HTMLDocumentParser.h index cc46d31..d055861 100644 --- a/WebCore/html/HTMLDocumentParser.h +++ b/WebCore/html/HTMLDocumentParser.h @@ -54,13 +54,13 @@ class HTMLDocumentParser : public ScriptableDocumentParser, HTMLScriptRunnerHos public: // FIXME: These constructors should be made private and replaced by create() methods. HTMLDocumentParser(HTMLDocument*, bool reportErrors); - HTMLDocumentParser(DocumentFragment*, FragmentScriptingPermission); + HTMLDocumentParser(DocumentFragment*, Element* contextElement, FragmentScriptingPermission); virtual ~HTMLDocumentParser(); // Exposed for HTMLParserScheduler void resumeParsingAfterYield(); - static void parseDocumentFragment(const String&, DocumentFragment*, FragmentScriptingPermission = FragmentScriptingAllowed); + static void parseDocumentFragment(const String&, DocumentFragment*, Element* contextElement, FragmentScriptingPermission = FragmentScriptingAllowed); private: // DocumentParser diff --git a/WebCore/html/HTMLElement.cpp b/WebCore/html/HTMLElement.cpp index fb1bcc2..6fc53a2 100644 --- a/WebCore/html/HTMLElement.cpp +++ b/WebCore/html/HTMLElement.cpp @@ -275,6 +275,7 @@ String HTMLElement::outerHTML() const return createMarkup(this); } +// FIXME: This method is unecessary with the new HTMLDocumentParser. PassRefPtr<DocumentFragment> HTMLElement::createContextualFragment(const String& markup, FragmentScriptingPermission scriptingPermission) { // The following is in accordance with the definition as used by IE. @@ -340,6 +341,7 @@ static void replaceChildrenWithText(HTMLElement* element, const String& text, Ex void HTMLElement::setInnerHTML(const String& html, ExceptionCode& ec) { + // FIXME: This code can be removed, it's handled by the HTMLDocumentParser correctly. if (hasLocalName(scriptTag) || hasLocalName(styleTag)) { // Script and CSS source shouldn't be parsed as HTML. removeChildren(); @@ -551,7 +553,7 @@ void HTMLElement::insertAdjacentHTML(const String& where, const String& markup, { RefPtr<DocumentFragment> fragment = document()->createDocumentFragment(); if (document()->isHTMLDocument()) - fragment->parseHTML(markup); + fragment->parseHTML(markup, this); else { if (!fragment->parseXML(markup, this)) // FIXME: We should propagate a syntax error exception out here. @@ -986,7 +988,7 @@ bool HTMLElement::checkDTD(const Node* newChild) return true; return inEitherTagList(newChild); } - + bool HTMLElement::rendererIsNeeded(RenderStyle *style) { #if !ENABLE(XHTMLMP) @@ -994,11 +996,16 @@ bool HTMLElement::rendererIsNeeded(RenderStyle *style) Frame* frame = document()->frame(); if (frame && frame->script()->canExecuteScripts(NotAboutToExecuteScript)) return false; - } + } else #endif + if (hasLocalName(noembedTag)) { + Frame* frame = document()->frame(); + if (frame && frame->loader()->subframeLoader()->allowPlugins(NotAboutToInstantiatePlugin)) + return false; + } return StyledElement::rendererIsNeeded(style); } - + RenderObject* HTMLElement::createRenderer(RenderArena* arena, RenderStyle* style) { if (hasLocalName(wbrTag)) diff --git a/WebCore/html/HTMLElementStack.cpp b/WebCore/html/HTMLElementStack.cpp index 531a3b4..194753b 100644 --- a/WebCore/html/HTMLElementStack.cpp +++ b/WebCore/html/HTMLElementStack.cpp @@ -138,6 +138,23 @@ HTMLElementStack::~HTMLElementStack() { } +bool HTMLElementStack::hasOnlyOneElement() const +{ + return !topRecord()->next(); +} + +bool HTMLElementStack::secondElementIsHTMLBodyElement() const +{ + // This is used the fragment case of <body> and <frameset> in the "in body" + // insertion mode. + // http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#parsing-main-inbody + ASSERT(m_htmlElement); + // If we have a body element, it must always be the second element on the + // stack, as we always start with an html element, and any other element + // would cause the implicit creation of a body element. + return !!m_bodyElement; +} + void HTMLElementStack::popHTMLHeadElement() { ASSERT(top() == m_headElement); diff --git a/WebCore/html/HTMLElementStack.h b/WebCore/html/HTMLElementStack.h index 62d031f..73cfcb1 100644 --- a/WebCore/html/HTMLElementStack.h +++ b/WebCore/html/HTMLElementStack.h @@ -26,6 +26,7 @@ #ifndef HTMLElementStack_h #define HTMLElementStack_h +#include <wtf/Forward.h> #include <wtf/Noncopyable.h> #include <wtf/OwnPtr.h> #include <wtf/PassOwnPtr.h> @@ -33,7 +34,6 @@ namespace WebCore { -class AtomicString; class Element; class QualifiedName; @@ -121,6 +121,9 @@ public: bool hasOnlyHTMLElementsInScope() const; bool hasNumberedHeaderElementInScope() const; + bool hasOnlyOneElement() const; + bool secondElementIsHTMLBodyElement() const; + Element* htmlElement() const; Element* headElement() const; Element* bodyElement() const; diff --git a/WebCore/html/HTMLEntityNames.json b/WebCore/html/HTMLEntityNames.json index 7be8c5b..da3b881 100644 --- a/WebCore/html/HTMLEntityNames.json +++ b/WebCore/html/HTMLEntityNames.json @@ -1,8554 +1,8554 @@ [ { - entity: "AElig;", - value: "U+000C6" + "entity": "AElig;", + "value": "U+000C6" }, { - entity: "AElig", - value: "U+000C6" + "entity": "AElig", + "value": "U+000C6" }, { - entity: "AMP;", - value: "U+00026" + "entity": "AMP;", + "value": "U+00026" }, { - entity: "AMP", - value: "U+00026" + "entity": "AMP", + "value": "U+00026" }, { - entity: "Aacute;", - value: "U+000C1" + "entity": "Aacute;", + "value": "U+000C1" }, { - entity: "Aacute", - value: "U+000C1" + "entity": "Aacute", + "value": "U+000C1" }, { - entity: "Abreve;", - value: "U+00102" + "entity": "Abreve;", + "value": "U+00102" }, { - entity: "Acirc;", - value: "U+000C2" + "entity": "Acirc;", + "value": "U+000C2" }, { - entity: "Acirc", - value: "U+000C2" + "entity": "Acirc", + "value": "U+000C2" }, { - entity: "Acy;", - value: "U+00410" + "entity": "Acy;", + "value": "U+00410" }, { - entity: "Afr;", - value: "U+1D504" + "entity": "Afr;", + "value": "U+1D504" }, { - entity: "Agrave;", - value: "U+000C0" + "entity": "Agrave;", + "value": "U+000C0" }, { - entity: "Agrave", - value: "U+000C0" + "entity": "Agrave", + "value": "U+000C0" }, { - entity: "Alpha;", - value: "U+00391" + "entity": "Alpha;", + "value": "U+00391" }, { - entity: "Amacr;", - value: "U+00100" + "entity": "Amacr;", + "value": "U+00100" }, { - entity: "And;", - value: "U+02A53" + "entity": "And;", + "value": "U+02A53" }, { - entity: "Aogon;", - value: "U+00104" + "entity": "Aogon;", + "value": "U+00104" }, { - entity: "Aopf;", - value: "U+1D538" + "entity": "Aopf;", + "value": "U+1D538" }, { - entity: "ApplyFunction;", - value: "U+02061" + "entity": "ApplyFunction;", + "value": "U+02061" }, { - entity: "Aring;", - value: "U+000C5" + "entity": "Aring;", + "value": "U+000C5" }, { - entity: "Aring", - value: "U+000C5" + "entity": "Aring", + "value": "U+000C5" }, { - entity: "Ascr;", - value: "U+1D49C" + "entity": "Ascr;", + "value": "U+1D49C" }, { - entity: "Assign;", - value: "U+02254" + "entity": "Assign;", + "value": "U+02254" }, { - entity: "Atilde;", - value: "U+000C3" + "entity": "Atilde;", + "value": "U+000C3" }, { - entity: "Atilde", - value: "U+000C3" + "entity": "Atilde", + "value": "U+000C3" }, { - entity: "Auml;", - value: "U+000C4" + "entity": "Auml;", + "value": "U+000C4" }, { - entity: "Auml", - value: "U+000C4" + "entity": "Auml", + "value": "U+000C4" }, { - entity: "Backslash;", - value: "U+02216" + "entity": "Backslash;", + "value": "U+02216" }, { - entity: "Barv;", - value: "U+02AE7" + "entity": "Barv;", + "value": "U+02AE7" }, { - entity: "Barwed;", - value: "U+02306" + "entity": "Barwed;", + "value": "U+02306" }, { - entity: "Bcy;", - value: "U+00411" + "entity": "Bcy;", + "value": "U+00411" }, { - entity: "Because;", - value: "U+02235" + "entity": "Because;", + "value": "U+02235" }, { - entity: "Bernoullis;", - value: "U+0212C" + "entity": "Bernoullis;", + "value": "U+0212C" }, { - entity: "Beta;", - value: "U+00392" + "entity": "Beta;", + "value": "U+00392" }, { - entity: "Bfr;", - value: "U+1D505" + "entity": "Bfr;", + "value": "U+1D505" }, { - entity: "Bopf;", - value: "U+1D539" + "entity": "Bopf;", + "value": "U+1D539" }, { - entity: "Breve;", - value: "U+002D8" + "entity": "Breve;", + "value": "U+002D8" }, { - entity: "Bscr;", - value: "U+0212C" + "entity": "Bscr;", + "value": "U+0212C" }, { - entity: "Bumpeq;", - value: "U+0224E" + "entity": "Bumpeq;", + "value": "U+0224E" }, { - entity: "CHcy;", - value: "U+00427" + "entity": "CHcy;", + "value": "U+00427" }, { - entity: "COPY;", - value: "U+000A9" + "entity": "COPY;", + "value": "U+000A9" }, { - entity: "COPY", - value: "U+000A9" + "entity": "COPY", + "value": "U+000A9" }, { - entity: "Cacute;", - value: "U+00106" + "entity": "Cacute;", + "value": "U+00106" }, { - entity: "Cap;", - value: "U+022D2" + "entity": "Cap;", + "value": "U+022D2" }, { - entity: "CapitalDifferentialD;", - value: "U+02145" + "entity": "CapitalDifferentialD;", + "value": "U+02145" }, { - entity: "Cayleys;", - value: "U+0212D" + "entity": "Cayleys;", + "value": "U+0212D" }, { - entity: "Ccaron;", - value: "U+0010C" + "entity": "Ccaron;", + "value": "U+0010C" }, { - entity: "Ccedil;", - value: "U+000C7" + "entity": "Ccedil;", + "value": "U+000C7" }, { - entity: "Ccedil", - value: "U+000C7" + "entity": "Ccedil", + "value": "U+000C7" }, { - entity: "Ccirc;", - value: "U+00108" + "entity": "Ccirc;", + "value": "U+00108" }, { - entity: "Cconint;", - value: "U+02230" + "entity": "Cconint;", + "value": "U+02230" }, { - entity: "Cdot;", - value: "U+0010A" + "entity": "Cdot;", + "value": "U+0010A" }, { - entity: "Cedilla;", - value: "U+000B8" + "entity": "Cedilla;", + "value": "U+000B8" }, { - entity: "CenterDot;", - value: "U+000B7" + "entity": "CenterDot;", + "value": "U+000B7" }, { - entity: "Cfr;", - value: "U+0212D" + "entity": "Cfr;", + "value": "U+0212D" }, { - entity: "Chi;", - value: "U+003A7" + "entity": "Chi;", + "value": "U+003A7" }, { - entity: "CircleDot;", - value: "U+02299" + "entity": "CircleDot;", + "value": "U+02299" }, { - entity: "CircleMinus;", - value: "U+02296" + "entity": "CircleMinus;", + "value": "U+02296" }, { - entity: "CirclePlus;", - value: "U+02295" + "entity": "CirclePlus;", + "value": "U+02295" }, { - entity: "CircleTimes;", - value: "U+02297" + "entity": "CircleTimes;", + "value": "U+02297" }, { - entity: "ClockwiseContourIntegral;", - value: "U+02232" + "entity": "ClockwiseContourIntegral;", + "value": "U+02232" }, { - entity: "CloseCurlyDoubleQuote;", - value: "U+0201D" + "entity": "CloseCurlyDoubleQuote;", + "value": "U+0201D" }, { - entity: "CloseCurlyQuote;", - value: "U+02019" + "entity": "CloseCurlyQuote;", + "value": "U+02019" }, { - entity: "Colon;", - value: "U+02237" + "entity": "Colon;", + "value": "U+02237" }, { - entity: "Colone;", - value: "U+02A74" + "entity": "Colone;", + "value": "U+02A74" }, { - entity: "Congruent;", - value: "U+02261" + "entity": "Congruent;", + "value": "U+02261" }, { - entity: "Conint;", - value: "U+0222F" + "entity": "Conint;", + "value": "U+0222F" }, { - entity: "ContourIntegral;", - value: "U+0222E" + "entity": "ContourIntegral;", + "value": "U+0222E" }, { - entity: "Copf;", - value: "U+02102" + "entity": "Copf;", + "value": "U+02102" }, { - entity: "Coproduct;", - value: "U+02210" + "entity": "Coproduct;", + "value": "U+02210" }, { - entity: "CounterClockwiseContourIntegral;", - value: "U+02233" + "entity": "CounterClockwiseContourIntegral;", + "value": "U+02233" }, { - entity: "Cross;", - value: "U+02A2F" + "entity": "Cross;", + "value": "U+02A2F" }, { - entity: "Cscr;", - value: "U+1D49E" + "entity": "Cscr;", + "value": "U+1D49E" }, { - entity: "Cup;", - value: "U+022D3" + "entity": "Cup;", + "value": "U+022D3" }, { - entity: "CupCap;", - value: "U+0224D" + "entity": "CupCap;", + "value": "U+0224D" }, { - entity: "DD;", - value: "U+02145" + "entity": "DD;", + "value": "U+02145" }, { - entity: "DDotrahd;", - value: "U+02911" + "entity": "DDotrahd;", + "value": "U+02911" }, { - entity: "DJcy;", - value: "U+00402" + "entity": "DJcy;", + "value": "U+00402" }, { - entity: "DScy;", - value: "U+00405" + "entity": "DScy;", + "value": "U+00405" }, { - entity: "DZcy;", - value: "U+0040F" + "entity": "DZcy;", + "value": "U+0040F" }, { - entity: "Dagger;", - value: "U+02021" + "entity": "Dagger;", + "value": "U+02021" }, { - entity: "Darr;", - value: "U+021A1" + "entity": "Darr;", + "value": "U+021A1" }, { - entity: "Dashv;", - value: "U+02AE4" + "entity": "Dashv;", + "value": "U+02AE4" }, { - entity: "Dcaron;", - value: "U+0010E" + "entity": "Dcaron;", + "value": "U+0010E" }, { - entity: "Dcy;", - value: "U+00414" + "entity": "Dcy;", + "value": "U+00414" }, { - entity: "Del;", - value: "U+02207" + "entity": "Del;", + "value": "U+02207" }, { - entity: "Delta;", - value: "U+00394" + "entity": "Delta;", + "value": "U+00394" }, { - entity: "Dfr;", - value: "U+1D507" + "entity": "Dfr;", + "value": "U+1D507" }, { - entity: "DiacriticalAcute;", - value: "U+000B4" + "entity": "DiacriticalAcute;", + "value": "U+000B4" }, { - entity: "DiacriticalDot;", - value: "U+002D9" + "entity": "DiacriticalDot;", + "value": "U+002D9" }, { - entity: "DiacriticalDoubleAcute;", - value: "U+002DD" + "entity": "DiacriticalDoubleAcute;", + "value": "U+002DD" }, { - entity: "DiacriticalGrave;", - value: "U+00060" + "entity": "DiacriticalGrave;", + "value": "U+00060" }, { - entity: "DiacriticalTilde;", - value: "U+002DC" + "entity": "DiacriticalTilde;", + "value": "U+002DC" }, { - entity: "Diamond;", - value: "U+022C4" + "entity": "Diamond;", + "value": "U+022C4" }, { - entity: "DifferentialD;", - value: "U+02146" + "entity": "DifferentialD;", + "value": "U+02146" }, { - entity: "Dopf;", - value: "U+1D53B" + "entity": "Dopf;", + "value": "U+1D53B" }, { - entity: "Dot;", - value: "U+000A8" + "entity": "Dot;", + "value": "U+000A8" }, { - entity: "DotDot;", - value: "U+020DC" + "entity": "DotDot;", + "value": "U+020DC" }, { - entity: "DotEqual;", - value: "U+02250" + "entity": "DotEqual;", + "value": "U+02250" }, { - entity: "DoubleContourIntegral;", - value: "U+0222F" + "entity": "DoubleContourIntegral;", + "value": "U+0222F" }, { - entity: "DoubleDot;", - value: "U+000A8" + "entity": "DoubleDot;", + "value": "U+000A8" }, { - entity: "DoubleDownArrow;", - value: "U+021D3" + "entity": "DoubleDownArrow;", + "value": "U+021D3" }, { - entity: "DoubleLeftArrow;", - value: "U+021D0" + "entity": "DoubleLeftArrow;", + "value": "U+021D0" }, { - entity: "DoubleLeftRightArrow;", - value: "U+021D4" + "entity": "DoubleLeftRightArrow;", + "value": "U+021D4" }, { - entity: "DoubleLeftTee;", - value: "U+02AE4" + "entity": "DoubleLeftTee;", + "value": "U+02AE4" }, { - entity: "DoubleLongLeftArrow;", - value: "U+027F8" + "entity": "DoubleLongLeftArrow;", + "value": "U+027F8" }, { - entity: "DoubleLongLeftRightArrow;", - value: "U+027FA" + "entity": "DoubleLongLeftRightArrow;", + "value": "U+027FA" }, { - entity: "DoubleLongRightArrow;", - value: "U+027F9" + "entity": "DoubleLongRightArrow;", + "value": "U+027F9" }, { - entity: "DoubleRightArrow;", - value: "U+021D2" + "entity": "DoubleRightArrow;", + "value": "U+021D2" }, { - entity: "DoubleRightTee;", - value: "U+022A8" + "entity": "DoubleRightTee;", + "value": "U+022A8" }, { - entity: "DoubleUpArrow;", - value: "U+021D1" + "entity": "DoubleUpArrow;", + "value": "U+021D1" }, { - entity: "DoubleUpDownArrow;", - value: "U+021D5" + "entity": "DoubleUpDownArrow;", + "value": "U+021D5" }, { - entity: "DoubleVerticalBar;", - value: "U+02225" + "entity": "DoubleVerticalBar;", + "value": "U+02225" }, { - entity: "DownArrow;", - value: "U+02193" + "entity": "DownArrow;", + "value": "U+02193" }, { - entity: "DownArrowBar;", - value: "U+02913" + "entity": "DownArrowBar;", + "value": "U+02913" }, { - entity: "DownArrowUpArrow;", - value: "U+021F5" + "entity": "DownArrowUpArrow;", + "value": "U+021F5" }, { - entity: "DownBreve;", - value: "U+00311" + "entity": "DownBreve;", + "value": "U+00311" }, { - entity: "DownLeftRightVector;", - value: "U+02950" + "entity": "DownLeftRightVector;", + "value": "U+02950" }, { - entity: "DownLeftTeeVector;", - value: "U+0295E" + "entity": "DownLeftTeeVector;", + "value": "U+0295E" }, { - entity: "DownLeftVector;", - value: "U+021BD" + "entity": "DownLeftVector;", + "value": "U+021BD" }, { - entity: "DownLeftVectorBar;", - value: "U+02956" + "entity": "DownLeftVectorBar;", + "value": "U+02956" }, { - entity: "DownRightTeeVector;", - value: "U+0295F" + "entity": "DownRightTeeVector;", + "value": "U+0295F" }, { - entity: "DownRightVector;", - value: "U+021C1" + "entity": "DownRightVector;", + "value": "U+021C1" }, { - entity: "DownRightVectorBar;", - value: "U+02957" + "entity": "DownRightVectorBar;", + "value": "U+02957" }, { - entity: "DownTee;", - value: "U+022A4" + "entity": "DownTee;", + "value": "U+022A4" }, { - entity: "DownTeeArrow;", - value: "U+021A7" + "entity": "DownTeeArrow;", + "value": "U+021A7" }, { - entity: "Downarrow;", - value: "U+021D3" + "entity": "Downarrow;", + "value": "U+021D3" }, { - entity: "Dscr;", - value: "U+1D49F" + "entity": "Dscr;", + "value": "U+1D49F" }, { - entity: "Dstrok;", - value: "U+00110" + "entity": "Dstrok;", + "value": "U+00110" }, { - entity: "ENG;", - value: "U+0014A" + "entity": "ENG;", + "value": "U+0014A" }, { - entity: "ETH;", - value: "U+000D0" + "entity": "ETH;", + "value": "U+000D0" }, { - entity: "ETH", - value: "U+000D0" + "entity": "ETH", + "value": "U+000D0" }, { - entity: "Eacute;", - value: "U+000C9" + "entity": "Eacute;", + "value": "U+000C9" }, { - entity: "Eacute", - value: "U+000C9" + "entity": "Eacute", + "value": "U+000C9" }, { - entity: "Ecaron;", - value: "U+0011A" + "entity": "Ecaron;", + "value": "U+0011A" }, { - entity: "Ecirc;", - value: "U+000CA" + "entity": "Ecirc;", + "value": "U+000CA" }, { - entity: "Ecirc", - value: "U+000CA" + "entity": "Ecirc", + "value": "U+000CA" }, { - entity: "Ecy;", - value: "U+0042D" + "entity": "Ecy;", + "value": "U+0042D" }, { - entity: "Edot;", - value: "U+00116" + "entity": "Edot;", + "value": "U+00116" }, { - entity: "Efr;", - value: "U+1D508" + "entity": "Efr;", + "value": "U+1D508" }, { - entity: "Egrave;", - value: "U+000C8" + "entity": "Egrave;", + "value": "U+000C8" }, { - entity: "Egrave", - value: "U+000C8" + "entity": "Egrave", + "value": "U+000C8" }, { - entity: "Element;", - value: "U+02208" + "entity": "Element;", + "value": "U+02208" }, { - entity: "Emacr;", - value: "U+00112" + "entity": "Emacr;", + "value": "U+00112" }, { - entity: "EmptySmallSquare;", - value: "U+025FB" + "entity": "EmptySmallSquare;", + "value": "U+025FB" }, { - entity: "EmptyVerySmallSquare;", - value: "U+025AB" + "entity": "EmptyVerySmallSquare;", + "value": "U+025AB" }, { - entity: "Eogon;", - value: "U+00118" + "entity": "Eogon;", + "value": "U+00118" }, { - entity: "Eopf;", - value: "U+1D53C" + "entity": "Eopf;", + "value": "U+1D53C" }, { - entity: "Epsilon;", - value: "U+00395" + "entity": "Epsilon;", + "value": "U+00395" }, { - entity: "Equal;", - value: "U+02A75" + "entity": "Equal;", + "value": "U+02A75" }, { - entity: "EqualTilde;", - value: "U+02242" + "entity": "EqualTilde;", + "value": "U+02242" }, { - entity: "Equilibrium;", - value: "U+021CC" + "entity": "Equilibrium;", + "value": "U+021CC" }, { - entity: "Escr;", - value: "U+02130" + "entity": "Escr;", + "value": "U+02130" }, { - entity: "Esim;", - value: "U+02A73" + "entity": "Esim;", + "value": "U+02A73" }, { - entity: "Eta;", - value: "U+00397" + "entity": "Eta;", + "value": "U+00397" }, { - entity: "Euml;", - value: "U+000CB" + "entity": "Euml;", + "value": "U+000CB" }, { - entity: "Euml", - value: "U+000CB" + "entity": "Euml", + "value": "U+000CB" }, { - entity: "Exists;", - value: "U+02203" + "entity": "Exists;", + "value": "U+02203" }, { - entity: "ExponentialE;", - value: "U+02147" + "entity": "ExponentialE;", + "value": "U+02147" }, { - entity: "Fcy;", - value: "U+00424" + "entity": "Fcy;", + "value": "U+00424" }, { - entity: "Ffr;", - value: "U+1D509" + "entity": "Ffr;", + "value": "U+1D509" }, { - entity: "FilledSmallSquare;", - value: "U+025FC" + "entity": "FilledSmallSquare;", + "value": "U+025FC" }, { - entity: "FilledVerySmallSquare;", - value: "U+025AA" + "entity": "FilledVerySmallSquare;", + "value": "U+025AA" }, { - entity: "Fopf;", - value: "U+1D53D" + "entity": "Fopf;", + "value": "U+1D53D" }, { - entity: "ForAll;", - value: "U+02200" + "entity": "ForAll;", + "value": "U+02200" }, { - entity: "Fouriertrf;", - value: "U+02131" + "entity": "Fouriertrf;", + "value": "U+02131" }, { - entity: "Fscr;", - value: "U+02131" + "entity": "Fscr;", + "value": "U+02131" }, { - entity: "GJcy;", - value: "U+00403" + "entity": "GJcy;", + "value": "U+00403" }, { - entity: "GT;", - value: "U+0003E" + "entity": "GT;", + "value": "U+0003E" }, { - entity: "GT", - value: "U+0003E" + "entity": "GT", + "value": "U+0003E" }, { - entity: "Gamma;", - value: "U+00393" + "entity": "Gamma;", + "value": "U+00393" }, { - entity: "Gammad;", - value: "U+003DC" + "entity": "Gammad;", + "value": "U+003DC" }, { - entity: "Gbreve;", - value: "U+0011E" + "entity": "Gbreve;", + "value": "U+0011E" }, { - entity: "Gcedil;", - value: "U+00122" + "entity": "Gcedil;", + "value": "U+00122" }, { - entity: "Gcirc;", - value: "U+0011C" + "entity": "Gcirc;", + "value": "U+0011C" }, { - entity: "Gcy;", - value: "U+00413" + "entity": "Gcy;", + "value": "U+00413" }, { - entity: "Gdot;", - value: "U+00120" + "entity": "Gdot;", + "value": "U+00120" }, { - entity: "Gfr;", - value: "U+1D50A" + "entity": "Gfr;", + "value": "U+1D50A" }, { - entity: "Gg;", - value: "U+022D9" + "entity": "Gg;", + "value": "U+022D9" }, { - entity: "Gopf;", - value: "U+1D53E" + "entity": "Gopf;", + "value": "U+1D53E" }, { - entity: "GreaterEqual;", - value: "U+02265" + "entity": "GreaterEqual;", + "value": "U+02265" }, { - entity: "GreaterEqualLess;", - value: "U+022DB" + "entity": "GreaterEqualLess;", + "value": "U+022DB" }, { - entity: "GreaterFullEqual;", - value: "U+02267" + "entity": "GreaterFullEqual;", + "value": "U+02267" }, { - entity: "GreaterGreater;", - value: "U+02AA2" + "entity": "GreaterGreater;", + "value": "U+02AA2" }, { - entity: "GreaterLess;", - value: "U+02277" + "entity": "GreaterLess;", + "value": "U+02277" }, { - entity: "GreaterSlantEqual;", - value: "U+02A7E" + "entity": "GreaterSlantEqual;", + "value": "U+02A7E" }, { - entity: "GreaterTilde;", - value: "U+02273" + "entity": "GreaterTilde;", + "value": "U+02273" }, { - entity: "Gscr;", - value: "U+1D4A2" + "entity": "Gscr;", + "value": "U+1D4A2" }, { - entity: "Gt;", - value: "U+0226B" + "entity": "Gt;", + "value": "U+0226B" }, { - entity: "HARDcy;", - value: "U+0042A" + "entity": "HARDcy;", + "value": "U+0042A" }, { - entity: "Hacek;", - value: "U+002C7" + "entity": "Hacek;", + "value": "U+002C7" }, { - entity: "Hat;", - value: "U+0005E" + "entity": "Hat;", + "value": "U+0005E" }, { - entity: "Hcirc;", - value: "U+00124" + "entity": "Hcirc;", + "value": "U+00124" }, { - entity: "Hfr;", - value: "U+0210C" + "entity": "Hfr;", + "value": "U+0210C" }, { - entity: "HilbertSpace;", - value: "U+0210B" + "entity": "HilbertSpace;", + "value": "U+0210B" }, { - entity: "Hopf;", - value: "U+0210D" + "entity": "Hopf;", + "value": "U+0210D" }, { - entity: "HorizontalLine;", - value: "U+02500" + "entity": "HorizontalLine;", + "value": "U+02500" }, { - entity: "Hscr;", - value: "U+0210B" + "entity": "Hscr;", + "value": "U+0210B" }, { - entity: "Hstrok;", - value: "U+00126" + "entity": "Hstrok;", + "value": "U+00126" }, { - entity: "HumpDownHump;", - value: "U+0224E" + "entity": "HumpDownHump;", + "value": "U+0224E" }, { - entity: "HumpEqual;", - value: "U+0224F" + "entity": "HumpEqual;", + "value": "U+0224F" }, { - entity: "IEcy;", - value: "U+00415" + "entity": "IEcy;", + "value": "U+00415" }, { - entity: "IJlig;", - value: "U+00132" + "entity": "IJlig;", + "value": "U+00132" }, { - entity: "IOcy;", - value: "U+00401" + "entity": "IOcy;", + "value": "U+00401" }, { - entity: "Iacute;", - value: "U+000CD" + "entity": "Iacute;", + "value": "U+000CD" }, { - entity: "Iacute", - value: "U+000CD" + "entity": "Iacute", + "value": "U+000CD" }, { - entity: "Icirc;", - value: "U+000CE" + "entity": "Icirc;", + "value": "U+000CE" }, { - entity: "Icirc", - value: "U+000CE" + "entity": "Icirc", + "value": "U+000CE" }, { - entity: "Icy;", - value: "U+00418" + "entity": "Icy;", + "value": "U+00418" }, { - entity: "Idot;", - value: "U+00130" + "entity": "Idot;", + "value": "U+00130" }, { - entity: "Ifr;", - value: "U+02111" + "entity": "Ifr;", + "value": "U+02111" }, { - entity: "Igrave;", - value: "U+000CC" + "entity": "Igrave;", + "value": "U+000CC" }, { - entity: "Igrave", - value: "U+000CC" + "entity": "Igrave", + "value": "U+000CC" }, { - entity: "Im;", - value: "U+02111" + "entity": "Im;", + "value": "U+02111" }, { - entity: "Imacr;", - value: "U+0012A" + "entity": "Imacr;", + "value": "U+0012A" }, { - entity: "ImaginaryI;", - value: "U+02148" + "entity": "ImaginaryI;", + "value": "U+02148" }, { - entity: "Implies;", - value: "U+021D2" + "entity": "Implies;", + "value": "U+021D2" }, { - entity: "Int;", - value: "U+0222C" + "entity": "Int;", + "value": "U+0222C" }, { - entity: "Integral;", - value: "U+0222B" + "entity": "Integral;", + "value": "U+0222B" }, { - entity: "Intersection;", - value: "U+022C2" + "entity": "Intersection;", + "value": "U+022C2" }, { - entity: "InvisibleComma;", - value: "U+02063" + "entity": "InvisibleComma;", + "value": "U+02063" }, { - entity: "InvisibleTimes;", - value: "U+02062" + "entity": "InvisibleTimes;", + "value": "U+02062" }, { - entity: "Iogon;", - value: "U+0012E" + "entity": "Iogon;", + "value": "U+0012E" }, { - entity: "Iopf;", - value: "U+1D540" + "entity": "Iopf;", + "value": "U+1D540" }, { - entity: "Iota;", - value: "U+00399" + "entity": "Iota;", + "value": "U+00399" }, { - entity: "Iscr;", - value: "U+02110" + "entity": "Iscr;", + "value": "U+02110" }, { - entity: "Itilde;", - value: "U+00128" + "entity": "Itilde;", + "value": "U+00128" }, { - entity: "Iukcy;", - value: "U+00406" + "entity": "Iukcy;", + "value": "U+00406" }, { - entity: "Iuml;", - value: "U+000CF" + "entity": "Iuml;", + "value": "U+000CF" }, { - entity: "Iuml", - value: "U+000CF" + "entity": "Iuml", + "value": "U+000CF" }, { - entity: "Jcirc;", - value: "U+00134" + "entity": "Jcirc;", + "value": "U+00134" }, { - entity: "Jcy;", - value: "U+00419" + "entity": "Jcy;", + "value": "U+00419" }, { - entity: "Jfr;", - value: "U+1D50D" + "entity": "Jfr;", + "value": "U+1D50D" }, { - entity: "Jopf;", - value: "U+1D541" + "entity": "Jopf;", + "value": "U+1D541" }, { - entity: "Jscr;", - value: "U+1D4A5" + "entity": "Jscr;", + "value": "U+1D4A5" }, { - entity: "Jsercy;", - value: "U+00408" + "entity": "Jsercy;", + "value": "U+00408" }, { - entity: "Jukcy;", - value: "U+00404" + "entity": "Jukcy;", + "value": "U+00404" }, { - entity: "KHcy;", - value: "U+00425" + "entity": "KHcy;", + "value": "U+00425" }, { - entity: "KJcy;", - value: "U+0040C" + "entity": "KJcy;", + "value": "U+0040C" }, { - entity: "Kappa;", - value: "U+0039A" + "entity": "Kappa;", + "value": "U+0039A" }, { - entity: "Kcedil;", - value: "U+00136" + "entity": "Kcedil;", + "value": "U+00136" }, { - entity: "Kcy;", - value: "U+0041A" + "entity": "Kcy;", + "value": "U+0041A" }, { - entity: "Kfr;", - value: "U+1D50E" + "entity": "Kfr;", + "value": "U+1D50E" }, { - entity: "Kopf;", - value: "U+1D542" + "entity": "Kopf;", + "value": "U+1D542" }, { - entity: "Kscr;", - value: "U+1D4A6" + "entity": "Kscr;", + "value": "U+1D4A6" }, { - entity: "LJcy;", - value: "U+00409" + "entity": "LJcy;", + "value": "U+00409" }, { - entity: "LT;", - value: "U+0003C" + "entity": "LT;", + "value": "U+0003C" }, { - entity: "LT", - value: "U+0003C" + "entity": "LT", + "value": "U+0003C" }, { - entity: "Lacute;", - value: "U+00139" + "entity": "Lacute;", + "value": "U+00139" }, { - entity: "Lambda;", - value: "U+0039B" + "entity": "Lambda;", + "value": "U+0039B" }, { - entity: "Lang;", - value: "U+027EA" + "entity": "Lang;", + "value": "U+027EA" }, { - entity: "Laplacetrf;", - value: "U+02112" + "entity": "Laplacetrf;", + "value": "U+02112" }, { - entity: "Larr;", - value: "U+0219E" + "entity": "Larr;", + "value": "U+0219E" }, { - entity: "Lcaron;", - value: "U+0013D" + "entity": "Lcaron;", + "value": "U+0013D" }, { - entity: "Lcedil;", - value: "U+0013B" + "entity": "Lcedil;", + "value": "U+0013B" }, { - entity: "Lcy;", - value: "U+0041B" + "entity": "Lcy;", + "value": "U+0041B" }, { - entity: "LeftAngleBracket;", - value: "U+027E8" + "entity": "LeftAngleBracket;", + "value": "U+027E8" }, { - entity: "LeftArrow;", - value: "U+02190" + "entity": "LeftArrow;", + "value": "U+02190" }, { - entity: "LeftArrowBar;", - value: "U+021E4" + "entity": "LeftArrowBar;", + "value": "U+021E4" }, { - entity: "LeftArrowRightArrow;", - value: "U+021C6" + "entity": "LeftArrowRightArrow;", + "value": "U+021C6" }, { - entity: "LeftCeiling;", - value: "U+02308" + "entity": "LeftCeiling;", + "value": "U+02308" }, { - entity: "LeftDoubleBracket;", - value: "U+027E6" + "entity": "LeftDoubleBracket;", + "value": "U+027E6" }, { - entity: "LeftDownTeeVector;", - value: "U+02961" + "entity": "LeftDownTeeVector;", + "value": "U+02961" }, { - entity: "LeftDownVector;", - value: "U+021C3" + "entity": "LeftDownVector;", + "value": "U+021C3" }, { - entity: "LeftDownVectorBar;", - value: "U+02959" + "entity": "LeftDownVectorBar;", + "value": "U+02959" }, { - entity: "LeftFloor;", - value: "U+0230A" + "entity": "LeftFloor;", + "value": "U+0230A" }, { - entity: "LeftRightArrow;", - value: "U+02194" + "entity": "LeftRightArrow;", + "value": "U+02194" }, { - entity: "LeftRightVector;", - value: "U+0294E" + "entity": "LeftRightVector;", + "value": "U+0294E" }, { - entity: "LeftTee;", - value: "U+022A3" + "entity": "LeftTee;", + "value": "U+022A3" }, { - entity: "LeftTeeArrow;", - value: "U+021A4" + "entity": "LeftTeeArrow;", + "value": "U+021A4" }, { - entity: "LeftTeeVector;", - value: "U+0295A" + "entity": "LeftTeeVector;", + "value": "U+0295A" }, { - entity: "LeftTriangle;", - value: "U+022B2" + "entity": "LeftTriangle;", + "value": "U+022B2" }, { - entity: "LeftTriangleBar;", - value: "U+029CF" + "entity": "LeftTriangleBar;", + "value": "U+029CF" }, { - entity: "LeftTriangleEqual;", - value: "U+022B4" + "entity": "LeftTriangleEqual;", + "value": "U+022B4" }, { - entity: "LeftUpDownVector;", - value: "U+02951" + "entity": "LeftUpDownVector;", + "value": "U+02951" }, { - entity: "LeftUpTeeVector;", - value: "U+02960" + "entity": "LeftUpTeeVector;", + "value": "U+02960" }, { - entity: "LeftUpVector;", - value: "U+021BF" + "entity": "LeftUpVector;", + "value": "U+021BF" }, { - entity: "LeftUpVectorBar;", - value: "U+02958" + "entity": "LeftUpVectorBar;", + "value": "U+02958" }, { - entity: "LeftVector;", - value: "U+021BC" + "entity": "LeftVector;", + "value": "U+021BC" }, { - entity: "LeftVectorBar;", - value: "U+02952" + "entity": "LeftVectorBar;", + "value": "U+02952" }, { - entity: "Leftarrow;", - value: "U+021D0" + "entity": "Leftarrow;", + "value": "U+021D0" }, { - entity: "Leftrightarrow;", - value: "U+021D4" + "entity": "Leftrightarrow;", + "value": "U+021D4" }, { - entity: "LessEqualGreater;", - value: "U+022DA" + "entity": "LessEqualGreater;", + "value": "U+022DA" }, { - entity: "LessFullEqual;", - value: "U+02266" + "entity": "LessFullEqual;", + "value": "U+02266" }, { - entity: "LessGreater;", - value: "U+02276" + "entity": "LessGreater;", + "value": "U+02276" }, { - entity: "LessLess;", - value: "U+02AA1" + "entity": "LessLess;", + "value": "U+02AA1" }, { - entity: "LessSlantEqual;", - value: "U+02A7D" + "entity": "LessSlantEqual;", + "value": "U+02A7D" }, { - entity: "LessTilde;", - value: "U+02272" + "entity": "LessTilde;", + "value": "U+02272" }, { - entity: "Lfr;", - value: "U+1D50F" + "entity": "Lfr;", + "value": "U+1D50F" }, { - entity: "Ll;", - value: "U+022D8" + "entity": "Ll;", + "value": "U+022D8" }, { - entity: "Lleftarrow;", - value: "U+021DA" + "entity": "Lleftarrow;", + "value": "U+021DA" }, { - entity: "Lmidot;", - value: "U+0013F" + "entity": "Lmidot;", + "value": "U+0013F" }, { - entity: "LongLeftArrow;", - value: "U+027F5" + "entity": "LongLeftArrow;", + "value": "U+027F5" }, { - entity: "LongLeftRightArrow;", - value: "U+027F7" + "entity": "LongLeftRightArrow;", + "value": "U+027F7" }, { - entity: "LongRightArrow;", - value: "U+027F6" + "entity": "LongRightArrow;", + "value": "U+027F6" }, { - entity: "Longleftarrow;", - value: "U+027F8" + "entity": "Longleftarrow;", + "value": "U+027F8" }, { - entity: "Longleftrightarrow;", - value: "U+027FA" + "entity": "Longleftrightarrow;", + "value": "U+027FA" }, { - entity: "Longrightarrow;", - value: "U+027F9" + "entity": "Longrightarrow;", + "value": "U+027F9" }, { - entity: "Lopf;", - value: "U+1D543" + "entity": "Lopf;", + "value": "U+1D543" }, { - entity: "LowerLeftArrow;", - value: "U+02199" + "entity": "LowerLeftArrow;", + "value": "U+02199" }, { - entity: "LowerRightArrow;", - value: "U+02198" + "entity": "LowerRightArrow;", + "value": "U+02198" }, { - entity: "Lscr;", - value: "U+02112" + "entity": "Lscr;", + "value": "U+02112" }, { - entity: "Lsh;", - value: "U+021B0" + "entity": "Lsh;", + "value": "U+021B0" }, { - entity: "Lstrok;", - value: "U+00141" + "entity": "Lstrok;", + "value": "U+00141" }, { - entity: "Lt;", - value: "U+0226A" + "entity": "Lt;", + "value": "U+0226A" }, { - entity: "Map;", - value: "U+02905" + "entity": "Map;", + "value": "U+02905" }, { - entity: "Mcy;", - value: "U+0041C" + "entity": "Mcy;", + "value": "U+0041C" }, { - entity: "MediumSpace;", - value: "U+0205F" + "entity": "MediumSpace;", + "value": "U+0205F" }, { - entity: "Mellintrf;", - value: "U+02133" + "entity": "Mellintrf;", + "value": "U+02133" }, { - entity: "Mfr;", - value: "U+1D510" + "entity": "Mfr;", + "value": "U+1D510" }, { - entity: "MinusPlus;", - value: "U+02213" + "entity": "MinusPlus;", + "value": "U+02213" }, { - entity: "Mopf;", - value: "U+1D544" + "entity": "Mopf;", + "value": "U+1D544" }, { - entity: "Mscr;", - value: "U+02133" + "entity": "Mscr;", + "value": "U+02133" }, { - entity: "Mu;", - value: "U+0039C" + "entity": "Mu;", + "value": "U+0039C" }, { - entity: "NJcy;", - value: "U+0040A" + "entity": "NJcy;", + "value": "U+0040A" }, { - entity: "Nacute;", - value: "U+00143" + "entity": "Nacute;", + "value": "U+00143" }, { - entity: "Ncaron;", - value: "U+00147" + "entity": "Ncaron;", + "value": "U+00147" }, { - entity: "Ncedil;", - value: "U+00145" + "entity": "Ncedil;", + "value": "U+00145" }, { - entity: "Ncy;", - value: "U+0041D" + "entity": "Ncy;", + "value": "U+0041D" }, { - entity: "NegativeMediumSpace;", - value: "U+0200B" + "entity": "NegativeMediumSpace;", + "value": "U+0200B" }, { - entity: "NegativeThickSpace;", - value: "U+0200B" + "entity": "NegativeThickSpace;", + "value": "U+0200B" }, { - entity: "NegativeThinSpace;", - value: "U+0200B" + "entity": "NegativeThinSpace;", + "value": "U+0200B" }, { - entity: "NegativeVeryThinSpace;", - value: "U+0200B" + "entity": "NegativeVeryThinSpace;", + "value": "U+0200B" }, { - entity: "NestedGreaterGreater;", - value: "U+0226B" + "entity": "NestedGreaterGreater;", + "value": "U+0226B" }, { - entity: "NestedLessLess;", - value: "U+0226A" + "entity": "NestedLessLess;", + "value": "U+0226A" }, { - entity: "NewLine;", - value: "U+0000A" + "entity": "NewLine;", + "value": "U+0000A" }, { - entity: "Nfr;", - value: "U+1D511" + "entity": "Nfr;", + "value": "U+1D511" }, { - entity: "NoBreak;", - value: "U+02060" + "entity": "NoBreak;", + "value": "U+02060" }, { - entity: "NonBreakingSpace;", - value: "U+000A0" + "entity": "NonBreakingSpace;", + "value": "U+000A0" }, { - entity: "Nopf;", - value: "U+02115" + "entity": "Nopf;", + "value": "U+02115" }, { - entity: "Not;", - value: "U+02AEC" + "entity": "Not;", + "value": "U+02AEC" }, { - entity: "NotCongruent;", - value: "U+02262" + "entity": "NotCongruent;", + "value": "U+02262" }, { - entity: "NotCupCap;", - value: "U+0226D" + "entity": "NotCupCap;", + "value": "U+0226D" }, { - entity: "NotDoubleVerticalBar;", - value: "U+02226" + "entity": "NotDoubleVerticalBar;", + "value": "U+02226" }, { - entity: "NotElement;", - value: "U+02209" + "entity": "NotElement;", + "value": "U+02209" }, { - entity: "NotEqual;", - value: "U+02260" + "entity": "NotEqual;", + "value": "U+02260" }, { - entity: "NotExists;", - value: "U+02204" + "entity": "NotExists;", + "value": "U+02204" }, { - entity: "NotGreater;", - value: "U+0226F" + "entity": "NotGreater;", + "value": "U+0226F" }, { - entity: "NotGreaterEqual;", - value: "U+02271" + "entity": "NotGreaterEqual;", + "value": "U+02271" }, { - entity: "NotGreaterLess;", - value: "U+02279" + "entity": "NotGreaterLess;", + "value": "U+02279" }, { - entity: "NotGreaterTilde;", - value: "U+02275" + "entity": "NotGreaterTilde;", + "value": "U+02275" }, { - entity: "NotLeftTriangle;", - value: "U+022EA" + "entity": "NotLeftTriangle;", + "value": "U+022EA" }, { - entity: "NotLeftTriangleEqual;", - value: "U+022EC" + "entity": "NotLeftTriangleEqual;", + "value": "U+022EC" }, { - entity: "NotLess;", - value: "U+0226E" + "entity": "NotLess;", + "value": "U+0226E" }, { - entity: "NotLessEqual;", - value: "U+02270" + "entity": "NotLessEqual;", + "value": "U+02270" }, { - entity: "NotLessGreater;", - value: "U+02278" + "entity": "NotLessGreater;", + "value": "U+02278" }, { - entity: "NotLessTilde;", - value: "U+02274" + "entity": "NotLessTilde;", + "value": "U+02274" }, { - entity: "NotPrecedes;", - value: "U+02280" + "entity": "NotPrecedes;", + "value": "U+02280" }, { - entity: "NotPrecedesSlantEqual;", - value: "U+022E0" + "entity": "NotPrecedesSlantEqual;", + "value": "U+022E0" }, { - entity: "NotReverseElement;", - value: "U+0220C" + "entity": "NotReverseElement;", + "value": "U+0220C" }, { - entity: "NotRightTriangle;", - value: "U+022EB" + "entity": "NotRightTriangle;", + "value": "U+022EB" }, { - entity: "NotRightTriangleEqual;", - value: "U+022ED" + "entity": "NotRightTriangleEqual;", + "value": "U+022ED" }, { - entity: "NotSquareSubsetEqual;", - value: "U+022E2" + "entity": "NotSquareSubsetEqual;", + "value": "U+022E2" }, { - entity: "NotSquareSupersetEqual;", - value: "U+022E3" + "entity": "NotSquareSupersetEqual;", + "value": "U+022E3" }, { - entity: "NotSubsetEqual;", - value: "U+02288" + "entity": "NotSubsetEqual;", + "value": "U+02288" }, { - entity: "NotSucceeds;", - value: "U+02281" + "entity": "NotSucceeds;", + "value": "U+02281" }, { - entity: "NotSucceedsSlantEqual;", - value: "U+022E1" + "entity": "NotSucceedsSlantEqual;", + "value": "U+022E1" }, { - entity: "NotSupersetEqual;", - value: "U+02289" + "entity": "NotSupersetEqual;", + "value": "U+02289" }, { - entity: "NotTilde;", - value: "U+02241" + "entity": "NotTilde;", + "value": "U+02241" }, { - entity: "NotTildeEqual;", - value: "U+02244" + "entity": "NotTildeEqual;", + "value": "U+02244" }, { - entity: "NotTildeFullEqual;", - value: "U+02247" + "entity": "NotTildeFullEqual;", + "value": "U+02247" }, { - entity: "NotTildeTilde;", - value: "U+02249" + "entity": "NotTildeTilde;", + "value": "U+02249" }, { - entity: "NotVerticalBar;", - value: "U+02224" + "entity": "NotVerticalBar;", + "value": "U+02224" }, { - entity: "Nscr;", - value: "U+1D4A9" + "entity": "Nscr;", + "value": "U+1D4A9" }, { - entity: "Ntilde;", - value: "U+000D1" + "entity": "Ntilde;", + "value": "U+000D1" }, { - entity: "Ntilde", - value: "U+000D1" + "entity": "Ntilde", + "value": "U+000D1" }, { - entity: "Nu;", - value: "U+0039D" + "entity": "Nu;", + "value": "U+0039D" }, { - entity: "OElig;", - value: "U+00152" + "entity": "OElig;", + "value": "U+00152" }, { - entity: "Oacute;", - value: "U+000D3" + "entity": "Oacute;", + "value": "U+000D3" }, { - entity: "Oacute", - value: "U+000D3" + "entity": "Oacute", + "value": "U+000D3" }, { - entity: "Ocirc;", - value: "U+000D4" + "entity": "Ocirc;", + "value": "U+000D4" }, { - entity: "Ocirc", - value: "U+000D4" + "entity": "Ocirc", + "value": "U+000D4" }, { - entity: "Ocy;", - value: "U+0041E" + "entity": "Ocy;", + "value": "U+0041E" }, { - entity: "Odblac;", - value: "U+00150" + "entity": "Odblac;", + "value": "U+00150" }, { - entity: "Ofr;", - value: "U+1D512" + "entity": "Ofr;", + "value": "U+1D512" }, { - entity: "Ograve;", - value: "U+000D2" + "entity": "Ograve;", + "value": "U+000D2" }, { - entity: "Ograve", - value: "U+000D2" + "entity": "Ograve", + "value": "U+000D2" }, { - entity: "Omacr;", - value: "U+0014C" + "entity": "Omacr;", + "value": "U+0014C" }, { - entity: "Omega;", - value: "U+003A9" + "entity": "Omega;", + "value": "U+003A9" }, { - entity: "Omicron;", - value: "U+0039F" + "entity": "Omicron;", + "value": "U+0039F" }, { - entity: "Oopf;", - value: "U+1D546" + "entity": "Oopf;", + "value": "U+1D546" }, { - entity: "OpenCurlyDoubleQuote;", - value: "U+0201C" + "entity": "OpenCurlyDoubleQuote;", + "value": "U+0201C" }, { - entity: "OpenCurlyQuote;", - value: "U+02018" + "entity": "OpenCurlyQuote;", + "value": "U+02018" }, { - entity: "Or;", - value: "U+02A54" + "entity": "Or;", + "value": "U+02A54" }, { - entity: "Oscr;", - value: "U+1D4AA" + "entity": "Oscr;", + "value": "U+1D4AA" }, { - entity: "Oslash;", - value: "U+000D8" + "entity": "Oslash;", + "value": "U+000D8" }, { - entity: "Oslash", - value: "U+000D8" + "entity": "Oslash", + "value": "U+000D8" }, { - entity: "Otilde;", - value: "U+000D5" + "entity": "Otilde;", + "value": "U+000D5" }, { - entity: "Otilde", - value: "U+000D5" + "entity": "Otilde", + "value": "U+000D5" }, { - entity: "Otimes;", - value: "U+02A37" + "entity": "Otimes;", + "value": "U+02A37" }, { - entity: "Ouml;", - value: "U+000D6" + "entity": "Ouml;", + "value": "U+000D6" }, { - entity: "Ouml", - value: "U+000D6" + "entity": "Ouml", + "value": "U+000D6" }, { - entity: "OverBar;", - value: "U+0203E" + "entity": "OverBar;", + "value": "U+0203E" }, { - entity: "OverBrace;", - value: "U+023DE" + "entity": "OverBrace;", + "value": "U+023DE" }, { - entity: "OverBracket;", - value: "U+023B4" + "entity": "OverBracket;", + "value": "U+023B4" }, { - entity: "OverParenthesis;", - value: "U+023DC" + "entity": "OverParenthesis;", + "value": "U+023DC" }, { - entity: "PartialD;", - value: "U+02202" + "entity": "PartialD;", + "value": "U+02202" }, { - entity: "Pcy;", - value: "U+0041F" + "entity": "Pcy;", + "value": "U+0041F" }, { - entity: "Pfr;", - value: "U+1D513" + "entity": "Pfr;", + "value": "U+1D513" }, { - entity: "Phi;", - value: "U+003A6" + "entity": "Phi;", + "value": "U+003A6" }, { - entity: "Pi;", - value: "U+003A0" + "entity": "Pi;", + "value": "U+003A0" }, { - entity: "PlusMinus;", - value: "U+000B1" + "entity": "PlusMinus;", + "value": "U+000B1" }, { - entity: "Poincareplane;", - value: "U+0210C" + "entity": "Poincareplane;", + "value": "U+0210C" }, { - entity: "Popf;", - value: "U+02119" + "entity": "Popf;", + "value": "U+02119" }, { - entity: "Pr;", - value: "U+02ABB" + "entity": "Pr;", + "value": "U+02ABB" }, { - entity: "Precedes;", - value: "U+0227A" + "entity": "Precedes;", + "value": "U+0227A" }, { - entity: "PrecedesEqual;", - value: "U+02AAF" + "entity": "PrecedesEqual;", + "value": "U+02AAF" }, { - entity: "PrecedesSlantEqual;", - value: "U+0227C" + "entity": "PrecedesSlantEqual;", + "value": "U+0227C" }, { - entity: "PrecedesTilde;", - value: "U+0227E" + "entity": "PrecedesTilde;", + "value": "U+0227E" }, { - entity: "Prime;", - value: "U+02033" + "entity": "Prime;", + "value": "U+02033" }, { - entity: "Product;", - value: "U+0220F" + "entity": "Product;", + "value": "U+0220F" }, { - entity: "Proportion;", - value: "U+02237" + "entity": "Proportion;", + "value": "U+02237" }, { - entity: "Proportional;", - value: "U+0221D" + "entity": "Proportional;", + "value": "U+0221D" }, { - entity: "Pscr;", - value: "U+1D4AB" + "entity": "Pscr;", + "value": "U+1D4AB" }, { - entity: "Psi;", - value: "U+003A8" + "entity": "Psi;", + "value": "U+003A8" }, { - entity: "QUOT;", - value: "U+00022" + "entity": "QUOT;", + "value": "U+00022" }, { - entity: "QUOT", - value: "U+00022" + "entity": "QUOT", + "value": "U+00022" }, { - entity: "Qfr;", - value: "U+1D514" + "entity": "Qfr;", + "value": "U+1D514" }, { - entity: "Qopf;", - value: "U+0211A" + "entity": "Qopf;", + "value": "U+0211A" }, { - entity: "Qscr;", - value: "U+1D4AC" + "entity": "Qscr;", + "value": "U+1D4AC" }, { - entity: "RBarr;", - value: "U+02910" + "entity": "RBarr;", + "value": "U+02910" }, { - entity: "REG;", - value: "U+000AE" + "entity": "REG;", + "value": "U+000AE" }, { - entity: "REG", - value: "U+000AE" + "entity": "REG", + "value": "U+000AE" }, { - entity: "Racute;", - value: "U+00154" + "entity": "Racute;", + "value": "U+00154" }, { - entity: "Rang;", - value: "U+027EB" + "entity": "Rang;", + "value": "U+027EB" }, { - entity: "Rarr;", - value: "U+021A0" + "entity": "Rarr;", + "value": "U+021A0" }, { - entity: "Rarrtl;", - value: "U+02916" + "entity": "Rarrtl;", + "value": "U+02916" }, { - entity: "Rcaron;", - value: "U+00158" + "entity": "Rcaron;", + "value": "U+00158" }, { - entity: "Rcedil;", - value: "U+00156" + "entity": "Rcedil;", + "value": "U+00156" }, { - entity: "Rcy;", - value: "U+00420" + "entity": "Rcy;", + "value": "U+00420" }, { - entity: "Re;", - value: "U+0211C" + "entity": "Re;", + "value": "U+0211C" }, { - entity: "ReverseElement;", - value: "U+0220B" + "entity": "ReverseElement;", + "value": "U+0220B" }, { - entity: "ReverseEquilibrium;", - value: "U+021CB" + "entity": "ReverseEquilibrium;", + "value": "U+021CB" }, { - entity: "ReverseUpEquilibrium;", - value: "U+0296F" + "entity": "ReverseUpEquilibrium;", + "value": "U+0296F" }, { - entity: "Rfr;", - value: "U+0211C" + "entity": "Rfr;", + "value": "U+0211C" }, { - entity: "Rho;", - value: "U+003A1" + "entity": "Rho;", + "value": "U+003A1" }, { - entity: "RightAngleBracket;", - value: "U+027E9" + "entity": "RightAngleBracket;", + "value": "U+027E9" }, { - entity: "RightArrow;", - value: "U+02192" + "entity": "RightArrow;", + "value": "U+02192" }, { - entity: "RightArrowBar;", - value: "U+021E5" + "entity": "RightArrowBar;", + "value": "U+021E5" }, { - entity: "RightArrowLeftArrow;", - value: "U+021C4" + "entity": "RightArrowLeftArrow;", + "value": "U+021C4" }, { - entity: "RightCeiling;", - value: "U+02309" + "entity": "RightCeiling;", + "value": "U+02309" }, { - entity: "RightDoubleBracket;", - value: "U+027E7" + "entity": "RightDoubleBracket;", + "value": "U+027E7" }, { - entity: "RightDownTeeVector;", - value: "U+0295D" + "entity": "RightDownTeeVector;", + "value": "U+0295D" }, { - entity: "RightDownVector;", - value: "U+021C2" + "entity": "RightDownVector;", + "value": "U+021C2" }, { - entity: "RightDownVectorBar;", - value: "U+02955" + "entity": "RightDownVectorBar;", + "value": "U+02955" }, { - entity: "RightFloor;", - value: "U+0230B" + "entity": "RightFloor;", + "value": "U+0230B" }, { - entity: "RightTee;", - value: "U+022A2" + "entity": "RightTee;", + "value": "U+022A2" }, { - entity: "RightTeeArrow;", - value: "U+021A6" + "entity": "RightTeeArrow;", + "value": "U+021A6" }, { - entity: "RightTeeVector;", - value: "U+0295B" + "entity": "RightTeeVector;", + "value": "U+0295B" }, { - entity: "RightTriangle;", - value: "U+022B3" + "entity": "RightTriangle;", + "value": "U+022B3" }, { - entity: "RightTriangleBar;", - value: "U+029D0" + "entity": "RightTriangleBar;", + "value": "U+029D0" }, { - entity: "RightTriangleEqual;", - value: "U+022B5" + "entity": "RightTriangleEqual;", + "value": "U+022B5" }, { - entity: "RightUpDownVector;", - value: "U+0294F" + "entity": "RightUpDownVector;", + "value": "U+0294F" }, { - entity: "RightUpTeeVector;", - value: "U+0295C" + "entity": "RightUpTeeVector;", + "value": "U+0295C" }, { - entity: "RightUpVector;", - value: "U+021BE" + "entity": "RightUpVector;", + "value": "U+021BE" }, { - entity: "RightUpVectorBar;", - value: "U+02954" + "entity": "RightUpVectorBar;", + "value": "U+02954" }, { - entity: "RightVector;", - value: "U+021C0" + "entity": "RightVector;", + "value": "U+021C0" }, { - entity: "RightVectorBar;", - value: "U+02953" + "entity": "RightVectorBar;", + "value": "U+02953" }, { - entity: "Rightarrow;", - value: "U+021D2" + "entity": "Rightarrow;", + "value": "U+021D2" }, { - entity: "Ropf;", - value: "U+0211D" + "entity": "Ropf;", + "value": "U+0211D" }, { - entity: "RoundImplies;", - value: "U+02970" + "entity": "RoundImplies;", + "value": "U+02970" }, { - entity: "Rrightarrow;", - value: "U+021DB" + "entity": "Rrightarrow;", + "value": "U+021DB" }, { - entity: "Rscr;", - value: "U+0211B" + "entity": "Rscr;", + "value": "U+0211B" }, { - entity: "Rsh;", - value: "U+021B1" + "entity": "Rsh;", + "value": "U+021B1" }, { - entity: "RuleDelayed;", - value: "U+029F4" + "entity": "RuleDelayed;", + "value": "U+029F4" }, { - entity: "SHCHcy;", - value: "U+00429" + "entity": "SHCHcy;", + "value": "U+00429" }, { - entity: "SHcy;", - value: "U+00428" + "entity": "SHcy;", + "value": "U+00428" }, { - entity: "SOFTcy;", - value: "U+0042C" + "entity": "SOFTcy;", + "value": "U+0042C" }, { - entity: "Sacute;", - value: "U+0015A" + "entity": "Sacute;", + "value": "U+0015A" }, { - entity: "Sc;", - value: "U+02ABC" + "entity": "Sc;", + "value": "U+02ABC" }, { - entity: "Scaron;", - value: "U+00160" + "entity": "Scaron;", + "value": "U+00160" }, { - entity: "Scedil;", - value: "U+0015E" + "entity": "Scedil;", + "value": "U+0015E" }, { - entity: "Scirc;", - value: "U+0015C" + "entity": "Scirc;", + "value": "U+0015C" }, { - entity: "Scy;", - value: "U+00421" + "entity": "Scy;", + "value": "U+00421" }, { - entity: "Sfr;", - value: "U+1D516" + "entity": "Sfr;", + "value": "U+1D516" }, { - entity: "ShortDownArrow;", - value: "U+02193" + "entity": "ShortDownArrow;", + "value": "U+02193" }, { - entity: "ShortLeftArrow;", - value: "U+02190" + "entity": "ShortLeftArrow;", + "value": "U+02190" }, { - entity: "ShortRightArrow;", - value: "U+02192" + "entity": "ShortRightArrow;", + "value": "U+02192" }, { - entity: "ShortUpArrow;", - value: "U+02191" + "entity": "ShortUpArrow;", + "value": "U+02191" }, { - entity: "Sigma;", - value: "U+003A3" + "entity": "Sigma;", + "value": "U+003A3" }, { - entity: "SmallCircle;", - value: "U+02218" + "entity": "SmallCircle;", + "value": "U+02218" }, { - entity: "Sopf;", - value: "U+1D54A" + "entity": "Sopf;", + "value": "U+1D54A" }, { - entity: "Sqrt;", - value: "U+0221A" + "entity": "Sqrt;", + "value": "U+0221A" }, { - entity: "Square;", - value: "U+025A1" + "entity": "Square;", + "value": "U+025A1" }, { - entity: "SquareIntersection;", - value: "U+02293" + "entity": "SquareIntersection;", + "value": "U+02293" }, { - entity: "SquareSubset;", - value: "U+0228F" + "entity": "SquareSubset;", + "value": "U+0228F" }, { - entity: "SquareSubsetEqual;", - value: "U+02291" + "entity": "SquareSubsetEqual;", + "value": "U+02291" }, { - entity: "SquareSuperset;", - value: "U+02290" + "entity": "SquareSuperset;", + "value": "U+02290" }, { - entity: "SquareSupersetEqual;", - value: "U+02292" + "entity": "SquareSupersetEqual;", + "value": "U+02292" }, { - entity: "SquareUnion;", - value: "U+02294" + "entity": "SquareUnion;", + "value": "U+02294" }, { - entity: "Sscr;", - value: "U+1D4AE" + "entity": "Sscr;", + "value": "U+1D4AE" }, { - entity: "Star;", - value: "U+022C6" + "entity": "Star;", + "value": "U+022C6" }, { - entity: "Sub;", - value: "U+022D0" + "entity": "Sub;", + "value": "U+022D0" }, { - entity: "Subset;", - value: "U+022D0" + "entity": "Subset;", + "value": "U+022D0" }, { - entity: "SubsetEqual;", - value: "U+02286" + "entity": "SubsetEqual;", + "value": "U+02286" }, { - entity: "Succeeds;", - value: "U+0227B" + "entity": "Succeeds;", + "value": "U+0227B" }, { - entity: "SucceedsEqual;", - value: "U+02AB0" + "entity": "SucceedsEqual;", + "value": "U+02AB0" }, { - entity: "SucceedsSlantEqual;", - value: "U+0227D" + "entity": "SucceedsSlantEqual;", + "value": "U+0227D" }, { - entity: "SucceedsTilde;", - value: "U+0227F" + "entity": "SucceedsTilde;", + "value": "U+0227F" }, { - entity: "SuchThat;", - value: "U+0220B" + "entity": "SuchThat;", + "value": "U+0220B" }, { - entity: "Sum;", - value: "U+02211" + "entity": "Sum;", + "value": "U+02211" }, { - entity: "Sup;", - value: "U+022D1" + "entity": "Sup;", + "value": "U+022D1" }, { - entity: "Superset;", - value: "U+02283" + "entity": "Superset;", + "value": "U+02283" }, { - entity: "SupersetEqual;", - value: "U+02287" + "entity": "SupersetEqual;", + "value": "U+02287" }, { - entity: "Supset;", - value: "U+022D1" + "entity": "Supset;", + "value": "U+022D1" }, { - entity: "THORN;", - value: "U+000DE" + "entity": "THORN;", + "value": "U+000DE" }, { - entity: "THORN", - value: "U+000DE" + "entity": "THORN", + "value": "U+000DE" }, { - entity: "TRADE;", - value: "U+02122" + "entity": "TRADE;", + "value": "U+02122" }, { - entity: "TSHcy;", - value: "U+0040B" + "entity": "TSHcy;", + "value": "U+0040B" }, { - entity: "TScy;", - value: "U+00426" + "entity": "TScy;", + "value": "U+00426" }, { - entity: "Tab;", - value: "U+00009" + "entity": "Tab;", + "value": "U+00009" }, { - entity: "Tau;", - value: "U+003A4" + "entity": "Tau;", + "value": "U+003A4" }, { - entity: "Tcaron;", - value: "U+00164" + "entity": "Tcaron;", + "value": "U+00164" }, { - entity: "Tcedil;", - value: "U+00162" + "entity": "Tcedil;", + "value": "U+00162" }, { - entity: "Tcy;", - value: "U+00422" + "entity": "Tcy;", + "value": "U+00422" }, { - entity: "Tfr;", - value: "U+1D517" + "entity": "Tfr;", + "value": "U+1D517" }, { - entity: "Therefore;", - value: "U+02234" + "entity": "Therefore;", + "value": "U+02234" }, { - entity: "Theta;", - value: "U+00398" + "entity": "Theta;", + "value": "U+00398" }, { - entity: "ThinSpace;", - value: "U+02009" + "entity": "ThinSpace;", + "value": "U+02009" }, { - entity: "Tilde;", - value: "U+0223C" + "entity": "Tilde;", + "value": "U+0223C" }, { - entity: "TildeEqual;", - value: "U+02243" + "entity": "TildeEqual;", + "value": "U+02243" }, { - entity: "TildeFullEqual;", - value: "U+02245" + "entity": "TildeFullEqual;", + "value": "U+02245" }, { - entity: "TildeTilde;", - value: "U+02248" + "entity": "TildeTilde;", + "value": "U+02248" }, { - entity: "Topf;", - value: "U+1D54B" + "entity": "Topf;", + "value": "U+1D54B" }, { - entity: "TripleDot;", - value: "U+020DB" + "entity": "TripleDot;", + "value": "U+020DB" }, { - entity: "Tscr;", - value: "U+1D4AF" + "entity": "Tscr;", + "value": "U+1D4AF" }, { - entity: "Tstrok;", - value: "U+00166" + "entity": "Tstrok;", + "value": "U+00166" }, { - entity: "Uacute;", - value: "U+000DA" + "entity": "Uacute;", + "value": "U+000DA" }, { - entity: "Uacute", - value: "U+000DA" + "entity": "Uacute", + "value": "U+000DA" }, { - entity: "Uarr;", - value: "U+0219F" + "entity": "Uarr;", + "value": "U+0219F" }, { - entity: "Uarrocir;", - value: "U+02949" + "entity": "Uarrocir;", + "value": "U+02949" }, { - entity: "Ubrcy;", - value: "U+0040E" + "entity": "Ubrcy;", + "value": "U+0040E" }, { - entity: "Ubreve;", - value: "U+0016C" + "entity": "Ubreve;", + "value": "U+0016C" }, { - entity: "Ucirc;", - value: "U+000DB" + "entity": "Ucirc;", + "value": "U+000DB" }, { - entity: "Ucirc", - value: "U+000DB" + "entity": "Ucirc", + "value": "U+000DB" }, { - entity: "Ucy;", - value: "U+00423" + "entity": "Ucy;", + "value": "U+00423" }, { - entity: "Udblac;", - value: "U+00170" + "entity": "Udblac;", + "value": "U+00170" }, { - entity: "Ufr;", - value: "U+1D518" + "entity": "Ufr;", + "value": "U+1D518" }, { - entity: "Ugrave;", - value: "U+000D9" + "entity": "Ugrave;", + "value": "U+000D9" }, { - entity: "Ugrave", - value: "U+000D9" + "entity": "Ugrave", + "value": "U+000D9" }, { - entity: "Umacr;", - value: "U+0016A" + "entity": "Umacr;", + "value": "U+0016A" }, { - entity: "UnderBar;", - value: "U+0005F" + "entity": "UnderBar;", + "value": "U+0005F" }, { - entity: "UnderBrace;", - value: "U+023DF" + "entity": "UnderBrace;", + "value": "U+023DF" }, { - entity: "UnderBracket;", - value: "U+023B5" + "entity": "UnderBracket;", + "value": "U+023B5" }, { - entity: "UnderParenthesis;", - value: "U+023DD" + "entity": "UnderParenthesis;", + "value": "U+023DD" }, { - entity: "Union;", - value: "U+022C3" + "entity": "Union;", + "value": "U+022C3" }, { - entity: "UnionPlus;", - value: "U+0228E" + "entity": "UnionPlus;", + "value": "U+0228E" }, { - entity: "Uogon;", - value: "U+00172" + "entity": "Uogon;", + "value": "U+00172" }, { - entity: "Uopf;", - value: "U+1D54C" + "entity": "Uopf;", + "value": "U+1D54C" }, { - entity: "UpArrow;", - value: "U+02191" + "entity": "UpArrow;", + "value": "U+02191" }, { - entity: "UpArrowBar;", - value: "U+02912" + "entity": "UpArrowBar;", + "value": "U+02912" }, { - entity: "UpArrowDownArrow;", - value: "U+021C5" + "entity": "UpArrowDownArrow;", + "value": "U+021C5" }, { - entity: "UpDownArrow;", - value: "U+02195" + "entity": "UpDownArrow;", + "value": "U+02195" }, { - entity: "UpEquilibrium;", - value: "U+0296E" + "entity": "UpEquilibrium;", + "value": "U+0296E" }, { - entity: "UpTee;", - value: "U+022A5" + "entity": "UpTee;", + "value": "U+022A5" }, { - entity: "UpTeeArrow;", - value: "U+021A5" + "entity": "UpTeeArrow;", + "value": "U+021A5" }, { - entity: "Uparrow;", - value: "U+021D1" + "entity": "Uparrow;", + "value": "U+021D1" }, { - entity: "Updownarrow;", - value: "U+021D5" + "entity": "Updownarrow;", + "value": "U+021D5" }, { - entity: "UpperLeftArrow;", - value: "U+02196" + "entity": "UpperLeftArrow;", + "value": "U+02196" }, { - entity: "UpperRightArrow;", - value: "U+02197" + "entity": "UpperRightArrow;", + "value": "U+02197" }, { - entity: "Upsi;", - value: "U+003D2" + "entity": "Upsi;", + "value": "U+003D2" }, { - entity: "Upsilon;", - value: "U+003A5" + "entity": "Upsilon;", + "value": "U+003A5" }, { - entity: "Uring;", - value: "U+0016E" + "entity": "Uring;", + "value": "U+0016E" }, { - entity: "Uscr;", - value: "U+1D4B0" + "entity": "Uscr;", + "value": "U+1D4B0" }, { - entity: "Utilde;", - value: "U+00168" + "entity": "Utilde;", + "value": "U+00168" }, { - entity: "Uuml;", - value: "U+000DC" + "entity": "Uuml;", + "value": "U+000DC" }, { - entity: "Uuml", - value: "U+000DC" + "entity": "Uuml", + "value": "U+000DC" }, { - entity: "VDash;", - value: "U+022AB" + "entity": "VDash;", + "value": "U+022AB" }, { - entity: "Vbar;", - value: "U+02AEB" + "entity": "Vbar;", + "value": "U+02AEB" }, { - entity: "Vcy;", - value: "U+00412" + "entity": "Vcy;", + "value": "U+00412" }, { - entity: "Vdash;", - value: "U+022A9" + "entity": "Vdash;", + "value": "U+022A9" }, { - entity: "Vdashl;", - value: "U+02AE6" + "entity": "Vdashl;", + "value": "U+02AE6" }, { - entity: "Vee;", - value: "U+022C1" + "entity": "Vee;", + "value": "U+022C1" }, { - entity: "Verbar;", - value: "U+02016" + "entity": "Verbar;", + "value": "U+02016" }, { - entity: "Vert;", - value: "U+02016" + "entity": "Vert;", + "value": "U+02016" }, { - entity: "VerticalBar;", - value: "U+02223" + "entity": "VerticalBar;", + "value": "U+02223" }, { - entity: "VerticalLine;", - value: "U+0007C" + "entity": "VerticalLine;", + "value": "U+0007C" }, { - entity: "VerticalSeparator;", - value: "U+02758" + "entity": "VerticalSeparator;", + "value": "U+02758" }, { - entity: "VerticalTilde;", - value: "U+02240" + "entity": "VerticalTilde;", + "value": "U+02240" }, { - entity: "VeryThinSpace;", - value: "U+0200A" + "entity": "VeryThinSpace;", + "value": "U+0200A" }, { - entity: "Vfr;", - value: "U+1D519" + "entity": "Vfr;", + "value": "U+1D519" }, { - entity: "Vopf;", - value: "U+1D54D" + "entity": "Vopf;", + "value": "U+1D54D" }, { - entity: "Vscr;", - value: "U+1D4B1" + "entity": "Vscr;", + "value": "U+1D4B1" }, { - entity: "Vvdash;", - value: "U+022AA" + "entity": "Vvdash;", + "value": "U+022AA" }, { - entity: "Wcirc;", - value: "U+00174" + "entity": "Wcirc;", + "value": "U+00174" }, { - entity: "Wedge;", - value: "U+022C0" + "entity": "Wedge;", + "value": "U+022C0" }, { - entity: "Wfr;", - value: "U+1D51A" + "entity": "Wfr;", + "value": "U+1D51A" }, { - entity: "Wopf;", - value: "U+1D54E" + "entity": "Wopf;", + "value": "U+1D54E" }, { - entity: "Wscr;", - value: "U+1D4B2" + "entity": "Wscr;", + "value": "U+1D4B2" }, { - entity: "Xfr;", - value: "U+1D51B" + "entity": "Xfr;", + "value": "U+1D51B" }, { - entity: "Xi;", - value: "U+0039E" + "entity": "Xi;", + "value": "U+0039E" }, { - entity: "Xopf;", - value: "U+1D54F" + "entity": "Xopf;", + "value": "U+1D54F" }, { - entity: "Xscr;", - value: "U+1D4B3" + "entity": "Xscr;", + "value": "U+1D4B3" }, { - entity: "YAcy;", - value: "U+0042F" + "entity": "YAcy;", + "value": "U+0042F" }, { - entity: "YIcy;", - value: "U+00407" + "entity": "YIcy;", + "value": "U+00407" }, { - entity: "YUcy;", - value: "U+0042E" + "entity": "YUcy;", + "value": "U+0042E" }, { - entity: "Yacute;", - value: "U+000DD" + "entity": "Yacute;", + "value": "U+000DD" }, { - entity: "Yacute", - value: "U+000DD" + "entity": "Yacute", + "value": "U+000DD" }, { - entity: "Ycirc;", - value: "U+00176" + "entity": "Ycirc;", + "value": "U+00176" }, { - entity: "Ycy;", - value: "U+0042B" + "entity": "Ycy;", + "value": "U+0042B" }, { - entity: "Yfr;", - value: "U+1D51C" + "entity": "Yfr;", + "value": "U+1D51C" }, { - entity: "Yopf;", - value: "U+1D550" + "entity": "Yopf;", + "value": "U+1D550" }, { - entity: "Yscr;", - value: "U+1D4B4" + "entity": "Yscr;", + "value": "U+1D4B4" }, { - entity: "Yuml;", - value: "U+00178" + "entity": "Yuml;", + "value": "U+00178" }, { - entity: "ZHcy;", - value: "U+00416" + "entity": "ZHcy;", + "value": "U+00416" }, { - entity: "Zacute;", - value: "U+00179" + "entity": "Zacute;", + "value": "U+00179" }, { - entity: "Zcaron;", - value: "U+0017D" + "entity": "Zcaron;", + "value": "U+0017D" }, { - entity: "Zcy;", - value: "U+00417" + "entity": "Zcy;", + "value": "U+00417" }, { - entity: "Zdot;", - value: "U+0017B" + "entity": "Zdot;", + "value": "U+0017B" }, { - entity: "ZeroWidthSpace;", - value: "U+0200B" + "entity": "ZeroWidthSpace;", + "value": "U+0200B" }, { - entity: "Zeta;", - value: "U+00396" + "entity": "Zeta;", + "value": "U+00396" }, { - entity: "Zfr;", - value: "U+02128" + "entity": "Zfr;", + "value": "U+02128" }, { - entity: "Zopf;", - value: "U+02124" + "entity": "Zopf;", + "value": "U+02124" }, { - entity: "Zscr;", - value: "U+1D4B5" + "entity": "Zscr;", + "value": "U+1D4B5" }, { - entity: "aacute;", - value: "U+000E1" + "entity": "aacute;", + "value": "U+000E1" }, { - entity: "aacute", - value: "U+000E1" + "entity": "aacute", + "value": "U+000E1" }, { - entity: "abreve;", - value: "U+00103" + "entity": "abreve;", + "value": "U+00103" }, { - entity: "ac;", - value: "U+0223E" + "entity": "ac;", + "value": "U+0223E" }, { - entity: "acd;", - value: "U+0223F" + "entity": "acd;", + "value": "U+0223F" }, { - entity: "acirc;", - value: "U+000E2" + "entity": "acirc;", + "value": "U+000E2" }, { - entity: "acirc", - value: "U+000E2" + "entity": "acirc", + "value": "U+000E2" }, { - entity: "acute;", - value: "U+000B4" + "entity": "acute;", + "value": "U+000B4" }, { - entity: "acute", - value: "U+000B4" + "entity": "acute", + "value": "U+000B4" }, { - entity: "acy;", - value: "U+00430" + "entity": "acy;", + "value": "U+00430" }, { - entity: "aelig;", - value: "U+000E6" + "entity": "aelig;", + "value": "U+000E6" }, { - entity: "aelig", - value: "U+000E6" + "entity": "aelig", + "value": "U+000E6" }, { - entity: "af;", - value: "U+02061" + "entity": "af;", + "value": "U+02061" }, { - entity: "afr;", - value: "U+1D51E" + "entity": "afr;", + "value": "U+1D51E" }, { - entity: "agrave;", - value: "U+000E0" + "entity": "agrave;", + "value": "U+000E0" }, { - entity: "agrave", - value: "U+000E0" + "entity": "agrave", + "value": "U+000E0" }, { - entity: "alefsym;", - value: "U+02135" + "entity": "alefsym;", + "value": "U+02135" }, { - entity: "aleph;", - value: "U+02135" + "entity": "aleph;", + "value": "U+02135" }, { - entity: "alpha;", - value: "U+003B1" + "entity": "alpha;", + "value": "U+003B1" }, { - entity: "amacr;", - value: "U+00101" + "entity": "amacr;", + "value": "U+00101" }, { - entity: "amalg;", - value: "U+02A3F" + "entity": "amalg;", + "value": "U+02A3F" }, { - entity: "amp;", - value: "U+00026" + "entity": "amp;", + "value": "U+00026" }, { - entity: "amp", - value: "U+00026" + "entity": "amp", + "value": "U+00026" }, { - entity: "and;", - value: "U+02227" + "entity": "and;", + "value": "U+02227" }, { - entity: "andand;", - value: "U+02A55" + "entity": "andand;", + "value": "U+02A55" }, { - entity: "andd;", - value: "U+02A5C" + "entity": "andd;", + "value": "U+02A5C" }, { - entity: "andslope;", - value: "U+02A58" + "entity": "andslope;", + "value": "U+02A58" }, { - entity: "andv;", - value: "U+02A5A" + "entity": "andv;", + "value": "U+02A5A" }, { - entity: "ang;", - value: "U+02220" + "entity": "ang;", + "value": "U+02220" }, { - entity: "ange;", - value: "U+029A4" + "entity": "ange;", + "value": "U+029A4" }, { - entity: "angle;", - value: "U+02220" + "entity": "angle;", + "value": "U+02220" }, { - entity: "angmsd;", - value: "U+02221" + "entity": "angmsd;", + "value": "U+02221" }, { - entity: "angmsdaa;", - value: "U+029A8" + "entity": "angmsdaa;", + "value": "U+029A8" }, { - entity: "angmsdab;", - value: "U+029A9" + "entity": "angmsdab;", + "value": "U+029A9" }, { - entity: "angmsdac;", - value: "U+029AA" + "entity": "angmsdac;", + "value": "U+029AA" }, { - entity: "angmsdad;", - value: "U+029AB" + "entity": "angmsdad;", + "value": "U+029AB" }, { - entity: "angmsdae;", - value: "U+029AC" + "entity": "angmsdae;", + "value": "U+029AC" }, { - entity: "angmsdaf;", - value: "U+029AD" + "entity": "angmsdaf;", + "value": "U+029AD" }, { - entity: "angmsdag;", - value: "U+029AE" + "entity": "angmsdag;", + "value": "U+029AE" }, { - entity: "angmsdah;", - value: "U+029AF" + "entity": "angmsdah;", + "value": "U+029AF" }, { - entity: "angrt;", - value: "U+0221F" + "entity": "angrt;", + "value": "U+0221F" }, { - entity: "angrtvb;", - value: "U+022BE" + "entity": "angrtvb;", + "value": "U+022BE" }, { - entity: "angrtvbd;", - value: "U+0299D" + "entity": "angrtvbd;", + "value": "U+0299D" }, { - entity: "angsph;", - value: "U+02222" + "entity": "angsph;", + "value": "U+02222" }, { - entity: "angst;", - value: "U+000C5" + "entity": "angst;", + "value": "U+000C5" }, { - entity: "angzarr;", - value: "U+0237C" + "entity": "angzarr;", + "value": "U+0237C" }, { - entity: "aogon;", - value: "U+00105" + "entity": "aogon;", + "value": "U+00105" }, { - entity: "aopf;", - value: "U+1D552" + "entity": "aopf;", + "value": "U+1D552" }, { - entity: "ap;", - value: "U+02248" + "entity": "ap;", + "value": "U+02248" }, { - entity: "apE;", - value: "U+02A70" + "entity": "apE;", + "value": "U+02A70" }, { - entity: "apacir;", - value: "U+02A6F" + "entity": "apacir;", + "value": "U+02A6F" }, { - entity: "ape;", - value: "U+0224A" + "entity": "ape;", + "value": "U+0224A" }, { - entity: "apid;", - value: "U+0224B" + "entity": "apid;", + "value": "U+0224B" }, { - entity: "apos;", - value: "U+00027" + "entity": "apos;", + "value": "U+00027" }, { - entity: "approx;", - value: "U+02248" + "entity": "approx;", + "value": "U+02248" }, { - entity: "approxeq;", - value: "U+0224A" + "entity": "approxeq;", + "value": "U+0224A" }, { - entity: "aring;", - value: "U+000E5" + "entity": "aring;", + "value": "U+000E5" }, { - entity: "aring", - value: "U+000E5" + "entity": "aring", + "value": "U+000E5" }, { - entity: "ascr;", - value: "U+1D4B6" + "entity": "ascr;", + "value": "U+1D4B6" }, { - entity: "ast;", - value: "U+0002A" + "entity": "ast;", + "value": "U+0002A" }, { - entity: "asymp;", - value: "U+02248" + "entity": "asymp;", + "value": "U+02248" }, { - entity: "asympeq;", - value: "U+0224D" + "entity": "asympeq;", + "value": "U+0224D" }, { - entity: "atilde;", - value: "U+000E3" + "entity": "atilde;", + "value": "U+000E3" }, { - entity: "atilde", - value: "U+000E3" + "entity": "atilde", + "value": "U+000E3" }, { - entity: "auml;", - value: "U+000E4" + "entity": "auml;", + "value": "U+000E4" }, { - entity: "auml", - value: "U+000E4" + "entity": "auml", + "value": "U+000E4" }, { - entity: "awconint;", - value: "U+02233" + "entity": "awconint;", + "value": "U+02233" }, { - entity: "awint;", - value: "U+02A11" + "entity": "awint;", + "value": "U+02A11" }, { - entity: "bNot;", - value: "U+02AED" + "entity": "bNot;", + "value": "U+02AED" }, { - entity: "backcong;", - value: "U+0224C" + "entity": "backcong;", + "value": "U+0224C" }, { - entity: "backepsilon;", - value: "U+003F6" + "entity": "backepsilon;", + "value": "U+003F6" }, { - entity: "backprime;", - value: "U+02035" + "entity": "backprime;", + "value": "U+02035" }, { - entity: "backsim;", - value: "U+0223D" + "entity": "backsim;", + "value": "U+0223D" }, { - entity: "backsimeq;", - value: "U+022CD" + "entity": "backsimeq;", + "value": "U+022CD" }, { - entity: "barvee;", - value: "U+022BD" + "entity": "barvee;", + "value": "U+022BD" }, { - entity: "barwed;", - value: "U+02305" + "entity": "barwed;", + "value": "U+02305" }, { - entity: "barwedge;", - value: "U+02305" + "entity": "barwedge;", + "value": "U+02305" }, { - entity: "bbrk;", - value: "U+023B5" + "entity": "bbrk;", + "value": "U+023B5" }, { - entity: "bbrktbrk;", - value: "U+023B6" + "entity": "bbrktbrk;", + "value": "U+023B6" }, { - entity: "bcong;", - value: "U+0224C" + "entity": "bcong;", + "value": "U+0224C" }, { - entity: "bcy;", - value: "U+00431" + "entity": "bcy;", + "value": "U+00431" }, { - entity: "bdquo;", - value: "U+0201E" + "entity": "bdquo;", + "value": "U+0201E" }, { - entity: "becaus;", - value: "U+02235" + "entity": "becaus;", + "value": "U+02235" }, { - entity: "because;", - value: "U+02235" + "entity": "because;", + "value": "U+02235" }, { - entity: "bemptyv;", - value: "U+029B0" + "entity": "bemptyv;", + "value": "U+029B0" }, { - entity: "bepsi;", - value: "U+003F6" + "entity": "bepsi;", + "value": "U+003F6" }, { - entity: "bernou;", - value: "U+0212C" + "entity": "bernou;", + "value": "U+0212C" }, { - entity: "beta;", - value: "U+003B2" + "entity": "beta;", + "value": "U+003B2" }, { - entity: "beth;", - value: "U+02136" + "entity": "beth;", + "value": "U+02136" }, { - entity: "between;", - value: "U+0226C" + "entity": "between;", + "value": "U+0226C" }, { - entity: "bfr;", - value: "U+1D51F" + "entity": "bfr;", + "value": "U+1D51F" }, { - entity: "bigcap;", - value: "U+022C2" + "entity": "bigcap;", + "value": "U+022C2" }, { - entity: "bigcirc;", - value: "U+025EF" + "entity": "bigcirc;", + "value": "U+025EF" }, { - entity: "bigcup;", - value: "U+022C3" + "entity": "bigcup;", + "value": "U+022C3" }, { - entity: "bigodot;", - value: "U+02A00" + "entity": "bigodot;", + "value": "U+02A00" }, { - entity: "bigoplus;", - value: "U+02A01" + "entity": "bigoplus;", + "value": "U+02A01" }, { - entity: "bigotimes;", - value: "U+02A02" + "entity": "bigotimes;", + "value": "U+02A02" }, { - entity: "bigsqcup;", - value: "U+02A06" + "entity": "bigsqcup;", + "value": "U+02A06" }, { - entity: "bigstar;", - value: "U+02605" + "entity": "bigstar;", + "value": "U+02605" }, { - entity: "bigtriangledown;", - value: "U+025BD" + "entity": "bigtriangledown;", + "value": "U+025BD" }, { - entity: "bigtriangleup;", - value: "U+025B3" + "entity": "bigtriangleup;", + "value": "U+025B3" }, { - entity: "biguplus;", - value: "U+02A04" + "entity": "biguplus;", + "value": "U+02A04" }, { - entity: "bigvee;", - value: "U+022C1" + "entity": "bigvee;", + "value": "U+022C1" }, { - entity: "bigwedge;", - value: "U+022C0" + "entity": "bigwedge;", + "value": "U+022C0" }, { - entity: "bkarow;", - value: "U+0290D" + "entity": "bkarow;", + "value": "U+0290D" }, { - entity: "blacklozenge;", - value: "U+029EB" + "entity": "blacklozenge;", + "value": "U+029EB" }, { - entity: "blacksquare;", - value: "U+025AA" + "entity": "blacksquare;", + "value": "U+025AA" }, { - entity: "blacktriangle;", - value: "U+025B4" + "entity": "blacktriangle;", + "value": "U+025B4" }, { - entity: "blacktriangledown;", - value: "U+025BE" + "entity": "blacktriangledown;", + "value": "U+025BE" }, { - entity: "blacktriangleleft;", - value: "U+025C2" + "entity": "blacktriangleleft;", + "value": "U+025C2" }, { - entity: "blacktriangleright;", - value: "U+025B8" + "entity": "blacktriangleright;", + "value": "U+025B8" }, { - entity: "blank;", - value: "U+02423" + "entity": "blank;", + "value": "U+02423" }, { - entity: "blk12;", - value: "U+02592" + "entity": "blk12;", + "value": "U+02592" }, { - entity: "blk14;", - value: "U+02591" + "entity": "blk14;", + "value": "U+02591" }, { - entity: "blk34;", - value: "U+02593" + "entity": "blk34;", + "value": "U+02593" }, { - entity: "block;", - value: "U+02588" + "entity": "block;", + "value": "U+02588" }, { - entity: "bnot;", - value: "U+02310" + "entity": "bnot;", + "value": "U+02310" }, { - entity: "bopf;", - value: "U+1D553" + "entity": "bopf;", + "value": "U+1D553" }, { - entity: "bot;", - value: "U+022A5" + "entity": "bot;", + "value": "U+022A5" }, { - entity: "bottom;", - value: "U+022A5" + "entity": "bottom;", + "value": "U+022A5" }, { - entity: "bowtie;", - value: "U+022C8" + "entity": "bowtie;", + "value": "U+022C8" }, { - entity: "boxDL;", - value: "U+02557" + "entity": "boxDL;", + "value": "U+02557" }, { - entity: "boxDR;", - value: "U+02554" + "entity": "boxDR;", + "value": "U+02554" }, { - entity: "boxDl;", - value: "U+02556" + "entity": "boxDl;", + "value": "U+02556" }, { - entity: "boxDr;", - value: "U+02553" + "entity": "boxDr;", + "value": "U+02553" }, { - entity: "boxH;", - value: "U+02550" + "entity": "boxH;", + "value": "U+02550" }, { - entity: "boxHD;", - value: "U+02566" + "entity": "boxHD;", + "value": "U+02566" }, { - entity: "boxHU;", - value: "U+02569" + "entity": "boxHU;", + "value": "U+02569" }, { - entity: "boxHd;", - value: "U+02564" + "entity": "boxHd;", + "value": "U+02564" }, { - entity: "boxHu;", - value: "U+02567" + "entity": "boxHu;", + "value": "U+02567" }, { - entity: "boxUL;", - value: "U+0255D" + "entity": "boxUL;", + "value": "U+0255D" }, { - entity: "boxUR;", - value: "U+0255A" + "entity": "boxUR;", + "value": "U+0255A" }, { - entity: "boxUl;", - value: "U+0255C" + "entity": "boxUl;", + "value": "U+0255C" }, { - entity: "boxUr;", - value: "U+02559" + "entity": "boxUr;", + "value": "U+02559" }, { - entity: "boxV;", - value: "U+02551" + "entity": "boxV;", + "value": "U+02551" }, { - entity: "boxVH;", - value: "U+0256C" + "entity": "boxVH;", + "value": "U+0256C" }, { - entity: "boxVL;", - value: "U+02563" + "entity": "boxVL;", + "value": "U+02563" }, { - entity: "boxVR;", - value: "U+02560" + "entity": "boxVR;", + "value": "U+02560" }, { - entity: "boxVh;", - value: "U+0256B" + "entity": "boxVh;", + "value": "U+0256B" }, { - entity: "boxVl;", - value: "U+02562" + "entity": "boxVl;", + "value": "U+02562" }, { - entity: "boxVr;", - value: "U+0255F" + "entity": "boxVr;", + "value": "U+0255F" }, { - entity: "boxbox;", - value: "U+029C9" + "entity": "boxbox;", + "value": "U+029C9" }, { - entity: "boxdL;", - value: "U+02555" + "entity": "boxdL;", + "value": "U+02555" }, { - entity: "boxdR;", - value: "U+02552" + "entity": "boxdR;", + "value": "U+02552" }, { - entity: "boxdl;", - value: "U+02510" + "entity": "boxdl;", + "value": "U+02510" }, { - entity: "boxdr;", - value: "U+0250C" + "entity": "boxdr;", + "value": "U+0250C" }, { - entity: "boxh;", - value: "U+02500" + "entity": "boxh;", + "value": "U+02500" }, { - entity: "boxhD;", - value: "U+02565" + "entity": "boxhD;", + "value": "U+02565" }, { - entity: "boxhU;", - value: "U+02568" + "entity": "boxhU;", + "value": "U+02568" }, { - entity: "boxhd;", - value: "U+0252C" + "entity": "boxhd;", + "value": "U+0252C" }, { - entity: "boxhu;", - value: "U+02534" + "entity": "boxhu;", + "value": "U+02534" }, { - entity: "boxminus;", - value: "U+0229F" + "entity": "boxminus;", + "value": "U+0229F" }, { - entity: "boxplus;", - value: "U+0229E" + "entity": "boxplus;", + "value": "U+0229E" }, { - entity: "boxtimes;", - value: "U+022A0" + "entity": "boxtimes;", + "value": "U+022A0" }, { - entity: "boxuL;", - value: "U+0255B" + "entity": "boxuL;", + "value": "U+0255B" }, { - entity: "boxuR;", - value: "U+02558" + "entity": "boxuR;", + "value": "U+02558" }, { - entity: "boxul;", - value: "U+02518" + "entity": "boxul;", + "value": "U+02518" }, { - entity: "boxur;", - value: "U+02514" + "entity": "boxur;", + "value": "U+02514" }, { - entity: "boxv;", - value: "U+02502" + "entity": "boxv;", + "value": "U+02502" }, { - entity: "boxvH;", - value: "U+0256A" + "entity": "boxvH;", + "value": "U+0256A" }, { - entity: "boxvL;", - value: "U+02561" + "entity": "boxvL;", + "value": "U+02561" }, { - entity: "boxvR;", - value: "U+0255E" + "entity": "boxvR;", + "value": "U+0255E" }, { - entity: "boxvh;", - value: "U+0253C" + "entity": "boxvh;", + "value": "U+0253C" }, { - entity: "boxvl;", - value: "U+02524" + "entity": "boxvl;", + "value": "U+02524" }, { - entity: "boxvr;", - value: "U+0251C" + "entity": "boxvr;", + "value": "U+0251C" }, { - entity: "bprime;", - value: "U+02035" + "entity": "bprime;", + "value": "U+02035" }, { - entity: "breve;", - value: "U+002D8" + "entity": "breve;", + "value": "U+002D8" }, { - entity: "brvbar;", - value: "U+000A6" + "entity": "brvbar;", + "value": "U+000A6" }, { - entity: "brvbar", - value: "U+000A6" + "entity": "brvbar", + "value": "U+000A6" }, { - entity: "bscr;", - value: "U+1D4B7" + "entity": "bscr;", + "value": "U+1D4B7" }, { - entity: "bsemi;", - value: "U+0204F" + "entity": "bsemi;", + "value": "U+0204F" }, { - entity: "bsim;", - value: "U+0223D" + "entity": "bsim;", + "value": "U+0223D" }, { - entity: "bsime;", - value: "U+022CD" + "entity": "bsime;", + "value": "U+022CD" }, { - entity: "bsol;", - value: "U+0005C" + "entity": "bsol;", + "value": "U+0005C" }, { - entity: "bsolb;", - value: "U+029C5" + "entity": "bsolb;", + "value": "U+029C5" }, { - entity: "bsolhsub;", - value: "U+027C8" + "entity": "bsolhsub;", + "value": "U+027C8" }, { - entity: "bull;", - value: "U+02022" + "entity": "bull;", + "value": "U+02022" }, { - entity: "bullet;", - value: "U+02022" + "entity": "bullet;", + "value": "U+02022" }, { - entity: "bump;", - value: "U+0224E" + "entity": "bump;", + "value": "U+0224E" }, { - entity: "bumpE;", - value: "U+02AAE" + "entity": "bumpE;", + "value": "U+02AAE" }, { - entity: "bumpe;", - value: "U+0224F" + "entity": "bumpe;", + "value": "U+0224F" }, { - entity: "bumpeq;", - value: "U+0224F" + "entity": "bumpeq;", + "value": "U+0224F" }, { - entity: "cacute;", - value: "U+00107" + "entity": "cacute;", + "value": "U+00107" }, { - entity: "cap;", - value: "U+02229" + "entity": "cap;", + "value": "U+02229" }, { - entity: "capand;", - value: "U+02A44" + "entity": "capand;", + "value": "U+02A44" }, { - entity: "capbrcup;", - value: "U+02A49" + "entity": "capbrcup;", + "value": "U+02A49" }, { - entity: "capcap;", - value: "U+02A4B" + "entity": "capcap;", + "value": "U+02A4B" }, { - entity: "capcup;", - value: "U+02A47" + "entity": "capcup;", + "value": "U+02A47" }, { - entity: "capdot;", - value: "U+02A40" + "entity": "capdot;", + "value": "U+02A40" }, { - entity: "caret;", - value: "U+02041" + "entity": "caret;", + "value": "U+02041" }, { - entity: "caron;", - value: "U+002C7" + "entity": "caron;", + "value": "U+002C7" }, { - entity: "ccaps;", - value: "U+02A4D" + "entity": "ccaps;", + "value": "U+02A4D" }, { - entity: "ccaron;", - value: "U+0010D" + "entity": "ccaron;", + "value": "U+0010D" }, { - entity: "ccedil;", - value: "U+000E7" + "entity": "ccedil;", + "value": "U+000E7" }, { - entity: "ccedil", - value: "U+000E7" + "entity": "ccedil", + "value": "U+000E7" }, { - entity: "ccirc;", - value: "U+00109" + "entity": "ccirc;", + "value": "U+00109" }, { - entity: "ccups;", - value: "U+02A4C" + "entity": "ccups;", + "value": "U+02A4C" }, { - entity: "ccupssm;", - value: "U+02A50" + "entity": "ccupssm;", + "value": "U+02A50" }, { - entity: "cdot;", - value: "U+0010B" + "entity": "cdot;", + "value": "U+0010B" }, { - entity: "cedil;", - value: "U+000B8" + "entity": "cedil;", + "value": "U+000B8" }, { - entity: "cedil", - value: "U+000B8" + "entity": "cedil", + "value": "U+000B8" }, { - entity: "cemptyv;", - value: "U+029B2" + "entity": "cemptyv;", + "value": "U+029B2" }, { - entity: "cent;", - value: "U+000A2" + "entity": "cent;", + "value": "U+000A2" }, { - entity: "cent", - value: "U+000A2" + "entity": "cent", + "value": "U+000A2" }, { - entity: "centerdot;", - value: "U+000B7" + "entity": "centerdot;", + "value": "U+000B7" }, { - entity: "cfr;", - value: "U+1D520" + "entity": "cfr;", + "value": "U+1D520" }, { - entity: "chcy;", - value: "U+00447" + "entity": "chcy;", + "value": "U+00447" }, { - entity: "check;", - value: "U+02713" + "entity": "check;", + "value": "U+02713" }, { - entity: "checkmark;", - value: "U+02713" + "entity": "checkmark;", + "value": "U+02713" }, { - entity: "chi;", - value: "U+003C7" + "entity": "chi;", + "value": "U+003C7" }, { - entity: "cir;", - value: "U+025CB" + "entity": "cir;", + "value": "U+025CB" }, { - entity: "cirE;", - value: "U+029C3" + "entity": "cirE;", + "value": "U+029C3" }, { - entity: "circ;", - value: "U+002C6" + "entity": "circ;", + "value": "U+002C6" }, { - entity: "circeq;", - value: "U+02257" + "entity": "circeq;", + "value": "U+02257" }, { - entity: "circlearrowleft;", - value: "U+021BA" + "entity": "circlearrowleft;", + "value": "U+021BA" }, { - entity: "circlearrowright;", - value: "U+021BB" + "entity": "circlearrowright;", + "value": "U+021BB" }, { - entity: "circledR;", - value: "U+000AE" + "entity": "circledR;", + "value": "U+000AE" }, { - entity: "circledS;", - value: "U+024C8" + "entity": "circledS;", + "value": "U+024C8" }, { - entity: "circledast;", - value: "U+0229B" + "entity": "circledast;", + "value": "U+0229B" }, { - entity: "circledcirc;", - value: "U+0229A" + "entity": "circledcirc;", + "value": "U+0229A" }, { - entity: "circleddash;", - value: "U+0229D" + "entity": "circleddash;", + "value": "U+0229D" }, { - entity: "cire;", - value: "U+02257" + "entity": "cire;", + "value": "U+02257" }, { - entity: "cirfnint;", - value: "U+02A10" + "entity": "cirfnint;", + "value": "U+02A10" }, { - entity: "cirmid;", - value: "U+02AEF" + "entity": "cirmid;", + "value": "U+02AEF" }, { - entity: "cirscir;", - value: "U+029C2" + "entity": "cirscir;", + "value": "U+029C2" }, { - entity: "clubs;", - value: "U+02663" + "entity": "clubs;", + "value": "U+02663" }, { - entity: "clubsuit;", - value: "U+02663" + "entity": "clubsuit;", + "value": "U+02663" }, { - entity: "colon;", - value: "U+0003A" + "entity": "colon;", + "value": "U+0003A" }, { - entity: "colone;", - value: "U+02254" + "entity": "colone;", + "value": "U+02254" }, { - entity: "coloneq;", - value: "U+02254" + "entity": "coloneq;", + "value": "U+02254" }, { - entity: "comma;", - value: "U+0002C" + "entity": "comma;", + "value": "U+0002C" }, { - entity: "commat;", - value: "U+00040" + "entity": "commat;", + "value": "U+00040" }, { - entity: "comp;", - value: "U+02201" + "entity": "comp;", + "value": "U+02201" }, { - entity: "compfn;", - value: "U+02218" + "entity": "compfn;", + "value": "U+02218" }, { - entity: "complement;", - value: "U+02201" + "entity": "complement;", + "value": "U+02201" }, { - entity: "complexes;", - value: "U+02102" + "entity": "complexes;", + "value": "U+02102" }, { - entity: "cong;", - value: "U+02245" + "entity": "cong;", + "value": "U+02245" }, { - entity: "congdot;", - value: "U+02A6D" + "entity": "congdot;", + "value": "U+02A6D" }, { - entity: "conint;", - value: "U+0222E" + "entity": "conint;", + "value": "U+0222E" }, { - entity: "copf;", - value: "U+1D554" + "entity": "copf;", + "value": "U+1D554" }, { - entity: "coprod;", - value: "U+02210" + "entity": "coprod;", + "value": "U+02210" }, { - entity: "copy;", - value: "U+000A9" + "entity": "copy;", + "value": "U+000A9" }, { - entity: "copy", - value: "U+000A9" + "entity": "copy", + "value": "U+000A9" }, { - entity: "copysr;", - value: "U+02117" + "entity": "copysr;", + "value": "U+02117" }, { - entity: "crarr;", - value: "U+021B5" + "entity": "crarr;", + "value": "U+021B5" }, { - entity: "cross;", - value: "U+02717" + "entity": "cross;", + "value": "U+02717" }, { - entity: "cscr;", - value: "U+1D4B8" + "entity": "cscr;", + "value": "U+1D4B8" }, { - entity: "csub;", - value: "U+02ACF" + "entity": "csub;", + "value": "U+02ACF" }, { - entity: "csube;", - value: "U+02AD1" + "entity": "csube;", + "value": "U+02AD1" }, { - entity: "csup;", - value: "U+02AD0" + "entity": "csup;", + "value": "U+02AD0" }, { - entity: "csupe;", - value: "U+02AD2" + "entity": "csupe;", + "value": "U+02AD2" }, { - entity: "ctdot;", - value: "U+022EF" + "entity": "ctdot;", + "value": "U+022EF" }, { - entity: "cudarrl;", - value: "U+02938" + "entity": "cudarrl;", + "value": "U+02938" }, { - entity: "cudarrr;", - value: "U+02935" + "entity": "cudarrr;", + "value": "U+02935" }, { - entity: "cuepr;", - value: "U+022DE" + "entity": "cuepr;", + "value": "U+022DE" }, { - entity: "cuesc;", - value: "U+022DF" + "entity": "cuesc;", + "value": "U+022DF" }, { - entity: "cularr;", - value: "U+021B6" + "entity": "cularr;", + "value": "U+021B6" }, { - entity: "cularrp;", - value: "U+0293D" + "entity": "cularrp;", + "value": "U+0293D" }, { - entity: "cup;", - value: "U+0222A" + "entity": "cup;", + "value": "U+0222A" }, { - entity: "cupbrcap;", - value: "U+02A48" + "entity": "cupbrcap;", + "value": "U+02A48" }, { - entity: "cupcap;", - value: "U+02A46" + "entity": "cupcap;", + "value": "U+02A46" }, { - entity: "cupcup;", - value: "U+02A4A" + "entity": "cupcup;", + "value": "U+02A4A" }, { - entity: "cupdot;", - value: "U+0228D" + "entity": "cupdot;", + "value": "U+0228D" }, { - entity: "cupor;", - value: "U+02A45" + "entity": "cupor;", + "value": "U+02A45" }, { - entity: "curarr;", - value: "U+021B7" + "entity": "curarr;", + "value": "U+021B7" }, { - entity: "curarrm;", - value: "U+0293C" + "entity": "curarrm;", + "value": "U+0293C" }, { - entity: "curlyeqprec;", - value: "U+022DE" + "entity": "curlyeqprec;", + "value": "U+022DE" }, { - entity: "curlyeqsucc;", - value: "U+022DF" + "entity": "curlyeqsucc;", + "value": "U+022DF" }, { - entity: "curlyvee;", - value: "U+022CE" + "entity": "curlyvee;", + "value": "U+022CE" }, { - entity: "curlywedge;", - value: "U+022CF" + "entity": "curlywedge;", + "value": "U+022CF" }, { - entity: "curren;", - value: "U+000A4" + "entity": "curren;", + "value": "U+000A4" }, { - entity: "curren", - value: "U+000A4" + "entity": "curren", + "value": "U+000A4" }, { - entity: "curvearrowleft;", - value: "U+021B6" + "entity": "curvearrowleft;", + "value": "U+021B6" }, { - entity: "curvearrowright;", - value: "U+021B7" + "entity": "curvearrowright;", + "value": "U+021B7" }, { - entity: "cuvee;", - value: "U+022CE" + "entity": "cuvee;", + "value": "U+022CE" }, { - entity: "cuwed;", - value: "U+022CF" + "entity": "cuwed;", + "value": "U+022CF" }, { - entity: "cwconint;", - value: "U+02232" + "entity": "cwconint;", + "value": "U+02232" }, { - entity: "cwint;", - value: "U+02231" + "entity": "cwint;", + "value": "U+02231" }, { - entity: "cylcty;", - value: "U+0232D" + "entity": "cylcty;", + "value": "U+0232D" }, { - entity: "dArr;", - value: "U+021D3" + "entity": "dArr;", + "value": "U+021D3" }, { - entity: "dHar;", - value: "U+02965" + "entity": "dHar;", + "value": "U+02965" }, { - entity: "dagger;", - value: "U+02020" + "entity": "dagger;", + "value": "U+02020" }, { - entity: "daleth;", - value: "U+02138" + "entity": "daleth;", + "value": "U+02138" }, { - entity: "darr;", - value: "U+02193" + "entity": "darr;", + "value": "U+02193" }, { - entity: "dash;", - value: "U+02010" + "entity": "dash;", + "value": "U+02010" }, { - entity: "dashv;", - value: "U+022A3" + "entity": "dashv;", + "value": "U+022A3" }, { - entity: "dbkarow;", - value: "U+0290F" + "entity": "dbkarow;", + "value": "U+0290F" }, { - entity: "dblac;", - value: "U+002DD" + "entity": "dblac;", + "value": "U+002DD" }, { - entity: "dcaron;", - value: "U+0010F" + "entity": "dcaron;", + "value": "U+0010F" }, { - entity: "dcy;", - value: "U+00434" + "entity": "dcy;", + "value": "U+00434" }, { - entity: "dd;", - value: "U+02146" + "entity": "dd;", + "value": "U+02146" }, { - entity: "ddagger;", - value: "U+02021" + "entity": "ddagger;", + "value": "U+02021" }, { - entity: "ddarr;", - value: "U+021CA" + "entity": "ddarr;", + "value": "U+021CA" }, { - entity: "ddotseq;", - value: "U+02A77" + "entity": "ddotseq;", + "value": "U+02A77" }, { - entity: "deg;", - value: "U+000B0" + "entity": "deg;", + "value": "U+000B0" }, { - entity: "deg", - value: "U+000B0" + "entity": "deg", + "value": "U+000B0" }, { - entity: "delta;", - value: "U+003B4" + "entity": "delta;", + "value": "U+003B4" }, { - entity: "demptyv;", - value: "U+029B1" + "entity": "demptyv;", + "value": "U+029B1" }, { - entity: "dfisht;", - value: "U+0297F" + "entity": "dfisht;", + "value": "U+0297F" }, { - entity: "dfr;", - value: "U+1D521" + "entity": "dfr;", + "value": "U+1D521" }, { - entity: "dharl;", - value: "U+021C3" + "entity": "dharl;", + "value": "U+021C3" }, { - entity: "dharr;", - value: "U+021C2" + "entity": "dharr;", + "value": "U+021C2" }, { - entity: "diam;", - value: "U+022C4" + "entity": "diam;", + "value": "U+022C4" }, { - entity: "diamond;", - value: "U+022C4" + "entity": "diamond;", + "value": "U+022C4" }, { - entity: "diamondsuit;", - value: "U+02666" + "entity": "diamondsuit;", + "value": "U+02666" }, { - entity: "diams;", - value: "U+02666" + "entity": "diams;", + "value": "U+02666" }, { - entity: "die;", - value: "U+000A8" + "entity": "die;", + "value": "U+000A8" }, { - entity: "digamma;", - value: "U+003DD" + "entity": "digamma;", + "value": "U+003DD" }, { - entity: "disin;", - value: "U+022F2" + "entity": "disin;", + "value": "U+022F2" }, { - entity: "div;", - value: "U+000F7" + "entity": "div;", + "value": "U+000F7" }, { - entity: "divide;", - value: "U+000F7" + "entity": "divide;", + "value": "U+000F7" }, { - entity: "divide", - value: "U+000F7" + "entity": "divide", + "value": "U+000F7" }, { - entity: "divideontimes;", - value: "U+022C7" + "entity": "divideontimes;", + "value": "U+022C7" }, { - entity: "divonx;", - value: "U+022C7" + "entity": "divonx;", + "value": "U+022C7" }, { - entity: "djcy;", - value: "U+00452" + "entity": "djcy;", + "value": "U+00452" }, { - entity: "dlcorn;", - value: "U+0231E" + "entity": "dlcorn;", + "value": "U+0231E" }, { - entity: "dlcrop;", - value: "U+0230D" + "entity": "dlcrop;", + "value": "U+0230D" }, { - entity: "dollar;", - value: "U+00024" + "entity": "dollar;", + "value": "U+00024" }, { - entity: "dopf;", - value: "U+1D555" + "entity": "dopf;", + "value": "U+1D555" }, { - entity: "dot;", - value: "U+002D9" + "entity": "dot;", + "value": "U+002D9" }, { - entity: "doteq;", - value: "U+02250" + "entity": "doteq;", + "value": "U+02250" }, { - entity: "doteqdot;", - value: "U+02251" + "entity": "doteqdot;", + "value": "U+02251" }, { - entity: "dotminus;", - value: "U+02238" + "entity": "dotminus;", + "value": "U+02238" }, { - entity: "dotplus;", - value: "U+02214" + "entity": "dotplus;", + "value": "U+02214" }, { - entity: "dotsquare;", - value: "U+022A1" + "entity": "dotsquare;", + "value": "U+022A1" }, { - entity: "doublebarwedge;", - value: "U+02306" + "entity": "doublebarwedge;", + "value": "U+02306" }, { - entity: "downarrow;", - value: "U+02193" + "entity": "downarrow;", + "value": "U+02193" }, { - entity: "downdownarrows;", - value: "U+021CA" + "entity": "downdownarrows;", + "value": "U+021CA" }, { - entity: "downharpoonleft;", - value: "U+021C3" + "entity": "downharpoonleft;", + "value": "U+021C3" }, { - entity: "downharpoonright;", - value: "U+021C2" + "entity": "downharpoonright;", + "value": "U+021C2" }, { - entity: "drbkarow;", - value: "U+02910" + "entity": "drbkarow;", + "value": "U+02910" }, { - entity: "drcorn;", - value: "U+0231F" + "entity": "drcorn;", + "value": "U+0231F" }, { - entity: "drcrop;", - value: "U+0230C" + "entity": "drcrop;", + "value": "U+0230C" }, { - entity: "dscr;", - value: "U+1D4B9" + "entity": "dscr;", + "value": "U+1D4B9" }, { - entity: "dscy;", - value: "U+00455" + "entity": "dscy;", + "value": "U+00455" }, { - entity: "dsol;", - value: "U+029F6" + "entity": "dsol;", + "value": "U+029F6" }, { - entity: "dstrok;", - value: "U+00111" + "entity": "dstrok;", + "value": "U+00111" }, { - entity: "dtdot;", - value: "U+022F1" + "entity": "dtdot;", + "value": "U+022F1" }, { - entity: "dtri;", - value: "U+025BF" + "entity": "dtri;", + "value": "U+025BF" }, { - entity: "dtrif;", - value: "U+025BE" + "entity": "dtrif;", + "value": "U+025BE" }, { - entity: "duarr;", - value: "U+021F5" + "entity": "duarr;", + "value": "U+021F5" }, { - entity: "duhar;", - value: "U+0296F" + "entity": "duhar;", + "value": "U+0296F" }, { - entity: "dwangle;", - value: "U+029A6" + "entity": "dwangle;", + "value": "U+029A6" }, { - entity: "dzcy;", - value: "U+0045F" + "entity": "dzcy;", + "value": "U+0045F" }, { - entity: "dzigrarr;", - value: "U+027FF" + "entity": "dzigrarr;", + "value": "U+027FF" }, { - entity: "eDDot;", - value: "U+02A77" + "entity": "eDDot;", + "value": "U+02A77" }, { - entity: "eDot;", - value: "U+02251" + "entity": "eDot;", + "value": "U+02251" }, { - entity: "eacute;", - value: "U+000E9" + "entity": "eacute;", + "value": "U+000E9" }, { - entity: "eacute", - value: "U+000E9" + "entity": "eacute", + "value": "U+000E9" }, { - entity: "easter;", - value: "U+02A6E" + "entity": "easter;", + "value": "U+02A6E" }, { - entity: "ecaron;", - value: "U+0011B" + "entity": "ecaron;", + "value": "U+0011B" }, { - entity: "ecir;", - value: "U+02256" + "entity": "ecir;", + "value": "U+02256" }, { - entity: "ecirc;", - value: "U+000EA" + "entity": "ecirc;", + "value": "U+000EA" }, { - entity: "ecirc", - value: "U+000EA" + "entity": "ecirc", + "value": "U+000EA" }, { - entity: "ecolon;", - value: "U+02255" + "entity": "ecolon;", + "value": "U+02255" }, { - entity: "ecy;", - value: "U+0044D" + "entity": "ecy;", + "value": "U+0044D" }, { - entity: "edot;", - value: "U+00117" + "entity": "edot;", + "value": "U+00117" }, { - entity: "ee;", - value: "U+02147" + "entity": "ee;", + "value": "U+02147" }, { - entity: "efDot;", - value: "U+02252" + "entity": "efDot;", + "value": "U+02252" }, { - entity: "efr;", - value: "U+1D522" + "entity": "efr;", + "value": "U+1D522" }, { - entity: "eg;", - value: "U+02A9A" + "entity": "eg;", + "value": "U+02A9A" }, { - entity: "egrave;", - value: "U+000E8" + "entity": "egrave;", + "value": "U+000E8" }, { - entity: "egrave", - value: "U+000E8" + "entity": "egrave", + "value": "U+000E8" }, { - entity: "egs;", - value: "U+02A96" + "entity": "egs;", + "value": "U+02A96" }, { - entity: "egsdot;", - value: "U+02A98" + "entity": "egsdot;", + "value": "U+02A98" }, { - entity: "el;", - value: "U+02A99" + "entity": "el;", + "value": "U+02A99" }, { - entity: "elinters;", - value: "U+023E7" + "entity": "elinters;", + "value": "U+023E7" }, { - entity: "ell;", - value: "U+02113" + "entity": "ell;", + "value": "U+02113" }, { - entity: "els;", - value: "U+02A95" + "entity": "els;", + "value": "U+02A95" }, { - entity: "elsdot;", - value: "U+02A97" + "entity": "elsdot;", + "value": "U+02A97" }, { - entity: "emacr;", - value: "U+00113" + "entity": "emacr;", + "value": "U+00113" }, { - entity: "empty;", - value: "U+02205" + "entity": "empty;", + "value": "U+02205" }, { - entity: "emptyset;", - value: "U+02205" + "entity": "emptyset;", + "value": "U+02205" }, { - entity: "emptyv;", - value: "U+02205" + "entity": "emptyv;", + "value": "U+02205" }, { - entity: "emsp13;", - value: "U+02004" + "entity": "emsp13;", + "value": "U+02004" }, { - entity: "emsp14;", - value: "U+02005" + "entity": "emsp14;", + "value": "U+02005" }, { - entity: "emsp;", - value: "U+02003" + "entity": "emsp;", + "value": "U+02003" }, { - entity: "eng;", - value: "U+0014B" + "entity": "eng;", + "value": "U+0014B" }, { - entity: "ensp;", - value: "U+02002" + "entity": "ensp;", + "value": "U+02002" }, { - entity: "eogon;", - value: "U+00119" + "entity": "eogon;", + "value": "U+00119" }, { - entity: "eopf;", - value: "U+1D556" + "entity": "eopf;", + "value": "U+1D556" }, { - entity: "epar;", - value: "U+022D5" + "entity": "epar;", + "value": "U+022D5" }, { - entity: "eparsl;", - value: "U+029E3" + "entity": "eparsl;", + "value": "U+029E3" }, { - entity: "eplus;", - value: "U+02A71" + "entity": "eplus;", + "value": "U+02A71" }, { - entity: "epsi;", - value: "U+003B5" + "entity": "epsi;", + "value": "U+003B5" }, { - entity: "epsilon;", - value: "U+003B5" + "entity": "epsilon;", + "value": "U+003B5" }, { - entity: "epsiv;", - value: "U+003F5" + "entity": "epsiv;", + "value": "U+003F5" }, { - entity: "eqcirc;", - value: "U+02256" + "entity": "eqcirc;", + "value": "U+02256" }, { - entity: "eqcolon;", - value: "U+02255" + "entity": "eqcolon;", + "value": "U+02255" }, { - entity: "eqsim;", - value: "U+02242" + "entity": "eqsim;", + "value": "U+02242" }, { - entity: "eqslantgtr;", - value: "U+02A96" + "entity": "eqslantgtr;", + "value": "U+02A96" }, { - entity: "eqslantless;", - value: "U+02A95" + "entity": "eqslantless;", + "value": "U+02A95" }, { - entity: "equals;", - value: "U+0003D" + "entity": "equals;", + "value": "U+0003D" }, { - entity: "equest;", - value: "U+0225F" + "entity": "equest;", + "value": "U+0225F" }, { - entity: "equiv;", - value: "U+02261" + "entity": "equiv;", + "value": "U+02261" }, { - entity: "equivDD;", - value: "U+02A78" + "entity": "equivDD;", + "value": "U+02A78" }, { - entity: "eqvparsl;", - value: "U+029E5" + "entity": "eqvparsl;", + "value": "U+029E5" }, { - entity: "erDot;", - value: "U+02253" + "entity": "erDot;", + "value": "U+02253" }, { - entity: "erarr;", - value: "U+02971" + "entity": "erarr;", + "value": "U+02971" }, { - entity: "escr;", - value: "U+0212F" + "entity": "escr;", + "value": "U+0212F" }, { - entity: "esdot;", - value: "U+02250" + "entity": "esdot;", + "value": "U+02250" }, { - entity: "esim;", - value: "U+02242" + "entity": "esim;", + "value": "U+02242" }, { - entity: "eta;", - value: "U+003B7" + "entity": "eta;", + "value": "U+003B7" }, { - entity: "eth;", - value: "U+000F0" + "entity": "eth;", + "value": "U+000F0" }, { - entity: "eth", - value: "U+000F0" + "entity": "eth", + "value": "U+000F0" }, { - entity: "euml;", - value: "U+000EB" + "entity": "euml;", + "value": "U+000EB" }, { - entity: "euml", - value: "U+000EB" + "entity": "euml", + "value": "U+000EB" }, { - entity: "euro;", - value: "U+020AC" + "entity": "euro;", + "value": "U+020AC" }, { - entity: "excl;", - value: "U+00021" + "entity": "excl;", + "value": "U+00021" }, { - entity: "exist;", - value: "U+02203" + "entity": "exist;", + "value": "U+02203" }, { - entity: "expectation;", - value: "U+02130" + "entity": "expectation;", + "value": "U+02130" }, { - entity: "exponentiale;", - value: "U+02147" + "entity": "exponentiale;", + "value": "U+02147" }, { - entity: "fallingdotseq;", - value: "U+02252" + "entity": "fallingdotseq;", + "value": "U+02252" }, { - entity: "fcy;", - value: "U+00444" + "entity": "fcy;", + "value": "U+00444" }, { - entity: "female;", - value: "U+02640" + "entity": "female;", + "value": "U+02640" }, { - entity: "ffilig;", - value: "U+0FB03" + "entity": "ffilig;", + "value": "U+0FB03" }, { - entity: "fflig;", - value: "U+0FB00" + "entity": "fflig;", + "value": "U+0FB00" }, { - entity: "ffllig;", - value: "U+0FB04" + "entity": "ffllig;", + "value": "U+0FB04" }, { - entity: "ffr;", - value: "U+1D523" + "entity": "ffr;", + "value": "U+1D523" }, { - entity: "filig;", - value: "U+0FB01" + "entity": "filig;", + "value": "U+0FB01" }, { - entity: "flat;", - value: "U+0266D" + "entity": "flat;", + "value": "U+0266D" }, { - entity: "fllig;", - value: "U+0FB02" + "entity": "fllig;", + "value": "U+0FB02" }, { - entity: "fltns;", - value: "U+025B1" + "entity": "fltns;", + "value": "U+025B1" }, { - entity: "fnof;", - value: "U+00192" + "entity": "fnof;", + "value": "U+00192" }, { - entity: "fopf;", - value: "U+1D557" + "entity": "fopf;", + "value": "U+1D557" }, { - entity: "forall;", - value: "U+02200" + "entity": "forall;", + "value": "U+02200" }, { - entity: "fork;", - value: "U+022D4" + "entity": "fork;", + "value": "U+022D4" }, { - entity: "forkv;", - value: "U+02AD9" + "entity": "forkv;", + "value": "U+02AD9" }, { - entity: "fpartint;", - value: "U+02A0D" + "entity": "fpartint;", + "value": "U+02A0D" }, { - entity: "frac12;", - value: "U+000BD" + "entity": "frac12;", + "value": "U+000BD" }, { - entity: "frac12", - value: "U+000BD" + "entity": "frac12", + "value": "U+000BD" }, { - entity: "frac13;", - value: "U+02153" + "entity": "frac13;", + "value": "U+02153" }, { - entity: "frac14;", - value: "U+000BC" + "entity": "frac14;", + "value": "U+000BC" }, { - entity: "frac14", - value: "U+000BC" + "entity": "frac14", + "value": "U+000BC" }, { - entity: "frac15;", - value: "U+02155" + "entity": "frac15;", + "value": "U+02155" }, { - entity: "frac16;", - value: "U+02159" + "entity": "frac16;", + "value": "U+02159" }, { - entity: "frac18;", - value: "U+0215B" + "entity": "frac18;", + "value": "U+0215B" }, { - entity: "frac23;", - value: "U+02154" + "entity": "frac23;", + "value": "U+02154" }, { - entity: "frac25;", - value: "U+02156" + "entity": "frac25;", + "value": "U+02156" }, { - entity: "frac34;", - value: "U+000BE" + "entity": "frac34;", + "value": "U+000BE" }, { - entity: "frac34", - value: "U+000BE" + "entity": "frac34", + "value": "U+000BE" }, { - entity: "frac35;", - value: "U+02157" + "entity": "frac35;", + "value": "U+02157" }, { - entity: "frac38;", - value: "U+0215C" + "entity": "frac38;", + "value": "U+0215C" }, { - entity: "frac45;", - value: "U+02158" + "entity": "frac45;", + "value": "U+02158" }, { - entity: "frac56;", - value: "U+0215A" + "entity": "frac56;", + "value": "U+0215A" }, { - entity: "frac58;", - value: "U+0215D" + "entity": "frac58;", + "value": "U+0215D" }, { - entity: "frac78;", - value: "U+0215E" + "entity": "frac78;", + "value": "U+0215E" }, { - entity: "frasl;", - value: "U+02044" + "entity": "frasl;", + "value": "U+02044" }, { - entity: "frown;", - value: "U+02322" + "entity": "frown;", + "value": "U+02322" }, { - entity: "fscr;", - value: "U+1D4BB" + "entity": "fscr;", + "value": "U+1D4BB" }, { - entity: "gE;", - value: "U+02267" + "entity": "gE;", + "value": "U+02267" }, { - entity: "gEl;", - value: "U+02A8C" + "entity": "gEl;", + "value": "U+02A8C" }, { - entity: "gacute;", - value: "U+001F5" + "entity": "gacute;", + "value": "U+001F5" }, { - entity: "gamma;", - value: "U+003B3" + "entity": "gamma;", + "value": "U+003B3" }, { - entity: "gammad;", - value: "U+003DD" + "entity": "gammad;", + "value": "U+003DD" }, { - entity: "gap;", - value: "U+02A86" + "entity": "gap;", + "value": "U+02A86" }, { - entity: "gbreve;", - value: "U+0011F" + "entity": "gbreve;", + "value": "U+0011F" }, { - entity: "gcirc;", - value: "U+0011D" + "entity": "gcirc;", + "value": "U+0011D" }, { - entity: "gcy;", - value: "U+00433" + "entity": "gcy;", + "value": "U+00433" }, { - entity: "gdot;", - value: "U+00121" + "entity": "gdot;", + "value": "U+00121" }, { - entity: "ge;", - value: "U+02265" + "entity": "ge;", + "value": "U+02265" }, { - entity: "gel;", - value: "U+022DB" + "entity": "gel;", + "value": "U+022DB" }, { - entity: "geq;", - value: "U+02265" + "entity": "geq;", + "value": "U+02265" }, { - entity: "geqq;", - value: "U+02267" + "entity": "geqq;", + "value": "U+02267" }, { - entity: "geqslant;", - value: "U+02A7E" + "entity": "geqslant;", + "value": "U+02A7E" }, { - entity: "ges;", - value: "U+02A7E" + "entity": "ges;", + "value": "U+02A7E" }, { - entity: "gescc;", - value: "U+02AA9" + "entity": "gescc;", + "value": "U+02AA9" }, { - entity: "gesdot;", - value: "U+02A80" + "entity": "gesdot;", + "value": "U+02A80" }, { - entity: "gesdoto;", - value: "U+02A82" + "entity": "gesdoto;", + "value": "U+02A82" }, { - entity: "gesdotol;", - value: "U+02A84" + "entity": "gesdotol;", + "value": "U+02A84" }, { - entity: "gesles;", - value: "U+02A94" + "entity": "gesles;", + "value": "U+02A94" }, { - entity: "gfr;", - value: "U+1D524" + "entity": "gfr;", + "value": "U+1D524" }, { - entity: "gg;", - value: "U+0226B" + "entity": "gg;", + "value": "U+0226B" }, { - entity: "ggg;", - value: "U+022D9" + "entity": "ggg;", + "value": "U+022D9" }, { - entity: "gimel;", - value: "U+02137" + "entity": "gimel;", + "value": "U+02137" }, { - entity: "gjcy;", - value: "U+00453" + "entity": "gjcy;", + "value": "U+00453" }, { - entity: "gl;", - value: "U+02277" + "entity": "gl;", + "value": "U+02277" }, { - entity: "glE;", - value: "U+02A92" + "entity": "glE;", + "value": "U+02A92" }, { - entity: "gla;", - value: "U+02AA5" + "entity": "gla;", + "value": "U+02AA5" }, { - entity: "glj;", - value: "U+02AA4" + "entity": "glj;", + "value": "U+02AA4" }, { - entity: "gnE;", - value: "U+02269" + "entity": "gnE;", + "value": "U+02269" }, { - entity: "gnap;", - value: "U+02A8A" + "entity": "gnap;", + "value": "U+02A8A" }, { - entity: "gnapprox;", - value: "U+02A8A" + "entity": "gnapprox;", + "value": "U+02A8A" }, { - entity: "gne;", - value: "U+02A88" + "entity": "gne;", + "value": "U+02A88" }, { - entity: "gneq;", - value: "U+02A88" + "entity": "gneq;", + "value": "U+02A88" }, { - entity: "gneqq;", - value: "U+02269" + "entity": "gneqq;", + "value": "U+02269" }, { - entity: "gnsim;", - value: "U+022E7" + "entity": "gnsim;", + "value": "U+022E7" }, { - entity: "gopf;", - value: "U+1D558" + "entity": "gopf;", + "value": "U+1D558" }, { - entity: "grave;", - value: "U+00060" + "entity": "grave;", + "value": "U+00060" }, { - entity: "gscr;", - value: "U+0210A" + "entity": "gscr;", + "value": "U+0210A" }, { - entity: "gsim;", - value: "U+02273" + "entity": "gsim;", + "value": "U+02273" }, { - entity: "gsime;", - value: "U+02A8E" + "entity": "gsime;", + "value": "U+02A8E" }, { - entity: "gsiml;", - value: "U+02A90" + "entity": "gsiml;", + "value": "U+02A90" }, { - entity: "gt;", - value: "U+0003E" + "entity": "gt;", + "value": "U+0003E" }, { - entity: "gt", - value: "U+0003E" + "entity": "gt", + "value": "U+0003E" }, { - entity: "gtcc;", - value: "U+02AA7" + "entity": "gtcc;", + "value": "U+02AA7" }, { - entity: "gtcir;", - value: "U+02A7A" + "entity": "gtcir;", + "value": "U+02A7A" }, { - entity: "gtdot;", - value: "U+022D7" + "entity": "gtdot;", + "value": "U+022D7" }, { - entity: "gtlPar;", - value: "U+02995" + "entity": "gtlPar;", + "value": "U+02995" }, { - entity: "gtquest;", - value: "U+02A7C" + "entity": "gtquest;", + "value": "U+02A7C" }, { - entity: "gtrapprox;", - value: "U+02A86" + "entity": "gtrapprox;", + "value": "U+02A86" }, { - entity: "gtrarr;", - value: "U+02978" + "entity": "gtrarr;", + "value": "U+02978" }, { - entity: "gtrdot;", - value: "U+022D7" + "entity": "gtrdot;", + "value": "U+022D7" }, { - entity: "gtreqless;", - value: "U+022DB" + "entity": "gtreqless;", + "value": "U+022DB" }, { - entity: "gtreqqless;", - value: "U+02A8C" + "entity": "gtreqqless;", + "value": "U+02A8C" }, { - entity: "gtrless;", - value: "U+02277" + "entity": "gtrless;", + "value": "U+02277" }, { - entity: "gtrsim;", - value: "U+02273" + "entity": "gtrsim;", + "value": "U+02273" }, { - entity: "hArr;", - value: "U+021D4" + "entity": "hArr;", + "value": "U+021D4" }, { - entity: "hairsp;", - value: "U+0200A" + "entity": "hairsp;", + "value": "U+0200A" }, { - entity: "half;", - value: "U+000BD" + "entity": "half;", + "value": "U+000BD" }, { - entity: "hamilt;", - value: "U+0210B" + "entity": "hamilt;", + "value": "U+0210B" }, { - entity: "hardcy;", - value: "U+0044A" + "entity": "hardcy;", + "value": "U+0044A" }, { - entity: "harr;", - value: "U+02194" + "entity": "harr;", + "value": "U+02194" }, { - entity: "harrcir;", - value: "U+02948" + "entity": "harrcir;", + "value": "U+02948" }, { - entity: "harrw;", - value: "U+021AD" + "entity": "harrw;", + "value": "U+021AD" }, { - entity: "hbar;", - value: "U+0210F" + "entity": "hbar;", + "value": "U+0210F" }, { - entity: "hcirc;", - value: "U+00125" + "entity": "hcirc;", + "value": "U+00125" }, { - entity: "hearts;", - value: "U+02665" + "entity": "hearts;", + "value": "U+02665" }, { - entity: "heartsuit;", - value: "U+02665" + "entity": "heartsuit;", + "value": "U+02665" }, { - entity: "hellip;", - value: "U+02026" + "entity": "hellip;", + "value": "U+02026" }, { - entity: "hercon;", - value: "U+022B9" + "entity": "hercon;", + "value": "U+022B9" }, { - entity: "hfr;", - value: "U+1D525" + "entity": "hfr;", + "value": "U+1D525" }, { - entity: "hksearow;", - value: "U+02925" + "entity": "hksearow;", + "value": "U+02925" }, { - entity: "hkswarow;", - value: "U+02926" + "entity": "hkswarow;", + "value": "U+02926" }, { - entity: "hoarr;", - value: "U+021FF" + "entity": "hoarr;", + "value": "U+021FF" }, { - entity: "homtht;", - value: "U+0223B" + "entity": "homtht;", + "value": "U+0223B" }, { - entity: "hookleftarrow;", - value: "U+021A9" + "entity": "hookleftarrow;", + "value": "U+021A9" }, { - entity: "hookrightarrow;", - value: "U+021AA" + "entity": "hookrightarrow;", + "value": "U+021AA" }, { - entity: "hopf;", - value: "U+1D559" + "entity": "hopf;", + "value": "U+1D559" }, { - entity: "horbar;", - value: "U+02015" + "entity": "horbar;", + "value": "U+02015" }, { - entity: "hscr;", - value: "U+1D4BD" + "entity": "hscr;", + "value": "U+1D4BD" }, { - entity: "hslash;", - value: "U+0210F" + "entity": "hslash;", + "value": "U+0210F" }, { - entity: "hstrok;", - value: "U+00127" + "entity": "hstrok;", + "value": "U+00127" }, { - entity: "hybull;", - value: "U+02043" + "entity": "hybull;", + "value": "U+02043" }, { - entity: "hyphen;", - value: "U+02010" + "entity": "hyphen;", + "value": "U+02010" }, { - entity: "iacute;", - value: "U+000ED" + "entity": "iacute;", + "value": "U+000ED" }, { - entity: "iacute", - value: "U+000ED" + "entity": "iacute", + "value": "U+000ED" }, { - entity: "ic;", - value: "U+02063" + "entity": "ic;", + "value": "U+02063" }, { - entity: "icirc;", - value: "U+000EE" + "entity": "icirc;", + "value": "U+000EE" }, { - entity: "icirc", - value: "U+000EE" + "entity": "icirc", + "value": "U+000EE" }, { - entity: "icy;", - value: "U+00438" + "entity": "icy;", + "value": "U+00438" }, { - entity: "iecy;", - value: "U+00435" + "entity": "iecy;", + "value": "U+00435" }, { - entity: "iexcl;", - value: "U+000A1" + "entity": "iexcl;", + "value": "U+000A1" }, { - entity: "iexcl", - value: "U+000A1" + "entity": "iexcl", + "value": "U+000A1" }, { - entity: "iff;", - value: "U+021D4" + "entity": "iff;", + "value": "U+021D4" }, { - entity: "ifr;", - value: "U+1D526" + "entity": "ifr;", + "value": "U+1D526" }, { - entity: "igrave;", - value: "U+000EC" + "entity": "igrave;", + "value": "U+000EC" }, { - entity: "igrave", - value: "U+000EC" + "entity": "igrave", + "value": "U+000EC" }, { - entity: "ii;", - value: "U+02148" + "entity": "ii;", + "value": "U+02148" }, { - entity: "iiiint;", - value: "U+02A0C" + "entity": "iiiint;", + "value": "U+02A0C" }, { - entity: "iiint;", - value: "U+0222D" + "entity": "iiint;", + "value": "U+0222D" }, { - entity: "iinfin;", - value: "U+029DC" + "entity": "iinfin;", + "value": "U+029DC" }, { - entity: "iiota;", - value: "U+02129" + "entity": "iiota;", + "value": "U+02129" }, { - entity: "ijlig;", - value: "U+00133" + "entity": "ijlig;", + "value": "U+00133" }, { - entity: "imacr;", - value: "U+0012B" + "entity": "imacr;", + "value": "U+0012B" }, { - entity: "image;", - value: "U+02111" + "entity": "image;", + "value": "U+02111" }, { - entity: "imagline;", - value: "U+02110" + "entity": "imagline;", + "value": "U+02110" }, { - entity: "imagpart;", - value: "U+02111" + "entity": "imagpart;", + "value": "U+02111" }, { - entity: "imath;", - value: "U+00131" + "entity": "imath;", + "value": "U+00131" }, { - entity: "imof;", - value: "U+022B7" + "entity": "imof;", + "value": "U+022B7" }, { - entity: "imped;", - value: "U+001B5" + "entity": "imped;", + "value": "U+001B5" }, { - entity: "in;", - value: "U+02208" + "entity": "in;", + "value": "U+02208" }, { - entity: "incare;", - value: "U+02105" + "entity": "incare;", + "value": "U+02105" }, { - entity: "infin;", - value: "U+0221E" + "entity": "infin;", + "value": "U+0221E" }, { - entity: "infintie;", - value: "U+029DD" + "entity": "infintie;", + "value": "U+029DD" }, { - entity: "inodot;", - value: "U+00131" + "entity": "inodot;", + "value": "U+00131" }, { - entity: "int;", - value: "U+0222B" + "entity": "int;", + "value": "U+0222B" }, { - entity: "intcal;", - value: "U+022BA" + "entity": "intcal;", + "value": "U+022BA" }, { - entity: "integers;", - value: "U+02124" + "entity": "integers;", + "value": "U+02124" }, { - entity: "intercal;", - value: "U+022BA" + "entity": "intercal;", + "value": "U+022BA" }, { - entity: "intlarhk;", - value: "U+02A17" + "entity": "intlarhk;", + "value": "U+02A17" }, { - entity: "intprod;", - value: "U+02A3C" + "entity": "intprod;", + "value": "U+02A3C" }, { - entity: "iocy;", - value: "U+00451" + "entity": "iocy;", + "value": "U+00451" }, { - entity: "iogon;", - value: "U+0012F" + "entity": "iogon;", + "value": "U+0012F" }, { - entity: "iopf;", - value: "U+1D55A" + "entity": "iopf;", + "value": "U+1D55A" }, { - entity: "iota;", - value: "U+003B9" + "entity": "iota;", + "value": "U+003B9" }, { - entity: "iprod;", - value: "U+02A3C" + "entity": "iprod;", + "value": "U+02A3C" }, { - entity: "iquest;", - value: "U+000BF" + "entity": "iquest;", + "value": "U+000BF" }, { - entity: "iquest", - value: "U+000BF" + "entity": "iquest", + "value": "U+000BF" }, { - entity: "iscr;", - value: "U+1D4BE" + "entity": "iscr;", + "value": "U+1D4BE" }, { - entity: "isin;", - value: "U+02208" + "entity": "isin;", + "value": "U+02208" }, { - entity: "isinE;", - value: "U+022F9" + "entity": "isinE;", + "value": "U+022F9" }, { - entity: "isindot;", - value: "U+022F5" + "entity": "isindot;", + "value": "U+022F5" }, { - entity: "isins;", - value: "U+022F4" + "entity": "isins;", + "value": "U+022F4" }, { - entity: "isinsv;", - value: "U+022F3" + "entity": "isinsv;", + "value": "U+022F3" }, { - entity: "isinv;", - value: "U+02208" + "entity": "isinv;", + "value": "U+02208" }, { - entity: "it;", - value: "U+02062" + "entity": "it;", + "value": "U+02062" }, { - entity: "itilde;", - value: "U+00129" + "entity": "itilde;", + "value": "U+00129" }, { - entity: "iukcy;", - value: "U+00456" + "entity": "iukcy;", + "value": "U+00456" }, { - entity: "iuml;", - value: "U+000EF" + "entity": "iuml;", + "value": "U+000EF" }, { - entity: "iuml", - value: "U+000EF" + "entity": "iuml", + "value": "U+000EF" }, { - entity: "jcirc;", - value: "U+00135" + "entity": "jcirc;", + "value": "U+00135" }, { - entity: "jcy;", - value: "U+00439" + "entity": "jcy;", + "value": "U+00439" }, { - entity: "jfr;", - value: "U+1D527" + "entity": "jfr;", + "value": "U+1D527" }, { - entity: "jmath;", - value: "U+00237" + "entity": "jmath;", + "value": "U+00237" }, { - entity: "jopf;", - value: "U+1D55B" + "entity": "jopf;", + "value": "U+1D55B" }, { - entity: "jscr;", - value: "U+1D4BF" + "entity": "jscr;", + "value": "U+1D4BF" }, { - entity: "jsercy;", - value: "U+00458" + "entity": "jsercy;", + "value": "U+00458" }, { - entity: "jukcy;", - value: "U+00454" + "entity": "jukcy;", + "value": "U+00454" }, { - entity: "kappa;", - value: "U+003BA" + "entity": "kappa;", + "value": "U+003BA" }, { - entity: "kappav;", - value: "U+003F0" + "entity": "kappav;", + "value": "U+003F0" }, { - entity: "kcedil;", - value: "U+00137" + "entity": "kcedil;", + "value": "U+00137" }, { - entity: "kcy;", - value: "U+0043A" + "entity": "kcy;", + "value": "U+0043A" }, { - entity: "kfr;", - value: "U+1D528" + "entity": "kfr;", + "value": "U+1D528" }, { - entity: "kgreen;", - value: "U+00138" + "entity": "kgreen;", + "value": "U+00138" }, { - entity: "khcy;", - value: "U+00445" + "entity": "khcy;", + "value": "U+00445" }, { - entity: "kjcy;", - value: "U+0045C" + "entity": "kjcy;", + "value": "U+0045C" }, { - entity: "kopf;", - value: "U+1D55C" + "entity": "kopf;", + "value": "U+1D55C" }, { - entity: "kscr;", - value: "U+1D4C0" + "entity": "kscr;", + "value": "U+1D4C0" }, { - entity: "lAarr;", - value: "U+021DA" + "entity": "lAarr;", + "value": "U+021DA" }, { - entity: "lArr;", - value: "U+021D0" + "entity": "lArr;", + "value": "U+021D0" }, { - entity: "lAtail;", - value: "U+0291B" + "entity": "lAtail;", + "value": "U+0291B" }, { - entity: "lBarr;", - value: "U+0290E" + "entity": "lBarr;", + "value": "U+0290E" }, { - entity: "lE;", - value: "U+02266" + "entity": "lE;", + "value": "U+02266" }, { - entity: "lEg;", - value: "U+02A8B" + "entity": "lEg;", + "value": "U+02A8B" }, { - entity: "lHar;", - value: "U+02962" + "entity": "lHar;", + "value": "U+02962" }, { - entity: "lacute;", - value: "U+0013A" + "entity": "lacute;", + "value": "U+0013A" }, { - entity: "laemptyv;", - value: "U+029B4" + "entity": "laemptyv;", + "value": "U+029B4" }, { - entity: "lagran;", - value: "U+02112" + "entity": "lagran;", + "value": "U+02112" }, { - entity: "lambda;", - value: "U+003BB" + "entity": "lambda;", + "value": "U+003BB" }, { - entity: "lang;", - value: "U+027E8" + "entity": "lang;", + "value": "U+027E8" }, { - entity: "langd;", - value: "U+02991" + "entity": "langd;", + "value": "U+02991" }, { - entity: "langle;", - value: "U+027E8" + "entity": "langle;", + "value": "U+027E8" }, { - entity: "lap;", - value: "U+02A85" + "entity": "lap;", + "value": "U+02A85" }, { - entity: "laquo;", - value: "U+000AB" + "entity": "laquo;", + "value": "U+000AB" }, { - entity: "laquo", - value: "U+000AB" + "entity": "laquo", + "value": "U+000AB" }, { - entity: "larr;", - value: "U+02190" + "entity": "larr;", + "value": "U+02190" }, { - entity: "larrb;", - value: "U+021E4" + "entity": "larrb;", + "value": "U+021E4" }, { - entity: "larrbfs;", - value: "U+0291F" + "entity": "larrbfs;", + "value": "U+0291F" }, { - entity: "larrfs;", - value: "U+0291D" + "entity": "larrfs;", + "value": "U+0291D" }, { - entity: "larrhk;", - value: "U+021A9" + "entity": "larrhk;", + "value": "U+021A9" }, { - entity: "larrlp;", - value: "U+021AB" + "entity": "larrlp;", + "value": "U+021AB" }, { - entity: "larrpl;", - value: "U+02939" + "entity": "larrpl;", + "value": "U+02939" }, { - entity: "larrsim;", - value: "U+02973" + "entity": "larrsim;", + "value": "U+02973" }, { - entity: "larrtl;", - value: "U+021A2" + "entity": "larrtl;", + "value": "U+021A2" }, { - entity: "lat;", - value: "U+02AAB" + "entity": "lat;", + "value": "U+02AAB" }, { - entity: "latail;", - value: "U+02919" + "entity": "latail;", + "value": "U+02919" }, { - entity: "late;", - value: "U+02AAD" + "entity": "late;", + "value": "U+02AAD" }, { - entity: "lbarr;", - value: "U+0290C" + "entity": "lbarr;", + "value": "U+0290C" }, { - entity: "lbbrk;", - value: "U+02772" + "entity": "lbbrk;", + "value": "U+02772" }, { - entity: "lbrace;", - value: "U+0007B" + "entity": "lbrace;", + "value": "U+0007B" }, { - entity: "lbrack;", - value: "U+0005B" + "entity": "lbrack;", + "value": "U+0005B" }, { - entity: "lbrke;", - value: "U+0298B" + "entity": "lbrke;", + "value": "U+0298B" }, { - entity: "lbrksld;", - value: "U+0298F" + "entity": "lbrksld;", + "value": "U+0298F" }, { - entity: "lbrkslu;", - value: "U+0298D" + "entity": "lbrkslu;", + "value": "U+0298D" }, { - entity: "lcaron;", - value: "U+0013E" + "entity": "lcaron;", + "value": "U+0013E" }, { - entity: "lcedil;", - value: "U+0013C" + "entity": "lcedil;", + "value": "U+0013C" }, { - entity: "lceil;", - value: "U+02308" + "entity": "lceil;", + "value": "U+02308" }, { - entity: "lcub;", - value: "U+0007B" + "entity": "lcub;", + "value": "U+0007B" }, { - entity: "lcy;", - value: "U+0043B" + "entity": "lcy;", + "value": "U+0043B" }, { - entity: "ldca;", - value: "U+02936" + "entity": "ldca;", + "value": "U+02936" }, { - entity: "ldquo;", - value: "U+0201C" + "entity": "ldquo;", + "value": "U+0201C" }, { - entity: "ldquor;", - value: "U+0201E" + "entity": "ldquor;", + "value": "U+0201E" }, { - entity: "ldrdhar;", - value: "U+02967" + "entity": "ldrdhar;", + "value": "U+02967" }, { - entity: "ldrushar;", - value: "U+0294B" + "entity": "ldrushar;", + "value": "U+0294B" }, { - entity: "ldsh;", - value: "U+021B2" + "entity": "ldsh;", + "value": "U+021B2" }, { - entity: "le;", - value: "U+02264" + "entity": "le;", + "value": "U+02264" }, { - entity: "leftarrow;", - value: "U+02190" + "entity": "leftarrow;", + "value": "U+02190" }, { - entity: "leftarrowtail;", - value: "U+021A2" + "entity": "leftarrowtail;", + "value": "U+021A2" }, { - entity: "leftharpoondown;", - value: "U+021BD" + "entity": "leftharpoondown;", + "value": "U+021BD" }, { - entity: "leftharpoonup;", - value: "U+021BC" + "entity": "leftharpoonup;", + "value": "U+021BC" }, { - entity: "leftleftarrows;", - value: "U+021C7" + "entity": "leftleftarrows;", + "value": "U+021C7" }, { - entity: "leftrightarrow;", - value: "U+02194" + "entity": "leftrightarrow;", + "value": "U+02194" }, { - entity: "leftrightarrows;", - value: "U+021C6" + "entity": "leftrightarrows;", + "value": "U+021C6" }, { - entity: "leftrightharpoons;", - value: "U+021CB" + "entity": "leftrightharpoons;", + "value": "U+021CB" }, { - entity: "leftrightsquigarrow;", - value: "U+021AD" + "entity": "leftrightsquigarrow;", + "value": "U+021AD" }, { - entity: "leftthreetimes;", - value: "U+022CB" + "entity": "leftthreetimes;", + "value": "U+022CB" }, { - entity: "leg;", - value: "U+022DA" + "entity": "leg;", + "value": "U+022DA" }, { - entity: "leq;", - value: "U+02264" + "entity": "leq;", + "value": "U+02264" }, { - entity: "leqq;", - value: "U+02266" + "entity": "leqq;", + "value": "U+02266" }, { - entity: "leqslant;", - value: "U+02A7D" + "entity": "leqslant;", + "value": "U+02A7D" }, { - entity: "les;", - value: "U+02A7D" + "entity": "les;", + "value": "U+02A7D" }, { - entity: "lescc;", - value: "U+02AA8" + "entity": "lescc;", + "value": "U+02AA8" }, { - entity: "lesdot;", - value: "U+02A7F" + "entity": "lesdot;", + "value": "U+02A7F" }, { - entity: "lesdoto;", - value: "U+02A81" + "entity": "lesdoto;", + "value": "U+02A81" }, { - entity: "lesdotor;", - value: "U+02A83" + "entity": "lesdotor;", + "value": "U+02A83" }, { - entity: "lesges;", - value: "U+02A93" + "entity": "lesges;", + "value": "U+02A93" }, { - entity: "lessapprox;", - value: "U+02A85" + "entity": "lessapprox;", + "value": "U+02A85" }, { - entity: "lessdot;", - value: "U+022D6" + "entity": "lessdot;", + "value": "U+022D6" }, { - entity: "lesseqgtr;", - value: "U+022DA" + "entity": "lesseqgtr;", + "value": "U+022DA" }, { - entity: "lesseqqgtr;", - value: "U+02A8B" + "entity": "lesseqqgtr;", + "value": "U+02A8B" }, { - entity: "lessgtr;", - value: "U+02276" + "entity": "lessgtr;", + "value": "U+02276" }, { - entity: "lesssim;", - value: "U+02272" + "entity": "lesssim;", + "value": "U+02272" }, { - entity: "lfisht;", - value: "U+0297C" + "entity": "lfisht;", + "value": "U+0297C" }, { - entity: "lfloor;", - value: "U+0230A" + "entity": "lfloor;", + "value": "U+0230A" }, { - entity: "lfr;", - value: "U+1D529" + "entity": "lfr;", + "value": "U+1D529" }, { - entity: "lg;", - value: "U+02276" + "entity": "lg;", + "value": "U+02276" }, { - entity: "lgE;", - value: "U+02A91" + "entity": "lgE;", + "value": "U+02A91" }, { - entity: "lhard;", - value: "U+021BD" + "entity": "lhard;", + "value": "U+021BD" }, { - entity: "lharu;", - value: "U+021BC" + "entity": "lharu;", + "value": "U+021BC" }, { - entity: "lharul;", - value: "U+0296A" + "entity": "lharul;", + "value": "U+0296A" }, { - entity: "lhblk;", - value: "U+02584" + "entity": "lhblk;", + "value": "U+02584" }, { - entity: "ljcy;", - value: "U+00459" + "entity": "ljcy;", + "value": "U+00459" }, { - entity: "ll;", - value: "U+0226A" + "entity": "ll;", + "value": "U+0226A" }, { - entity: "llarr;", - value: "U+021C7" + "entity": "llarr;", + "value": "U+021C7" }, { - entity: "llcorner;", - value: "U+0231E" + "entity": "llcorner;", + "value": "U+0231E" }, { - entity: "llhard;", - value: "U+0296B" + "entity": "llhard;", + "value": "U+0296B" }, { - entity: "lltri;", - value: "U+025FA" + "entity": "lltri;", + "value": "U+025FA" }, { - entity: "lmidot;", - value: "U+00140" + "entity": "lmidot;", + "value": "U+00140" }, { - entity: "lmoust;", - value: "U+023B0" + "entity": "lmoust;", + "value": "U+023B0" }, { - entity: "lmoustache;", - value: "U+023B0" + "entity": "lmoustache;", + "value": "U+023B0" }, { - entity: "lnE;", - value: "U+02268" + "entity": "lnE;", + "value": "U+02268" }, { - entity: "lnap;", - value: "U+02A89" + "entity": "lnap;", + "value": "U+02A89" }, { - entity: "lnapprox;", - value: "U+02A89" + "entity": "lnapprox;", + "value": "U+02A89" }, { - entity: "lne;", - value: "U+02A87" + "entity": "lne;", + "value": "U+02A87" }, { - entity: "lneq;", - value: "U+02A87" + "entity": "lneq;", + "value": "U+02A87" }, { - entity: "lneqq;", - value: "U+02268" + "entity": "lneqq;", + "value": "U+02268" }, { - entity: "lnsim;", - value: "U+022E6" + "entity": "lnsim;", + "value": "U+022E6" }, { - entity: "loang;", - value: "U+027EC" + "entity": "loang;", + "value": "U+027EC" }, { - entity: "loarr;", - value: "U+021FD" + "entity": "loarr;", + "value": "U+021FD" }, { - entity: "lobrk;", - value: "U+027E6" + "entity": "lobrk;", + "value": "U+027E6" }, { - entity: "longleftarrow;", - value: "U+027F5" + "entity": "longleftarrow;", + "value": "U+027F5" }, { - entity: "longleftrightarrow;", - value: "U+027F7" + "entity": "longleftrightarrow;", + "value": "U+027F7" }, { - entity: "longmapsto;", - value: "U+027FC" + "entity": "longmapsto;", + "value": "U+027FC" }, { - entity: "longrightarrow;", - value: "U+027F6" + "entity": "longrightarrow;", + "value": "U+027F6" }, { - entity: "looparrowleft;", - value: "U+021AB" + "entity": "looparrowleft;", + "value": "U+021AB" }, { - entity: "looparrowright;", - value: "U+021AC" + "entity": "looparrowright;", + "value": "U+021AC" }, { - entity: "lopar;", - value: "U+02985" + "entity": "lopar;", + "value": "U+02985" }, { - entity: "lopf;", - value: "U+1D55D" + "entity": "lopf;", + "value": "U+1D55D" }, { - entity: "loplus;", - value: "U+02A2D" + "entity": "loplus;", + "value": "U+02A2D" }, { - entity: "lotimes;", - value: "U+02A34" + "entity": "lotimes;", + "value": "U+02A34" }, { - entity: "lowast;", - value: "U+02217" + "entity": "lowast;", + "value": "U+02217" }, { - entity: "lowbar;", - value: "U+0005F" + "entity": "lowbar;", + "value": "U+0005F" }, { - entity: "loz;", - value: "U+025CA" + "entity": "loz;", + "value": "U+025CA" }, { - entity: "lozenge;", - value: "U+025CA" + "entity": "lozenge;", + "value": "U+025CA" }, { - entity: "lozf;", - value: "U+029EB" + "entity": "lozf;", + "value": "U+029EB" }, { - entity: "lpar;", - value: "U+00028" + "entity": "lpar;", + "value": "U+00028" }, { - entity: "lparlt;", - value: "U+02993" + "entity": "lparlt;", + "value": "U+02993" }, { - entity: "lrarr;", - value: "U+021C6" + "entity": "lrarr;", + "value": "U+021C6" }, { - entity: "lrcorner;", - value: "U+0231F" + "entity": "lrcorner;", + "value": "U+0231F" }, { - entity: "lrhar;", - value: "U+021CB" + "entity": "lrhar;", + "value": "U+021CB" }, { - entity: "lrhard;", - value: "U+0296D" + "entity": "lrhard;", + "value": "U+0296D" }, { - entity: "lrm;", - value: "U+0200E" + "entity": "lrm;", + "value": "U+0200E" }, { - entity: "lrtri;", - value: "U+022BF" + "entity": "lrtri;", + "value": "U+022BF" }, { - entity: "lsaquo;", - value: "U+02039" + "entity": "lsaquo;", + "value": "U+02039" }, { - entity: "lscr;", - value: "U+1D4C1" + "entity": "lscr;", + "value": "U+1D4C1" }, { - entity: "lsh;", - value: "U+021B0" + "entity": "lsh;", + "value": "U+021B0" }, { - entity: "lsim;", - value: "U+02272" + "entity": "lsim;", + "value": "U+02272" }, { - entity: "lsime;", - value: "U+02A8D" + "entity": "lsime;", + "value": "U+02A8D" }, { - entity: "lsimg;", - value: "U+02A8F" + "entity": "lsimg;", + "value": "U+02A8F" }, { - entity: "lsqb;", - value: "U+0005B" + "entity": "lsqb;", + "value": "U+0005B" }, { - entity: "lsquo;", - value: "U+02018" + "entity": "lsquo;", + "value": "U+02018" }, { - entity: "lsquor;", - value: "U+0201A" + "entity": "lsquor;", + "value": "U+0201A" }, { - entity: "lstrok;", - value: "U+00142" + "entity": "lstrok;", + "value": "U+00142" }, { - entity: "lt;", - value: "U+0003C" + "entity": "lt;", + "value": "U+0003C" }, { - entity: "lt", - value: "U+0003C" + "entity": "lt", + "value": "U+0003C" }, { - entity: "ltcc;", - value: "U+02AA6" + "entity": "ltcc;", + "value": "U+02AA6" }, { - entity: "ltcir;", - value: "U+02A79" + "entity": "ltcir;", + "value": "U+02A79" }, { - entity: "ltdot;", - value: "U+022D6" + "entity": "ltdot;", + "value": "U+022D6" }, { - entity: "lthree;", - value: "U+022CB" + "entity": "lthree;", + "value": "U+022CB" }, { - entity: "ltimes;", - value: "U+022C9" + "entity": "ltimes;", + "value": "U+022C9" }, { - entity: "ltlarr;", - value: "U+02976" + "entity": "ltlarr;", + "value": "U+02976" }, { - entity: "ltquest;", - value: "U+02A7B" + "entity": "ltquest;", + "value": "U+02A7B" }, { - entity: "ltrPar;", - value: "U+02996" + "entity": "ltrPar;", + "value": "U+02996" }, { - entity: "ltri;", - value: "U+025C3" + "entity": "ltri;", + "value": "U+025C3" }, { - entity: "ltrie;", - value: "U+022B4" + "entity": "ltrie;", + "value": "U+022B4" }, { - entity: "ltrif;", - value: "U+025C2" + "entity": "ltrif;", + "value": "U+025C2" }, { - entity: "lurdshar;", - value: "U+0294A" + "entity": "lurdshar;", + "value": "U+0294A" }, { - entity: "luruhar;", - value: "U+02966" + "entity": "luruhar;", + "value": "U+02966" }, { - entity: "mDDot;", - value: "U+0223A" + "entity": "mDDot;", + "value": "U+0223A" }, { - entity: "macr;", - value: "U+000AF" + "entity": "macr;", + "value": "U+000AF" }, { - entity: "macr", - value: "U+000AF" + "entity": "macr", + "value": "U+000AF" }, { - entity: "male;", - value: "U+02642" + "entity": "male;", + "value": "U+02642" }, { - entity: "malt;", - value: "U+02720" + "entity": "malt;", + "value": "U+02720" }, { - entity: "maltese;", - value: "U+02720" + "entity": "maltese;", + "value": "U+02720" }, { - entity: "map;", - value: "U+021A6" + "entity": "map;", + "value": "U+021A6" }, { - entity: "mapsto;", - value: "U+021A6" + "entity": "mapsto;", + "value": "U+021A6" }, { - entity: "mapstodown;", - value: "U+021A7" + "entity": "mapstodown;", + "value": "U+021A7" }, { - entity: "mapstoleft;", - value: "U+021A4" + "entity": "mapstoleft;", + "value": "U+021A4" }, { - entity: "mapstoup;", - value: "U+021A5" + "entity": "mapstoup;", + "value": "U+021A5" }, { - entity: "marker;", - value: "U+025AE" + "entity": "marker;", + "value": "U+025AE" }, { - entity: "mcomma;", - value: "U+02A29" + "entity": "mcomma;", + "value": "U+02A29" }, { - entity: "mcy;", - value: "U+0043C" + "entity": "mcy;", + "value": "U+0043C" }, { - entity: "mdash;", - value: "U+02014" + "entity": "mdash;", + "value": "U+02014" }, { - entity: "measuredangle;", - value: "U+02221" + "entity": "measuredangle;", + "value": "U+02221" }, { - entity: "mfr;", - value: "U+1D52A" + "entity": "mfr;", + "value": "U+1D52A" }, { - entity: "mho;", - value: "U+02127" + "entity": "mho;", + "value": "U+02127" }, { - entity: "micro;", - value: "U+000B5" + "entity": "micro;", + "value": "U+000B5" }, { - entity: "micro", - value: "U+000B5" + "entity": "micro", + "value": "U+000B5" }, { - entity: "mid;", - value: "U+02223" + "entity": "mid;", + "value": "U+02223" }, { - entity: "midast;", - value: "U+0002A" + "entity": "midast;", + "value": "U+0002A" }, { - entity: "midcir;", - value: "U+02AF0" + "entity": "midcir;", + "value": "U+02AF0" }, { - entity: "middot;", - value: "U+000B7" + "entity": "middot;", + "value": "U+000B7" }, { - entity: "middot", - value: "U+000B7" + "entity": "middot", + "value": "U+000B7" }, { - entity: "minus;", - value: "U+02212" + "entity": "minus;", + "value": "U+02212" }, { - entity: "minusb;", - value: "U+0229F" + "entity": "minusb;", + "value": "U+0229F" }, { - entity: "minusd;", - value: "U+02238" + "entity": "minusd;", + "value": "U+02238" }, { - entity: "minusdu;", - value: "U+02A2A" + "entity": "minusdu;", + "value": "U+02A2A" }, { - entity: "mlcp;", - value: "U+02ADB" + "entity": "mlcp;", + "value": "U+02ADB" }, { - entity: "mldr;", - value: "U+02026" + "entity": "mldr;", + "value": "U+02026" }, { - entity: "mnplus;", - value: "U+02213" + "entity": "mnplus;", + "value": "U+02213" }, { - entity: "models;", - value: "U+022A7" + "entity": "models;", + "value": "U+022A7" }, { - entity: "mopf;", - value: "U+1D55E" + "entity": "mopf;", + "value": "U+1D55E" }, { - entity: "mp;", - value: "U+02213" + "entity": "mp;", + "value": "U+02213" }, { - entity: "mscr;", - value: "U+1D4C2" + "entity": "mscr;", + "value": "U+1D4C2" }, { - entity: "mstpos;", - value: "U+0223E" + "entity": "mstpos;", + "value": "U+0223E" }, { - entity: "mu;", - value: "U+003BC" + "entity": "mu;", + "value": "U+003BC" }, { - entity: "multimap;", - value: "U+022B8" + "entity": "multimap;", + "value": "U+022B8" }, { - entity: "mumap;", - value: "U+022B8" + "entity": "mumap;", + "value": "U+022B8" }, { - entity: "nLeftarrow;", - value: "U+021CD" + "entity": "nLeftarrow;", + "value": "U+021CD" }, { - entity: "nLeftrightarrow;", - value: "U+021CE" + "entity": "nLeftrightarrow;", + "value": "U+021CE" }, { - entity: "nRightarrow;", - value: "U+021CF" + "entity": "nRightarrow;", + "value": "U+021CF" }, { - entity: "nVDash;", - value: "U+022AF" + "entity": "nVDash;", + "value": "U+022AF" }, { - entity: "nVdash;", - value: "U+022AE" + "entity": "nVdash;", + "value": "U+022AE" }, { - entity: "nabla;", - value: "U+02207" + "entity": "nabla;", + "value": "U+02207" }, { - entity: "nacute;", - value: "U+00144" + "entity": "nacute;", + "value": "U+00144" }, { - entity: "nap;", - value: "U+02249" + "entity": "nap;", + "value": "U+02249" }, { - entity: "napos;", - value: "U+00149" + "entity": "napos;", + "value": "U+00149" }, { - entity: "napprox;", - value: "U+02249" + "entity": "napprox;", + "value": "U+02249" }, { - entity: "natur;", - value: "U+0266E" + "entity": "natur;", + "value": "U+0266E" }, { - entity: "natural;", - value: "U+0266E" + "entity": "natural;", + "value": "U+0266E" }, { - entity: "naturals;", - value: "U+02115" + "entity": "naturals;", + "value": "U+02115" }, { - entity: "nbsp;", - value: "U+000A0" + "entity": "nbsp;", + "value": "U+000A0" }, { - entity: "nbsp", - value: "U+000A0" + "entity": "nbsp", + "value": "U+000A0" }, { - entity: "ncap;", - value: "U+02A43" + "entity": "ncap;", + "value": "U+02A43" }, { - entity: "ncaron;", - value: "U+00148" + "entity": "ncaron;", + "value": "U+00148" }, { - entity: "ncedil;", - value: "U+00146" + "entity": "ncedil;", + "value": "U+00146" }, { - entity: "ncong;", - value: "U+02247" + "entity": "ncong;", + "value": "U+02247" }, { - entity: "ncup;", - value: "U+02A42" + "entity": "ncup;", + "value": "U+02A42" }, { - entity: "ncy;", - value: "U+0043D" + "entity": "ncy;", + "value": "U+0043D" }, { - entity: "ndash;", - value: "U+02013" + "entity": "ndash;", + "value": "U+02013" }, { - entity: "ne;", - value: "U+02260" + "entity": "ne;", + "value": "U+02260" }, { - entity: "neArr;", - value: "U+021D7" + "entity": "neArr;", + "value": "U+021D7" }, { - entity: "nearhk;", - value: "U+02924" + "entity": "nearhk;", + "value": "U+02924" }, { - entity: "nearr;", - value: "U+02197" + "entity": "nearr;", + "value": "U+02197" }, { - entity: "nearrow;", - value: "U+02197" + "entity": "nearrow;", + "value": "U+02197" }, { - entity: "nequiv;", - value: "U+02262" + "entity": "nequiv;", + "value": "U+02262" }, { - entity: "nesear;", - value: "U+02928" + "entity": "nesear;", + "value": "U+02928" }, { - entity: "nexist;", - value: "U+02204" + "entity": "nexist;", + "value": "U+02204" }, { - entity: "nexists;", - value: "U+02204" + "entity": "nexists;", + "value": "U+02204" }, { - entity: "nfr;", - value: "U+1D52B" + "entity": "nfr;", + "value": "U+1D52B" }, { - entity: "nge;", - value: "U+02271" + "entity": "nge;", + "value": "U+02271" }, { - entity: "ngeq;", - value: "U+02271" + "entity": "ngeq;", + "value": "U+02271" }, { - entity: "ngsim;", - value: "U+02275" + "entity": "ngsim;", + "value": "U+02275" }, { - entity: "ngt;", - value: "U+0226F" + "entity": "ngt;", + "value": "U+0226F" }, { - entity: "ngtr;", - value: "U+0226F" + "entity": "ngtr;", + "value": "U+0226F" }, { - entity: "nhArr;", - value: "U+021CE" + "entity": "nhArr;", + "value": "U+021CE" }, { - entity: "nharr;", - value: "U+021AE" + "entity": "nharr;", + "value": "U+021AE" }, { - entity: "nhpar;", - value: "U+02AF2" + "entity": "nhpar;", + "value": "U+02AF2" }, { - entity: "ni;", - value: "U+0220B" + "entity": "ni;", + "value": "U+0220B" }, { - entity: "nis;", - value: "U+022FC" + "entity": "nis;", + "value": "U+022FC" }, { - entity: "nisd;", - value: "U+022FA" + "entity": "nisd;", + "value": "U+022FA" }, { - entity: "niv;", - value: "U+0220B" + "entity": "niv;", + "value": "U+0220B" }, { - entity: "njcy;", - value: "U+0045A" + "entity": "njcy;", + "value": "U+0045A" }, { - entity: "nlArr;", - value: "U+021CD" + "entity": "nlArr;", + "value": "U+021CD" }, { - entity: "nlarr;", - value: "U+0219A" + "entity": "nlarr;", + "value": "U+0219A" }, { - entity: "nldr;", - value: "U+02025" + "entity": "nldr;", + "value": "U+02025" }, { - entity: "nle;", - value: "U+02270" + "entity": "nle;", + "value": "U+02270" }, { - entity: "nleftarrow;", - value: "U+0219A" + "entity": "nleftarrow;", + "value": "U+0219A" }, { - entity: "nleftrightarrow;", - value: "U+021AE" + "entity": "nleftrightarrow;", + "value": "U+021AE" }, { - entity: "nleq;", - value: "U+02270" + "entity": "nleq;", + "value": "U+02270" }, { - entity: "nless;", - value: "U+0226E" + "entity": "nless;", + "value": "U+0226E" }, { - entity: "nlsim;", - value: "U+02274" + "entity": "nlsim;", + "value": "U+02274" }, { - entity: "nlt;", - value: "U+0226E" + "entity": "nlt;", + "value": "U+0226E" }, { - entity: "nltri;", - value: "U+022EA" + "entity": "nltri;", + "value": "U+022EA" }, { - entity: "nltrie;", - value: "U+022EC" + "entity": "nltrie;", + "value": "U+022EC" }, { - entity: "nmid;", - value: "U+02224" + "entity": "nmid;", + "value": "U+02224" }, { - entity: "nopf;", - value: "U+1D55F" + "entity": "nopf;", + "value": "U+1D55F" }, { - entity: "not;", - value: "U+000AC" + "entity": "not;", + "value": "U+000AC" }, { - entity: "not", - value: "U+000AC" + "entity": "not", + "value": "U+000AC" }, { - entity: "notin;", - value: "U+02209" + "entity": "notin;", + "value": "U+02209" }, { - entity: "notinva;", - value: "U+02209" + "entity": "notinva;", + "value": "U+02209" }, { - entity: "notinvb;", - value: "U+022F7" + "entity": "notinvb;", + "value": "U+022F7" }, { - entity: "notinvc;", - value: "U+022F6" + "entity": "notinvc;", + "value": "U+022F6" }, { - entity: "notni;", - value: "U+0220C" + "entity": "notni;", + "value": "U+0220C" }, { - entity: "notniva;", - value: "U+0220C" + "entity": "notniva;", + "value": "U+0220C" }, { - entity: "notnivb;", - value: "U+022FE" + "entity": "notnivb;", + "value": "U+022FE" }, { - entity: "notnivc;", - value: "U+022FD" + "entity": "notnivc;", + "value": "U+022FD" }, { - entity: "npar;", - value: "U+02226" + "entity": "npar;", + "value": "U+02226" }, { - entity: "nparallel;", - value: "U+02226" + "entity": "nparallel;", + "value": "U+02226" }, { - entity: "npolint;", - value: "U+02A14" + "entity": "npolint;", + "value": "U+02A14" }, { - entity: "npr;", - value: "U+02280" + "entity": "npr;", + "value": "U+02280" }, { - entity: "nprcue;", - value: "U+022E0" + "entity": "nprcue;", + "value": "U+022E0" }, { - entity: "nprec;", - value: "U+02280" + "entity": "nprec;", + "value": "U+02280" }, { - entity: "nrArr;", - value: "U+021CF" + "entity": "nrArr;", + "value": "U+021CF" }, { - entity: "nrarr;", - value: "U+0219B" + "entity": "nrarr;", + "value": "U+0219B" }, { - entity: "nrightarrow;", - value: "U+0219B" + "entity": "nrightarrow;", + "value": "U+0219B" }, { - entity: "nrtri;", - value: "U+022EB" + "entity": "nrtri;", + "value": "U+022EB" }, { - entity: "nrtrie;", - value: "U+022ED" + "entity": "nrtrie;", + "value": "U+022ED" }, { - entity: "nsc;", - value: "U+02281" + "entity": "nsc;", + "value": "U+02281" }, { - entity: "nsccue;", - value: "U+022E1" + "entity": "nsccue;", + "value": "U+022E1" }, { - entity: "nscr;", - value: "U+1D4C3" + "entity": "nscr;", + "value": "U+1D4C3" }, { - entity: "nshortmid;", - value: "U+02224" + "entity": "nshortmid;", + "value": "U+02224" }, { - entity: "nshortparallel;", - value: "U+02226" + "entity": "nshortparallel;", + "value": "U+02226" }, { - entity: "nsim;", - value: "U+02241" + "entity": "nsim;", + "value": "U+02241" }, { - entity: "nsime;", - value: "U+02244" + "entity": "nsime;", + "value": "U+02244" }, { - entity: "nsimeq;", - value: "U+02244" + "entity": "nsimeq;", + "value": "U+02244" }, { - entity: "nsmid;", - value: "U+02224" + "entity": "nsmid;", + "value": "U+02224" }, { - entity: "nspar;", - value: "U+02226" + "entity": "nspar;", + "value": "U+02226" }, { - entity: "nsqsube;", - value: "U+022E2" + "entity": "nsqsube;", + "value": "U+022E2" }, { - entity: "nsqsupe;", - value: "U+022E3" + "entity": "nsqsupe;", + "value": "U+022E3" }, { - entity: "nsub;", - value: "U+02284" + "entity": "nsub;", + "value": "U+02284" }, { - entity: "nsube;", - value: "U+02288" + "entity": "nsube;", + "value": "U+02288" }, { - entity: "nsubseteq;", - value: "U+02288" + "entity": "nsubseteq;", + "value": "U+02288" }, { - entity: "nsucc;", - value: "U+02281" + "entity": "nsucc;", + "value": "U+02281" }, { - entity: "nsup;", - value: "U+02285" + "entity": "nsup;", + "value": "U+02285" }, { - entity: "nsupe;", - value: "U+02289" + "entity": "nsupe;", + "value": "U+02289" }, { - entity: "nsupseteq;", - value: "U+02289" + "entity": "nsupseteq;", + "value": "U+02289" }, { - entity: "ntgl;", - value: "U+02279" + "entity": "ntgl;", + "value": "U+02279" }, { - entity: "ntilde;", - value: "U+000F1" + "entity": "ntilde;", + "value": "U+000F1" }, { - entity: "ntilde", - value: "U+000F1" + "entity": "ntilde", + "value": "U+000F1" }, { - entity: "ntlg;", - value: "U+02278" + "entity": "ntlg;", + "value": "U+02278" }, { - entity: "ntriangleleft;", - value: "U+022EA" + "entity": "ntriangleleft;", + "value": "U+022EA" }, { - entity: "ntrianglelefteq;", - value: "U+022EC" + "entity": "ntrianglelefteq;", + "value": "U+022EC" }, { - entity: "ntriangleright;", - value: "U+022EB" + "entity": "ntriangleright;", + "value": "U+022EB" }, { - entity: "ntrianglerighteq;", - value: "U+022ED" + "entity": "ntrianglerighteq;", + "value": "U+022ED" }, { - entity: "nu;", - value: "U+003BD" + "entity": "nu;", + "value": "U+003BD" }, { - entity: "num;", - value: "U+00023" + "entity": "num;", + "value": "U+00023" }, { - entity: "numero;", - value: "U+02116" + "entity": "numero;", + "value": "U+02116" }, { - entity: "numsp;", - value: "U+02007" + "entity": "numsp;", + "value": "U+02007" }, { - entity: "nvDash;", - value: "U+022AD" + "entity": "nvDash;", + "value": "U+022AD" }, { - entity: "nvHarr;", - value: "U+02904" + "entity": "nvHarr;", + "value": "U+02904" }, { - entity: "nvdash;", - value: "U+022AC" + "entity": "nvdash;", + "value": "U+022AC" }, { - entity: "nvinfin;", - value: "U+029DE" + "entity": "nvinfin;", + "value": "U+029DE" }, { - entity: "nvlArr;", - value: "U+02902" + "entity": "nvlArr;", + "value": "U+02902" }, { - entity: "nvrArr;", - value: "U+02903" + "entity": "nvrArr;", + "value": "U+02903" }, { - entity: "nwArr;", - value: "U+021D6" + "entity": "nwArr;", + "value": "U+021D6" }, { - entity: "nwarhk;", - value: "U+02923" + "entity": "nwarhk;", + "value": "U+02923" }, { - entity: "nwarr;", - value: "U+02196" + "entity": "nwarr;", + "value": "U+02196" }, { - entity: "nwarrow;", - value: "U+02196" + "entity": "nwarrow;", + "value": "U+02196" }, { - entity: "nwnear;", - value: "U+02927" + "entity": "nwnear;", + "value": "U+02927" }, { - entity: "oS;", - value: "U+024C8" + "entity": "oS;", + "value": "U+024C8" }, { - entity: "oacute;", - value: "U+000F3" + "entity": "oacute;", + "value": "U+000F3" }, { - entity: "oacute", - value: "U+000F3" + "entity": "oacute", + "value": "U+000F3" }, { - entity: "oast;", - value: "U+0229B" + "entity": "oast;", + "value": "U+0229B" }, { - entity: "ocir;", - value: "U+0229A" + "entity": "ocir;", + "value": "U+0229A" }, { - entity: "ocirc;", - value: "U+000F4" + "entity": "ocirc;", + "value": "U+000F4" }, { - entity: "ocirc", - value: "U+000F4" + "entity": "ocirc", + "value": "U+000F4" }, { - entity: "ocy;", - value: "U+0043E" + "entity": "ocy;", + "value": "U+0043E" }, { - entity: "odash;", - value: "U+0229D" + "entity": "odash;", + "value": "U+0229D" }, { - entity: "odblac;", - value: "U+00151" + "entity": "odblac;", + "value": "U+00151" }, { - entity: "odiv;", - value: "U+02A38" + "entity": "odiv;", + "value": "U+02A38" }, { - entity: "odot;", - value: "U+02299" + "entity": "odot;", + "value": "U+02299" }, { - entity: "odsold;", - value: "U+029BC" + "entity": "odsold;", + "value": "U+029BC" }, { - entity: "oelig;", - value: "U+00153" + "entity": "oelig;", + "value": "U+00153" }, { - entity: "ofcir;", - value: "U+029BF" + "entity": "ofcir;", + "value": "U+029BF" }, { - entity: "ofr;", - value: "U+1D52C" + "entity": "ofr;", + "value": "U+1D52C" }, { - entity: "ogon;", - value: "U+002DB" + "entity": "ogon;", + "value": "U+002DB" }, { - entity: "ograve;", - value: "U+000F2" + "entity": "ograve;", + "value": "U+000F2" }, { - entity: "ograve", - value: "U+000F2" + "entity": "ograve", + "value": "U+000F2" }, { - entity: "ogt;", - value: "U+029C1" + "entity": "ogt;", + "value": "U+029C1" }, { - entity: "ohbar;", - value: "U+029B5" + "entity": "ohbar;", + "value": "U+029B5" }, { - entity: "ohm;", - value: "U+003A9" + "entity": "ohm;", + "value": "U+003A9" }, { - entity: "oint;", - value: "U+0222E" + "entity": "oint;", + "value": "U+0222E" }, { - entity: "olarr;", - value: "U+021BA" + "entity": "olarr;", + "value": "U+021BA" }, { - entity: "olcir;", - value: "U+029BE" + "entity": "olcir;", + "value": "U+029BE" }, { - entity: "olcross;", - value: "U+029BB" + "entity": "olcross;", + "value": "U+029BB" }, { - entity: "oline;", - value: "U+0203E" + "entity": "oline;", + "value": "U+0203E" }, { - entity: "olt;", - value: "U+029C0" + "entity": "olt;", + "value": "U+029C0" }, { - entity: "omacr;", - value: "U+0014D" + "entity": "omacr;", + "value": "U+0014D" }, { - entity: "omega;", - value: "U+003C9" + "entity": "omega;", + "value": "U+003C9" }, { - entity: "omicron;", - value: "U+003BF" + "entity": "omicron;", + "value": "U+003BF" }, { - entity: "omid;", - value: "U+029B6" + "entity": "omid;", + "value": "U+029B6" }, { - entity: "ominus;", - value: "U+02296" + "entity": "ominus;", + "value": "U+02296" }, { - entity: "oopf;", - value: "U+1D560" + "entity": "oopf;", + "value": "U+1D560" }, { - entity: "opar;", - value: "U+029B7" + "entity": "opar;", + "value": "U+029B7" }, { - entity: "operp;", - value: "U+029B9" + "entity": "operp;", + "value": "U+029B9" }, { - entity: "oplus;", - value: "U+02295" + "entity": "oplus;", + "value": "U+02295" }, { - entity: "or;", - value: "U+02228" + "entity": "or;", + "value": "U+02228" }, { - entity: "orarr;", - value: "U+021BB" + "entity": "orarr;", + "value": "U+021BB" }, { - entity: "ord;", - value: "U+02A5D" + "entity": "ord;", + "value": "U+02A5D" }, { - entity: "order;", - value: "U+02134" + "entity": "order;", + "value": "U+02134" }, { - entity: "orderof;", - value: "U+02134" + "entity": "orderof;", + "value": "U+02134" }, { - entity: "ordf;", - value: "U+000AA" + "entity": "ordf;", + "value": "U+000AA" }, { - entity: "ordf", - value: "U+000AA" + "entity": "ordf", + "value": "U+000AA" }, { - entity: "ordm;", - value: "U+000BA" + "entity": "ordm;", + "value": "U+000BA" }, { - entity: "ordm", - value: "U+000BA" + "entity": "ordm", + "value": "U+000BA" }, { - entity: "origof;", - value: "U+022B6" + "entity": "origof;", + "value": "U+022B6" }, { - entity: "oror;", - value: "U+02A56" + "entity": "oror;", + "value": "U+02A56" }, { - entity: "orslope;", - value: "U+02A57" + "entity": "orslope;", + "value": "U+02A57" }, { - entity: "orv;", - value: "U+02A5B" + "entity": "orv;", + "value": "U+02A5B" }, { - entity: "oscr;", - value: "U+02134" + "entity": "oscr;", + "value": "U+02134" }, { - entity: "oslash;", - value: "U+000F8" + "entity": "oslash;", + "value": "U+000F8" }, { - entity: "oslash", - value: "U+000F8" + "entity": "oslash", + "value": "U+000F8" }, { - entity: "osol;", - value: "U+02298" + "entity": "osol;", + "value": "U+02298" }, { - entity: "otilde;", - value: "U+000F5" + "entity": "otilde;", + "value": "U+000F5" }, { - entity: "otilde", - value: "U+000F5" + "entity": "otilde", + "value": "U+000F5" }, { - entity: "otimes;", - value: "U+02297" + "entity": "otimes;", + "value": "U+02297" }, { - entity: "otimesas;", - value: "U+02A36" + "entity": "otimesas;", + "value": "U+02A36" }, { - entity: "ouml;", - value: "U+000F6" + "entity": "ouml;", + "value": "U+000F6" }, { - entity: "ouml", - value: "U+000F6" + "entity": "ouml", + "value": "U+000F6" }, { - entity: "ovbar;", - value: "U+0233D" + "entity": "ovbar;", + "value": "U+0233D" }, { - entity: "par;", - value: "U+02225" + "entity": "par;", + "value": "U+02225" }, { - entity: "para;", - value: "U+000B6" + "entity": "para;", + "value": "U+000B6" }, { - entity: "para", - value: "U+000B6" + "entity": "para", + "value": "U+000B6" }, { - entity: "parallel;", - value: "U+02225" + "entity": "parallel;", + "value": "U+02225" }, { - entity: "parsim;", - value: "U+02AF3" + "entity": "parsim;", + "value": "U+02AF3" }, { - entity: "parsl;", - value: "U+02AFD" + "entity": "parsl;", + "value": "U+02AFD" }, { - entity: "part;", - value: "U+02202" + "entity": "part;", + "value": "U+02202" }, { - entity: "pcy;", - value: "U+0043F" + "entity": "pcy;", + "value": "U+0043F" }, { - entity: "percnt;", - value: "U+00025" + "entity": "percnt;", + "value": "U+00025" }, { - entity: "period;", - value: "U+0002E" + "entity": "period;", + "value": "U+0002E" }, { - entity: "permil;", - value: "U+02030" + "entity": "permil;", + "value": "U+02030" }, { - entity: "perp;", - value: "U+022A5" + "entity": "perp;", + "value": "U+022A5" }, { - entity: "pertenk;", - value: "U+02031" + "entity": "pertenk;", + "value": "U+02031" }, { - entity: "pfr;", - value: "U+1D52D" + "entity": "pfr;", + "value": "U+1D52D" }, { - entity: "phi;", - value: "U+003C6" + "entity": "phi;", + "value": "U+003C6" }, { - entity: "phiv;", - value: "U+003D5" + "entity": "phiv;", + "value": "U+003D5" }, { - entity: "phmmat;", - value: "U+02133" + "entity": "phmmat;", + "value": "U+02133" }, { - entity: "phone;", - value: "U+0260E" + "entity": "phone;", + "value": "U+0260E" }, { - entity: "pi;", - value: "U+003C0" + "entity": "pi;", + "value": "U+003C0" }, { - entity: "pitchfork;", - value: "U+022D4" + "entity": "pitchfork;", + "value": "U+022D4" }, { - entity: "piv;", - value: "U+003D6" + "entity": "piv;", + "value": "U+003D6" }, { - entity: "planck;", - value: "U+0210F" + "entity": "planck;", + "value": "U+0210F" }, { - entity: "planckh;", - value: "U+0210E" + "entity": "planckh;", + "value": "U+0210E" }, { - entity: "plankv;", - value: "U+0210F" + "entity": "plankv;", + "value": "U+0210F" }, { - entity: "plus;", - value: "U+0002B" + "entity": "plus;", + "value": "U+0002B" }, { - entity: "plusacir;", - value: "U+02A23" + "entity": "plusacir;", + "value": "U+02A23" }, { - entity: "plusb;", - value: "U+0229E" + "entity": "plusb;", + "value": "U+0229E" }, { - entity: "pluscir;", - value: "U+02A22" + "entity": "pluscir;", + "value": "U+02A22" }, { - entity: "plusdo;", - value: "U+02214" + "entity": "plusdo;", + "value": "U+02214" }, { - entity: "plusdu;", - value: "U+02A25" + "entity": "plusdu;", + "value": "U+02A25" }, { - entity: "pluse;", - value: "U+02A72" + "entity": "pluse;", + "value": "U+02A72" }, { - entity: "plusmn;", - value: "U+000B1" + "entity": "plusmn;", + "value": "U+000B1" }, { - entity: "plusmn", - value: "U+000B1" + "entity": "plusmn", + "value": "U+000B1" }, { - entity: "plussim;", - value: "U+02A26" + "entity": "plussim;", + "value": "U+02A26" }, { - entity: "plustwo;", - value: "U+02A27" + "entity": "plustwo;", + "value": "U+02A27" }, { - entity: "pm;", - value: "U+000B1" + "entity": "pm;", + "value": "U+000B1" }, { - entity: "pointint;", - value: "U+02A15" + "entity": "pointint;", + "value": "U+02A15" }, { - entity: "popf;", - value: "U+1D561" + "entity": "popf;", + "value": "U+1D561" }, { - entity: "pound;", - value: "U+000A3" + "entity": "pound;", + "value": "U+000A3" }, { - entity: "pound", - value: "U+000A3" + "entity": "pound", + "value": "U+000A3" }, { - entity: "pr;", - value: "U+0227A" + "entity": "pr;", + "value": "U+0227A" }, { - entity: "prE;", - value: "U+02AB3" + "entity": "prE;", + "value": "U+02AB3" }, { - entity: "prap;", - value: "U+02AB7" + "entity": "prap;", + "value": "U+02AB7" }, { - entity: "prcue;", - value: "U+0227C" + "entity": "prcue;", + "value": "U+0227C" }, { - entity: "pre;", - value: "U+02AAF" + "entity": "pre;", + "value": "U+02AAF" }, { - entity: "prec;", - value: "U+0227A" + "entity": "prec;", + "value": "U+0227A" }, { - entity: "precapprox;", - value: "U+02AB7" + "entity": "precapprox;", + "value": "U+02AB7" }, { - entity: "preccurlyeq;", - value: "U+0227C" + "entity": "preccurlyeq;", + "value": "U+0227C" }, { - entity: "preceq;", - value: "U+02AAF" + "entity": "preceq;", + "value": "U+02AAF" }, { - entity: "precnapprox;", - value: "U+02AB9" + "entity": "precnapprox;", + "value": "U+02AB9" }, { - entity: "precneqq;", - value: "U+02AB5" + "entity": "precneqq;", + "value": "U+02AB5" }, { - entity: "precnsim;", - value: "U+022E8" + "entity": "precnsim;", + "value": "U+022E8" }, { - entity: "precsim;", - value: "U+0227E" + "entity": "precsim;", + "value": "U+0227E" }, { - entity: "prime;", - value: "U+02032" + "entity": "prime;", + "value": "U+02032" }, { - entity: "primes;", - value: "U+02119" + "entity": "primes;", + "value": "U+02119" }, { - entity: "prnE;", - value: "U+02AB5" + "entity": "prnE;", + "value": "U+02AB5" }, { - entity: "prnap;", - value: "U+02AB9" + "entity": "prnap;", + "value": "U+02AB9" }, { - entity: "prnsim;", - value: "U+022E8" + "entity": "prnsim;", + "value": "U+022E8" }, { - entity: "prod;", - value: "U+0220F" + "entity": "prod;", + "value": "U+0220F" }, { - entity: "profalar;", - value: "U+0232E" + "entity": "profalar;", + "value": "U+0232E" }, { - entity: "profline;", - value: "U+02312" + "entity": "profline;", + "value": "U+02312" }, { - entity: "profsurf;", - value: "U+02313" + "entity": "profsurf;", + "value": "U+02313" }, { - entity: "prop;", - value: "U+0221D" + "entity": "prop;", + "value": "U+0221D" }, { - entity: "propto;", - value: "U+0221D" + "entity": "propto;", + "value": "U+0221D" }, { - entity: "prsim;", - value: "U+0227E" + "entity": "prsim;", + "value": "U+0227E" }, { - entity: "prurel;", - value: "U+022B0" + "entity": "prurel;", + "value": "U+022B0" }, { - entity: "pscr;", - value: "U+1D4C5" + "entity": "pscr;", + "value": "U+1D4C5" }, { - entity: "psi;", - value: "U+003C8" + "entity": "psi;", + "value": "U+003C8" }, { - entity: "puncsp;", - value: "U+02008" + "entity": "puncsp;", + "value": "U+02008" }, { - entity: "qfr;", - value: "U+1D52E" + "entity": "qfr;", + "value": "U+1D52E" }, { - entity: "qint;", - value: "U+02A0C" + "entity": "qint;", + "value": "U+02A0C" }, { - entity: "qopf;", - value: "U+1D562" + "entity": "qopf;", + "value": "U+1D562" }, { - entity: "qprime;", - value: "U+02057" + "entity": "qprime;", + "value": "U+02057" }, { - entity: "qscr;", - value: "U+1D4C6" + "entity": "qscr;", + "value": "U+1D4C6" }, { - entity: "quaternions;", - value: "U+0210D" + "entity": "quaternions;", + "value": "U+0210D" }, { - entity: "quatint;", - value: "U+02A16" + "entity": "quatint;", + "value": "U+02A16" }, { - entity: "quest;", - value: "U+0003F" + "entity": "quest;", + "value": "U+0003F" }, { - entity: "questeq;", - value: "U+0225F" + "entity": "questeq;", + "value": "U+0225F" }, { - entity: "quot;", - value: "U+00022" + "entity": "quot;", + "value": "U+00022" }, { - entity: "quot", - value: "U+00022" + "entity": "quot", + "value": "U+00022" }, { - entity: "rAarr;", - value: "U+021DB" + "entity": "rAarr;", + "value": "U+021DB" }, { - entity: "rArr;", - value: "U+021D2" + "entity": "rArr;", + "value": "U+021D2" }, { - entity: "rAtail;", - value: "U+0291C" + "entity": "rAtail;", + "value": "U+0291C" }, { - entity: "rBarr;", - value: "U+0290F" + "entity": "rBarr;", + "value": "U+0290F" }, { - entity: "rHar;", - value: "U+02964" + "entity": "rHar;", + "value": "U+02964" }, { - entity: "racute;", - value: "U+00155" + "entity": "racute;", + "value": "U+00155" }, { - entity: "radic;", - value: "U+0221A" + "entity": "radic;", + "value": "U+0221A" }, { - entity: "raemptyv;", - value: "U+029B3" + "entity": "raemptyv;", + "value": "U+029B3" }, { - entity: "rang;", - value: "U+027E9" + "entity": "rang;", + "value": "U+027E9" }, { - entity: "rangd;", - value: "U+02992" + "entity": "rangd;", + "value": "U+02992" }, { - entity: "range;", - value: "U+029A5" + "entity": "range;", + "value": "U+029A5" }, { - entity: "rangle;", - value: "U+027E9" + "entity": "rangle;", + "value": "U+027E9" }, { - entity: "raquo;", - value: "U+000BB" + "entity": "raquo;", + "value": "U+000BB" }, { - entity: "raquo", - value: "U+000BB" + "entity": "raquo", + "value": "U+000BB" }, { - entity: "rarr;", - value: "U+02192" + "entity": "rarr;", + "value": "U+02192" }, { - entity: "rarrap;", - value: "U+02975" + "entity": "rarrap;", + "value": "U+02975" }, { - entity: "rarrb;", - value: "U+021E5" + "entity": "rarrb;", + "value": "U+021E5" }, { - entity: "rarrbfs;", - value: "U+02920" + "entity": "rarrbfs;", + "value": "U+02920" }, { - entity: "rarrc;", - value: "U+02933" + "entity": "rarrc;", + "value": "U+02933" }, { - entity: "rarrfs;", - value: "U+0291E" + "entity": "rarrfs;", + "value": "U+0291E" }, { - entity: "rarrhk;", - value: "U+021AA" + "entity": "rarrhk;", + "value": "U+021AA" }, { - entity: "rarrlp;", - value: "U+021AC" + "entity": "rarrlp;", + "value": "U+021AC" }, { - entity: "rarrpl;", - value: "U+02945" + "entity": "rarrpl;", + "value": "U+02945" }, { - entity: "rarrsim;", - value: "U+02974" + "entity": "rarrsim;", + "value": "U+02974" }, { - entity: "rarrtl;", - value: "U+021A3" + "entity": "rarrtl;", + "value": "U+021A3" }, { - entity: "rarrw;", - value: "U+0219D" + "entity": "rarrw;", + "value": "U+0219D" }, { - entity: "ratail;", - value: "U+0291A" + "entity": "ratail;", + "value": "U+0291A" }, { - entity: "ratio;", - value: "U+02236" + "entity": "ratio;", + "value": "U+02236" }, { - entity: "rationals;", - value: "U+0211A" + "entity": "rationals;", + "value": "U+0211A" }, { - entity: "rbarr;", - value: "U+0290D" + "entity": "rbarr;", + "value": "U+0290D" }, { - entity: "rbbrk;", - value: "U+02773" + "entity": "rbbrk;", + "value": "U+02773" }, { - entity: "rbrace;", - value: "U+0007D" + "entity": "rbrace;", + "value": "U+0007D" }, { - entity: "rbrack;", - value: "U+0005D" + "entity": "rbrack;", + "value": "U+0005D" }, { - entity: "rbrke;", - value: "U+0298C" + "entity": "rbrke;", + "value": "U+0298C" }, { - entity: "rbrksld;", - value: "U+0298E" + "entity": "rbrksld;", + "value": "U+0298E" }, { - entity: "rbrkslu;", - value: "U+02990" + "entity": "rbrkslu;", + "value": "U+02990" }, { - entity: "rcaron;", - value: "U+00159" + "entity": "rcaron;", + "value": "U+00159" }, { - entity: "rcedil;", - value: "U+00157" + "entity": "rcedil;", + "value": "U+00157" }, { - entity: "rceil;", - value: "U+02309" + "entity": "rceil;", + "value": "U+02309" }, { - entity: "rcub;", - value: "U+0007D" + "entity": "rcub;", + "value": "U+0007D" }, { - entity: "rcy;", - value: "U+00440" + "entity": "rcy;", + "value": "U+00440" }, { - entity: "rdca;", - value: "U+02937" + "entity": "rdca;", + "value": "U+02937" }, { - entity: "rdldhar;", - value: "U+02969" + "entity": "rdldhar;", + "value": "U+02969" }, { - entity: "rdquo;", - value: "U+0201D" + "entity": "rdquo;", + "value": "U+0201D" }, { - entity: "rdquor;", - value: "U+0201D" + "entity": "rdquor;", + "value": "U+0201D" }, { - entity: "rdsh;", - value: "U+021B3" + "entity": "rdsh;", + "value": "U+021B3" }, { - entity: "real;", - value: "U+0211C" + "entity": "real;", + "value": "U+0211C" }, { - entity: "realine;", - value: "U+0211B" + "entity": "realine;", + "value": "U+0211B" }, { - entity: "realpart;", - value: "U+0211C" + "entity": "realpart;", + "value": "U+0211C" }, { - entity: "reals;", - value: "U+0211D" + "entity": "reals;", + "value": "U+0211D" }, { - entity: "rect;", - value: "U+025AD" + "entity": "rect;", + "value": "U+025AD" }, { - entity: "reg;", - value: "U+000AE" + "entity": "reg;", + "value": "U+000AE" }, { - entity: "reg", - value: "U+000AE" + "entity": "reg", + "value": "U+000AE" }, { - entity: "rfisht;", - value: "U+0297D" + "entity": "rfisht;", + "value": "U+0297D" }, { - entity: "rfloor;", - value: "U+0230B" + "entity": "rfloor;", + "value": "U+0230B" }, { - entity: "rfr;", - value: "U+1D52F" + "entity": "rfr;", + "value": "U+1D52F" }, { - entity: "rhard;", - value: "U+021C1" + "entity": "rhard;", + "value": "U+021C1" }, { - entity: "rharu;", - value: "U+021C0" + "entity": "rharu;", + "value": "U+021C0" }, { - entity: "rharul;", - value: "U+0296C" + "entity": "rharul;", + "value": "U+0296C" }, { - entity: "rho;", - value: "U+003C1" + "entity": "rho;", + "value": "U+003C1" }, { - entity: "rhov;", - value: "U+003F1" + "entity": "rhov;", + "value": "U+003F1" }, { - entity: "rightarrow;", - value: "U+02192" + "entity": "rightarrow;", + "value": "U+02192" }, { - entity: "rightarrowtail;", - value: "U+021A3" + "entity": "rightarrowtail;", + "value": "U+021A3" }, { - entity: "rightharpoondown;", - value: "U+021C1" + "entity": "rightharpoondown;", + "value": "U+021C1" }, { - entity: "rightharpoonup;", - value: "U+021C0" + "entity": "rightharpoonup;", + "value": "U+021C0" }, { - entity: "rightleftarrows;", - value: "U+021C4" + "entity": "rightleftarrows;", + "value": "U+021C4" }, { - entity: "rightleftharpoons;", - value: "U+021CC" + "entity": "rightleftharpoons;", + "value": "U+021CC" }, { - entity: "rightrightarrows;", - value: "U+021C9" + "entity": "rightrightarrows;", + "value": "U+021C9" }, { - entity: "rightsquigarrow;", - value: "U+0219D" + "entity": "rightsquigarrow;", + "value": "U+0219D" }, { - entity: "rightthreetimes;", - value: "U+022CC" + "entity": "rightthreetimes;", + "value": "U+022CC" }, { - entity: "ring;", - value: "U+002DA" + "entity": "ring;", + "value": "U+002DA" }, { - entity: "risingdotseq;", - value: "U+02253" + "entity": "risingdotseq;", + "value": "U+02253" }, { - entity: "rlarr;", - value: "U+021C4" + "entity": "rlarr;", + "value": "U+021C4" }, { - entity: "rlhar;", - value: "U+021CC" + "entity": "rlhar;", + "value": "U+021CC" }, { - entity: "rlm;", - value: "U+0200F" + "entity": "rlm;", + "value": "U+0200F" }, { - entity: "rmoust;", - value: "U+023B1" + "entity": "rmoust;", + "value": "U+023B1" }, { - entity: "rmoustache;", - value: "U+023B1" + "entity": "rmoustache;", + "value": "U+023B1" }, { - entity: "rnmid;", - value: "U+02AEE" + "entity": "rnmid;", + "value": "U+02AEE" }, { - entity: "roang;", - value: "U+027ED" + "entity": "roang;", + "value": "U+027ED" }, { - entity: "roarr;", - value: "U+021FE" + "entity": "roarr;", + "value": "U+021FE" }, { - entity: "robrk;", - value: "U+027E7" + "entity": "robrk;", + "value": "U+027E7" }, { - entity: "ropar;", - value: "U+02986" + "entity": "ropar;", + "value": "U+02986" }, { - entity: "ropf;", - value: "U+1D563" + "entity": "ropf;", + "value": "U+1D563" }, { - entity: "roplus;", - value: "U+02A2E" + "entity": "roplus;", + "value": "U+02A2E" }, { - entity: "rotimes;", - value: "U+02A35" + "entity": "rotimes;", + "value": "U+02A35" }, { - entity: "rpar;", - value: "U+00029" + "entity": "rpar;", + "value": "U+00029" }, { - entity: "rpargt;", - value: "U+02994" + "entity": "rpargt;", + "value": "U+02994" }, { - entity: "rppolint;", - value: "U+02A12" + "entity": "rppolint;", + "value": "U+02A12" }, { - entity: "rrarr;", - value: "U+021C9" + "entity": "rrarr;", + "value": "U+021C9" }, { - entity: "rsaquo;", - value: "U+0203A" + "entity": "rsaquo;", + "value": "U+0203A" }, { - entity: "rscr;", - value: "U+1D4C7" + "entity": "rscr;", + "value": "U+1D4C7" }, { - entity: "rsh;", - value: "U+021B1" + "entity": "rsh;", + "value": "U+021B1" }, { - entity: "rsqb;", - value: "U+0005D" + "entity": "rsqb;", + "value": "U+0005D" }, { - entity: "rsquo;", - value: "U+02019" + "entity": "rsquo;", + "value": "U+02019" }, { - entity: "rsquor;", - value: "U+02019" + "entity": "rsquor;", + "value": "U+02019" }, { - entity: "rthree;", - value: "U+022CC" + "entity": "rthree;", + "value": "U+022CC" }, { - entity: "rtimes;", - value: "U+022CA" + "entity": "rtimes;", + "value": "U+022CA" }, { - entity: "rtri;", - value: "U+025B9" + "entity": "rtri;", + "value": "U+025B9" }, { - entity: "rtrie;", - value: "U+022B5" + "entity": "rtrie;", + "value": "U+022B5" }, { - entity: "rtrif;", - value: "U+025B8" + "entity": "rtrif;", + "value": "U+025B8" }, { - entity: "rtriltri;", - value: "U+029CE" + "entity": "rtriltri;", + "value": "U+029CE" }, { - entity: "ruluhar;", - value: "U+02968" + "entity": "ruluhar;", + "value": "U+02968" }, { - entity: "rx;", - value: "U+0211E" + "entity": "rx;", + "value": "U+0211E" }, { - entity: "sacute;", - value: "U+0015B" + "entity": "sacute;", + "value": "U+0015B" }, { - entity: "sbquo;", - value: "U+0201A" + "entity": "sbquo;", + "value": "U+0201A" }, { - entity: "sc;", - value: "U+0227B" + "entity": "sc;", + "value": "U+0227B" }, { - entity: "scE;", - value: "U+02AB4" + "entity": "scE;", + "value": "U+02AB4" }, { - entity: "scap;", - value: "U+02AB8" + "entity": "scap;", + "value": "U+02AB8" }, { - entity: "scaron;", - value: "U+00161" + "entity": "scaron;", + "value": "U+00161" }, { - entity: "sccue;", - value: "U+0227D" + "entity": "sccue;", + "value": "U+0227D" }, { - entity: "sce;", - value: "U+02AB0" + "entity": "sce;", + "value": "U+02AB0" }, { - entity: "scedil;", - value: "U+0015F" + "entity": "scedil;", + "value": "U+0015F" }, { - entity: "scirc;", - value: "U+0015D" + "entity": "scirc;", + "value": "U+0015D" }, { - entity: "scnE;", - value: "U+02AB6" + "entity": "scnE;", + "value": "U+02AB6" }, { - entity: "scnap;", - value: "U+02ABA" + "entity": "scnap;", + "value": "U+02ABA" }, { - entity: "scnsim;", - value: "U+022E9" + "entity": "scnsim;", + "value": "U+022E9" }, { - entity: "scpolint;", - value: "U+02A13" + "entity": "scpolint;", + "value": "U+02A13" }, { - entity: "scsim;", - value: "U+0227F" + "entity": "scsim;", + "value": "U+0227F" }, { - entity: "scy;", - value: "U+00441" + "entity": "scy;", + "value": "U+00441" }, { - entity: "sdot;", - value: "U+022C5" + "entity": "sdot;", + "value": "U+022C5" }, { - entity: "sdotb;", - value: "U+022A1" + "entity": "sdotb;", + "value": "U+022A1" }, { - entity: "sdote;", - value: "U+02A66" + "entity": "sdote;", + "value": "U+02A66" }, { - entity: "seArr;", - value: "U+021D8" + "entity": "seArr;", + "value": "U+021D8" }, { - entity: "searhk;", - value: "U+02925" + "entity": "searhk;", + "value": "U+02925" }, { - entity: "searr;", - value: "U+02198" + "entity": "searr;", + "value": "U+02198" }, { - entity: "searrow;", - value: "U+02198" + "entity": "searrow;", + "value": "U+02198" }, { - entity: "sect;", - value: "U+000A7" + "entity": "sect;", + "value": "U+000A7" }, { - entity: "sect", - value: "U+000A7" + "entity": "sect", + "value": "U+000A7" }, { - entity: "semi;", - value: "U+0003B" + "entity": "semi;", + "value": "U+0003B" }, { - entity: "seswar;", - value: "U+02929" + "entity": "seswar;", + "value": "U+02929" }, { - entity: "setminus;", - value: "U+02216" + "entity": "setminus;", + "value": "U+02216" }, { - entity: "setmn;", - value: "U+02216" + "entity": "setmn;", + "value": "U+02216" }, { - entity: "sext;", - value: "U+02736" + "entity": "sext;", + "value": "U+02736" }, { - entity: "sfr;", - value: "U+1D530" + "entity": "sfr;", + "value": "U+1D530" }, { - entity: "sfrown;", - value: "U+02322" + "entity": "sfrown;", + "value": "U+02322" }, { - entity: "sharp;", - value: "U+0266F" + "entity": "sharp;", + "value": "U+0266F" }, { - entity: "shchcy;", - value: "U+00449" + "entity": "shchcy;", + "value": "U+00449" }, { - entity: "shcy;", - value: "U+00448" + "entity": "shcy;", + "value": "U+00448" }, { - entity: "shortmid;", - value: "U+02223" + "entity": "shortmid;", + "value": "U+02223" }, { - entity: "shortparallel;", - value: "U+02225" + "entity": "shortparallel;", + "value": "U+02225" }, { - entity: "shy;", - value: "U+000AD " + "entity": "shy;", + "value": "U+000AD " }, { - entity: "shy", - value: "U+000AD " + "entity": "shy", + "value": "U+000AD " }, { - entity: "sigma;", - value: "U+003C3" + "entity": "sigma;", + "value": "U+003C3" }, { - entity: "sigmaf;", - value: "U+003C2" + "entity": "sigmaf;", + "value": "U+003C2" }, { - entity: "sigmav;", - value: "U+003C2" + "entity": "sigmav;", + "value": "U+003C2" }, { - entity: "sim;", - value: "U+0223C" + "entity": "sim;", + "value": "U+0223C" }, { - entity: "simdot;", - value: "U+02A6A" + "entity": "simdot;", + "value": "U+02A6A" }, { - entity: "sime;", - value: "U+02243" + "entity": "sime;", + "value": "U+02243" }, { - entity: "simeq;", - value: "U+02243" + "entity": "simeq;", + "value": "U+02243" }, { - entity: "simg;", - value: "U+02A9E" + "entity": "simg;", + "value": "U+02A9E" }, { - entity: "simgE;", - value: "U+02AA0" + "entity": "simgE;", + "value": "U+02AA0" }, { - entity: "siml;", - value: "U+02A9D" + "entity": "siml;", + "value": "U+02A9D" }, { - entity: "simlE;", - value: "U+02A9F" + "entity": "simlE;", + "value": "U+02A9F" }, { - entity: "simne;", - value: "U+02246" + "entity": "simne;", + "value": "U+02246" }, { - entity: "simplus;", - value: "U+02A24" + "entity": "simplus;", + "value": "U+02A24" }, { - entity: "simrarr;", - value: "U+02972" + "entity": "simrarr;", + "value": "U+02972" }, { - entity: "slarr;", - value: "U+02190" + "entity": "slarr;", + "value": "U+02190" }, { - entity: "smallsetminus;", - value: "U+02216" + "entity": "smallsetminus;", + "value": "U+02216" }, { - entity: "smashp;", - value: "U+02A33" + "entity": "smashp;", + "value": "U+02A33" }, { - entity: "smeparsl;", - value: "U+029E4" + "entity": "smeparsl;", + "value": "U+029E4" }, { - entity: "smid;", - value: "U+02223" + "entity": "smid;", + "value": "U+02223" }, { - entity: "smile;", - value: "U+02323" + "entity": "smile;", + "value": "U+02323" }, { - entity: "smt;", - value: "U+02AAA" + "entity": "smt;", + "value": "U+02AAA" }, { - entity: "smte;", - value: "U+02AAC" + "entity": "smte;", + "value": "U+02AAC" }, { - entity: "softcy;", - value: "U+0044C" + "entity": "softcy;", + "value": "U+0044C" }, { - entity: "sol;", - value: "U+0002F" + "entity": "sol;", + "value": "U+0002F" }, { - entity: "solb;", - value: "U+029C4" + "entity": "solb;", + "value": "U+029C4" }, { - entity: "solbar;", - value: "U+0233F" + "entity": "solbar;", + "value": "U+0233F" }, { - entity: "sopf;", - value: "U+1D564" + "entity": "sopf;", + "value": "U+1D564" }, { - entity: "spades;", - value: "U+02660" + "entity": "spades;", + "value": "U+02660" }, { - entity: "spadesuit;", - value: "U+02660" + "entity": "spadesuit;", + "value": "U+02660" }, { - entity: "spar;", - value: "U+02225" + "entity": "spar;", + "value": "U+02225" }, { - entity: "sqcap;", - value: "U+02293" + "entity": "sqcap;", + "value": "U+02293" }, { - entity: "sqcup;", - value: "U+02294" + "entity": "sqcup;", + "value": "U+02294" }, { - entity: "sqsub;", - value: "U+0228F" + "entity": "sqsub;", + "value": "U+0228F" }, { - entity: "sqsube;", - value: "U+02291" + "entity": "sqsube;", + "value": "U+02291" }, { - entity: "sqsubset;", - value: "U+0228F" + "entity": "sqsubset;", + "value": "U+0228F" }, { - entity: "sqsubseteq;", - value: "U+02291" + "entity": "sqsubseteq;", + "value": "U+02291" }, { - entity: "sqsup;", - value: "U+02290" + "entity": "sqsup;", + "value": "U+02290" }, { - entity: "sqsupe;", - value: "U+02292" + "entity": "sqsupe;", + "value": "U+02292" }, { - entity: "sqsupset;", - value: "U+02290" + "entity": "sqsupset;", + "value": "U+02290" }, { - entity: "sqsupseteq;", - value: "U+02292" + "entity": "sqsupseteq;", + "value": "U+02292" }, { - entity: "squ;", - value: "U+025A1" + "entity": "squ;", + "value": "U+025A1" }, { - entity: "square;", - value: "U+025A1" + "entity": "square;", + "value": "U+025A1" }, { - entity: "squarf;", - value: "U+025AA" + "entity": "squarf;", + "value": "U+025AA" }, { - entity: "squf;", - value: "U+025AA" + "entity": "squf;", + "value": "U+025AA" }, { - entity: "srarr;", - value: "U+02192" + "entity": "srarr;", + "value": "U+02192" }, { - entity: "sscr;", - value: "U+1D4C8" + "entity": "sscr;", + "value": "U+1D4C8" }, { - entity: "ssetmn;", - value: "U+02216" + "entity": "ssetmn;", + "value": "U+02216" }, { - entity: "ssmile;", - value: "U+02323" + "entity": "ssmile;", + "value": "U+02323" }, { - entity: "sstarf;", - value: "U+022C6" + "entity": "sstarf;", + "value": "U+022C6" }, { - entity: "star;", - value: "U+02606" + "entity": "star;", + "value": "U+02606" }, { - entity: "starf;", - value: "U+02605" + "entity": "starf;", + "value": "U+02605" }, { - entity: "straightepsilon;", - value: "U+003F5" + "entity": "straightepsilon;", + "value": "U+003F5" }, { - entity: "straightphi;", - value: "U+003D5" + "entity": "straightphi;", + "value": "U+003D5" }, { - entity: "strns;", - value: "U+000AF" + "entity": "strns;", + "value": "U+000AF" }, { - entity: "sub;", - value: "U+02282" + "entity": "sub;", + "value": "U+02282" }, { - entity: "subE;", - value: "U+02AC5" + "entity": "subE;", + "value": "U+02AC5" }, { - entity: "subdot;", - value: "U+02ABD" + "entity": "subdot;", + "value": "U+02ABD" }, { - entity: "sube;", - value: "U+02286" + "entity": "sube;", + "value": "U+02286" }, { - entity: "subedot;", - value: "U+02AC3" + "entity": "subedot;", + "value": "U+02AC3" }, { - entity: "submult;", - value: "U+02AC1" + "entity": "submult;", + "value": "U+02AC1" }, { - entity: "subnE;", - value: "U+02ACB" + "entity": "subnE;", + "value": "U+02ACB" }, { - entity: "subne;", - value: "U+0228A" + "entity": "subne;", + "value": "U+0228A" }, { - entity: "subplus;", - value: "U+02ABF" + "entity": "subplus;", + "value": "U+02ABF" }, { - entity: "subrarr;", - value: "U+02979" + "entity": "subrarr;", + "value": "U+02979" }, { - entity: "subset;", - value: "U+02282" + "entity": "subset;", + "value": "U+02282" }, { - entity: "subseteq;", - value: "U+02286" + "entity": "subseteq;", + "value": "U+02286" }, { - entity: "subseteqq;", - value: "U+02AC5" + "entity": "subseteqq;", + "value": "U+02AC5" }, { - entity: "subsetneq;", - value: "U+0228A" + "entity": "subsetneq;", + "value": "U+0228A" }, { - entity: "subsetneqq;", - value: "U+02ACB" + "entity": "subsetneqq;", + "value": "U+02ACB" }, { - entity: "subsim;", - value: "U+02AC7" + "entity": "subsim;", + "value": "U+02AC7" }, { - entity: "subsub;", - value: "U+02AD5" + "entity": "subsub;", + "value": "U+02AD5" }, { - entity: "subsup;", - value: "U+02AD3" + "entity": "subsup;", + "value": "U+02AD3" }, { - entity: "succ;", - value: "U+0227B" + "entity": "succ;", + "value": "U+0227B" }, { - entity: "succapprox;", - value: "U+02AB8" + "entity": "succapprox;", + "value": "U+02AB8" }, { - entity: "succcurlyeq;", - value: "U+0227D" + "entity": "succcurlyeq;", + "value": "U+0227D" }, { - entity: "succeq;", - value: "U+02AB0" + "entity": "succeq;", + "value": "U+02AB0" }, { - entity: "succnapprox;", - value: "U+02ABA" + "entity": "succnapprox;", + "value": "U+02ABA" }, { - entity: "succneqq;", - value: "U+02AB6" + "entity": "succneqq;", + "value": "U+02AB6" }, { - entity: "succnsim;", - value: "U+022E9" + "entity": "succnsim;", + "value": "U+022E9" }, { - entity: "succsim;", - value: "U+0227F" + "entity": "succsim;", + "value": "U+0227F" }, { - entity: "sum;", - value: "U+02211" + "entity": "sum;", + "value": "U+02211" }, { - entity: "sung;", - value: "U+0266A" + "entity": "sung;", + "value": "U+0266A" }, { - entity: "sup1;", - value: "U+000B9" + "entity": "sup1;", + "value": "U+000B9" }, { - entity: "sup1", - value: "U+000B9" + "entity": "sup1", + "value": "U+000B9" }, { - entity: "sup2;", - value: "U+000B2" + "entity": "sup2;", + "value": "U+000B2" }, { - entity: "sup2", - value: "U+000B2" + "entity": "sup2", + "value": "U+000B2" }, { - entity: "sup3;", - value: "U+000B3" + "entity": "sup3;", + "value": "U+000B3" }, { - entity: "sup3", - value: "U+000B3" + "entity": "sup3", + "value": "U+000B3" }, { - entity: "sup;", - value: "U+02283" + "entity": "sup;", + "value": "U+02283" }, { - entity: "supE;", - value: "U+02AC6" + "entity": "supE;", + "value": "U+02AC6" }, { - entity: "supdot;", - value: "U+02ABE" + "entity": "supdot;", + "value": "U+02ABE" }, { - entity: "supdsub;", - value: "U+02AD8" + "entity": "supdsub;", + "value": "U+02AD8" }, { - entity: "supe;", - value: "U+02287" + "entity": "supe;", + "value": "U+02287" }, { - entity: "supedot;", - value: "U+02AC4" + "entity": "supedot;", + "value": "U+02AC4" }, { - entity: "suphsol;", - value: "U+027C9" + "entity": "suphsol;", + "value": "U+027C9" }, { - entity: "suphsub;", - value: "U+02AD7" + "entity": "suphsub;", + "value": "U+02AD7" }, { - entity: "suplarr;", - value: "U+0297B" + "entity": "suplarr;", + "value": "U+0297B" }, { - entity: "supmult;", - value: "U+02AC2" + "entity": "supmult;", + "value": "U+02AC2" }, { - entity: "supnE;", - value: "U+02ACC" + "entity": "supnE;", + "value": "U+02ACC" }, { - entity: "supne;", - value: "U+0228B" + "entity": "supne;", + "value": "U+0228B" }, { - entity: "supplus;", - value: "U+02AC0" + "entity": "supplus;", + "value": "U+02AC0" }, { - entity: "supset;", - value: "U+02283" + "entity": "supset;", + "value": "U+02283" }, { - entity: "supseteq;", - value: "U+02287" + "entity": "supseteq;", + "value": "U+02287" }, { - entity: "supseteqq;", - value: "U+02AC6" + "entity": "supseteqq;", + "value": "U+02AC6" }, { - entity: "supsetneq;", - value: "U+0228B" + "entity": "supsetneq;", + "value": "U+0228B" }, { - entity: "supsetneqq;", - value: "U+02ACC" + "entity": "supsetneqq;", + "value": "U+02ACC" }, { - entity: "supsim;", - value: "U+02AC8" + "entity": "supsim;", + "value": "U+02AC8" }, { - entity: "supsub;", - value: "U+02AD4" + "entity": "supsub;", + "value": "U+02AD4" }, { - entity: "supsup;", - value: "U+02AD6" + "entity": "supsup;", + "value": "U+02AD6" }, { - entity: "swArr;", - value: "U+021D9" + "entity": "swArr;", + "value": "U+021D9" }, { - entity: "swarhk;", - value: "U+02926" + "entity": "swarhk;", + "value": "U+02926" }, { - entity: "swarr;", - value: "U+02199" + "entity": "swarr;", + "value": "U+02199" }, { - entity: "swarrow;", - value: "U+02199" + "entity": "swarrow;", + "value": "U+02199" }, { - entity: "swnwar;", - value: "U+0292A" + "entity": "swnwar;", + "value": "U+0292A" }, { - entity: "szlig;", - value: "U+000DF" + "entity": "szlig;", + "value": "U+000DF" }, { - entity: "szlig", - value: "U+000DF" + "entity": "szlig", + "value": "U+000DF" }, { - entity: "target;", - value: "U+02316" + "entity": "target;", + "value": "U+02316" }, { - entity: "tau;", - value: "U+003C4" + "entity": "tau;", + "value": "U+003C4" }, { - entity: "tbrk;", - value: "U+023B4" + "entity": "tbrk;", + "value": "U+023B4" }, { - entity: "tcaron;", - value: "U+00165" + "entity": "tcaron;", + "value": "U+00165" }, { - entity: "tcedil;", - value: "U+00163" + "entity": "tcedil;", + "value": "U+00163" }, { - entity: "tcy;", - value: "U+00442" + "entity": "tcy;", + "value": "U+00442" }, { - entity: "tdot;", - value: "U+020DB" + "entity": "tdot;", + "value": "U+020DB" }, { - entity: "telrec;", - value: "U+02315" + "entity": "telrec;", + "value": "U+02315" }, { - entity: "tfr;", - value: "U+1D531" + "entity": "tfr;", + "value": "U+1D531" }, { - entity: "there4;", - value: "U+02234" + "entity": "there4;", + "value": "U+02234" }, { - entity: "therefore;", - value: "U+02234" + "entity": "therefore;", + "value": "U+02234" }, { - entity: "theta;", - value: "U+003B8" + "entity": "theta;", + "value": "U+003B8" }, { - entity: "thetasym;", - value: "U+003D1" + "entity": "thetasym;", + "value": "U+003D1" }, { - entity: "thetav;", - value: "U+003D1" + "entity": "thetav;", + "value": "U+003D1" }, { - entity: "thickapprox;", - value: "U+02248" + "entity": "thickapprox;", + "value": "U+02248" }, { - entity: "thicksim;", - value: "U+0223C" + "entity": "thicksim;", + "value": "U+0223C" }, { - entity: "thinsp;", - value: "U+02009" + "entity": "thinsp;", + "value": "U+02009" }, { - entity: "thkap;", - value: "U+02248" + "entity": "thkap;", + "value": "U+02248" }, { - entity: "thksim;", - value: "U+0223C" + "entity": "thksim;", + "value": "U+0223C" }, { - entity: "thorn;", - value: "U+000FE" + "entity": "thorn;", + "value": "U+000FE" }, { - entity: "thorn", - value: "U+000FE" + "entity": "thorn", + "value": "U+000FE" }, { - entity: "tilde;", - value: "U+002DC" + "entity": "tilde;", + "value": "U+002DC" }, { - entity: "times;", - value: "U+000D7" + "entity": "times;", + "value": "U+000D7" }, { - entity: "times", - value: "U+000D7" + "entity": "times", + "value": "U+000D7" }, { - entity: "timesb;", - value: "U+022A0" + "entity": "timesb;", + "value": "U+022A0" }, { - entity: "timesbar;", - value: "U+02A31" + "entity": "timesbar;", + "value": "U+02A31" }, { - entity: "timesd;", - value: "U+02A30" + "entity": "timesd;", + "value": "U+02A30" }, { - entity: "tint;", - value: "U+0222D" + "entity": "tint;", + "value": "U+0222D" }, { - entity: "toea;", - value: "U+02928" + "entity": "toea;", + "value": "U+02928" }, { - entity: "top;", - value: "U+022A4" + "entity": "top;", + "value": "U+022A4" }, { - entity: "topbot;", - value: "U+02336" + "entity": "topbot;", + "value": "U+02336" }, { - entity: "topcir;", - value: "U+02AF1" + "entity": "topcir;", + "value": "U+02AF1" }, { - entity: "topf;", - value: "U+1D565" + "entity": "topf;", + "value": "U+1D565" }, { - entity: "topfork;", - value: "U+02ADA" + "entity": "topfork;", + "value": "U+02ADA" }, { - entity: "tosa;", - value: "U+02929" + "entity": "tosa;", + "value": "U+02929" }, { - entity: "tprime;", - value: "U+02034" + "entity": "tprime;", + "value": "U+02034" }, { - entity: "trade;", - value: "U+02122" + "entity": "trade;", + "value": "U+02122" }, { - entity: "triangle;", - value: "U+025B5" + "entity": "triangle;", + "value": "U+025B5" }, { - entity: "triangledown;", - value: "U+025BF" + "entity": "triangledown;", + "value": "U+025BF" }, { - entity: "triangleleft;", - value: "U+025C3" + "entity": "triangleleft;", + "value": "U+025C3" }, { - entity: "trianglelefteq;", - value: "U+022B4" + "entity": "trianglelefteq;", + "value": "U+022B4" }, { - entity: "triangleq;", - value: "U+0225C" + "entity": "triangleq;", + "value": "U+0225C" }, { - entity: "triangleright;", - value: "U+025B9" + "entity": "triangleright;", + "value": "U+025B9" }, { - entity: "trianglerighteq;", - value: "U+022B5" + "entity": "trianglerighteq;", + "value": "U+022B5" }, { - entity: "tridot;", - value: "U+025EC" + "entity": "tridot;", + "value": "U+025EC" }, { - entity: "trie;", - value: "U+0225C" + "entity": "trie;", + "value": "U+0225C" }, { - entity: "triminus;", - value: "U+02A3A" + "entity": "triminus;", + "value": "U+02A3A" }, { - entity: "triplus;", - value: "U+02A39" + "entity": "triplus;", + "value": "U+02A39" }, { - entity: "trisb;", - value: "U+029CD" + "entity": "trisb;", + "value": "U+029CD" }, { - entity: "tritime;", - value: "U+02A3B" + "entity": "tritime;", + "value": "U+02A3B" }, { - entity: "trpezium;", - value: "U+023E2" + "entity": "trpezium;", + "value": "U+023E2" }, { - entity: "tscr;", - value: "U+1D4C9" + "entity": "tscr;", + "value": "U+1D4C9" }, { - entity: "tscy;", - value: "U+00446" + "entity": "tscy;", + "value": "U+00446" }, { - entity: "tshcy;", - value: "U+0045B" + "entity": "tshcy;", + "value": "U+0045B" }, { - entity: "tstrok;", - value: "U+00167" + "entity": "tstrok;", + "value": "U+00167" }, { - entity: "twixt;", - value: "U+0226C" + "entity": "twixt;", + "value": "U+0226C" }, { - entity: "twoheadleftarrow;", - value: "U+0219E" + "entity": "twoheadleftarrow;", + "value": "U+0219E" }, { - entity: "twoheadrightarrow;", - value: "U+021A0" + "entity": "twoheadrightarrow;", + "value": "U+021A0" }, { - entity: "uArr;", - value: "U+021D1" + "entity": "uArr;", + "value": "U+021D1" }, { - entity: "uHar;", - value: "U+02963" + "entity": "uHar;", + "value": "U+02963" }, { - entity: "uacute;", - value: "U+000FA" + "entity": "uacute;", + "value": "U+000FA" }, { - entity: "uacute", - value: "U+000FA" + "entity": "uacute", + "value": "U+000FA" }, { - entity: "uarr;", - value: "U+02191" + "entity": "uarr;", + "value": "U+02191" }, { - entity: "ubrcy;", - value: "U+0045E" + "entity": "ubrcy;", + "value": "U+0045E" }, { - entity: "ubreve;", - value: "U+0016D" + "entity": "ubreve;", + "value": "U+0016D" }, { - entity: "ucirc;", - value: "U+000FB" + "entity": "ucirc;", + "value": "U+000FB" }, { - entity: "ucirc", - value: "U+000FB" + "entity": "ucirc", + "value": "U+000FB" }, { - entity: "ucy;", - value: "U+00443" + "entity": "ucy;", + "value": "U+00443" }, { - entity: "udarr;", - value: "U+021C5" + "entity": "udarr;", + "value": "U+021C5" }, { - entity: "udblac;", - value: "U+00171" + "entity": "udblac;", + "value": "U+00171" }, { - entity: "udhar;", - value: "U+0296E" + "entity": "udhar;", + "value": "U+0296E" }, { - entity: "ufisht;", - value: "U+0297E" + "entity": "ufisht;", + "value": "U+0297E" }, { - entity: "ufr;", - value: "U+1D532" + "entity": "ufr;", + "value": "U+1D532" }, { - entity: "ugrave;", - value: "U+000F9" + "entity": "ugrave;", + "value": "U+000F9" }, { - entity: "ugrave", - value: "U+000F9" + "entity": "ugrave", + "value": "U+000F9" }, { - entity: "uharl;", - value: "U+021BF" + "entity": "uharl;", + "value": "U+021BF" }, { - entity: "uharr;", - value: "U+021BE" + "entity": "uharr;", + "value": "U+021BE" }, { - entity: "uhblk;", - value: "U+02580" + "entity": "uhblk;", + "value": "U+02580" }, { - entity: "ulcorn;", - value: "U+0231C" + "entity": "ulcorn;", + "value": "U+0231C" }, { - entity: "ulcorner;", - value: "U+0231C" + "entity": "ulcorner;", + "value": "U+0231C" }, { - entity: "ulcrop;", - value: "U+0230F" + "entity": "ulcrop;", + "value": "U+0230F" }, { - entity: "ultri;", - value: "U+025F8" + "entity": "ultri;", + "value": "U+025F8" }, { - entity: "umacr;", - value: "U+0016B" + "entity": "umacr;", + "value": "U+0016B" }, { - entity: "uml;", - value: "U+000A8" + "entity": "uml;", + "value": "U+000A8" }, { - entity: "uml", - value: "U+000A8" + "entity": "uml", + "value": "U+000A8" }, { - entity: "uogon;", - value: "U+00173" + "entity": "uogon;", + "value": "U+00173" }, { - entity: "uopf;", - value: "U+1D566" + "entity": "uopf;", + "value": "U+1D566" }, { - entity: "uparrow;", - value: "U+02191" + "entity": "uparrow;", + "value": "U+02191" }, { - entity: "updownarrow;", - value: "U+02195" + "entity": "updownarrow;", + "value": "U+02195" }, { - entity: "upharpoonleft;", - value: "U+021BF" + "entity": "upharpoonleft;", + "value": "U+021BF" }, { - entity: "upharpoonright;", - value: "U+021BE" + "entity": "upharpoonright;", + "value": "U+021BE" }, { - entity: "uplus;", - value: "U+0228E" + "entity": "uplus;", + "value": "U+0228E" }, { - entity: "upsi;", - value: "U+003C5" + "entity": "upsi;", + "value": "U+003C5" }, { - entity: "upsih;", - value: "U+003D2" + "entity": "upsih;", + "value": "U+003D2" }, { - entity: "upsilon;", - value: "U+003C5" + "entity": "upsilon;", + "value": "U+003C5" }, { - entity: "upuparrows;", - value: "U+021C8" + "entity": "upuparrows;", + "value": "U+021C8" }, { - entity: "urcorn;", - value: "U+0231D" + "entity": "urcorn;", + "value": "U+0231D" }, { - entity: "urcorner;", - value: "U+0231D" + "entity": "urcorner;", + "value": "U+0231D" }, { - entity: "urcrop;", - value: "U+0230E" + "entity": "urcrop;", + "value": "U+0230E" }, { - entity: "uring;", - value: "U+0016F" + "entity": "uring;", + "value": "U+0016F" }, { - entity: "urtri;", - value: "U+025F9" + "entity": "urtri;", + "value": "U+025F9" }, { - entity: "uscr;", - value: "U+1D4CA" + "entity": "uscr;", + "value": "U+1D4CA" }, { - entity: "utdot;", - value: "U+022F0" + "entity": "utdot;", + "value": "U+022F0" }, { - entity: "utilde;", - value: "U+00169" + "entity": "utilde;", + "value": "U+00169" }, { - entity: "utri;", - value: "U+025B5" + "entity": "utri;", + "value": "U+025B5" }, { - entity: "utrif;", - value: "U+025B4" + "entity": "utrif;", + "value": "U+025B4" }, { - entity: "uuarr;", - value: "U+021C8" + "entity": "uuarr;", + "value": "U+021C8" }, { - entity: "uuml;", - value: "U+000FC" + "entity": "uuml;", + "value": "U+000FC" }, { - entity: "uuml", - value: "U+000FC" + "entity": "uuml", + "value": "U+000FC" }, { - entity: "uwangle;", - value: "U+029A7" + "entity": "uwangle;", + "value": "U+029A7" }, { - entity: "vArr;", - value: "U+021D5" + "entity": "vArr;", + "value": "U+021D5" }, { - entity: "vBar;", - value: "U+02AE8" + "entity": "vBar;", + "value": "U+02AE8" }, { - entity: "vBarv;", - value: "U+02AE9" + "entity": "vBarv;", + "value": "U+02AE9" }, { - entity: "vDash;", - value: "U+022A8" + "entity": "vDash;", + "value": "U+022A8" }, { - entity: "vangrt;", - value: "U+0299C" + "entity": "vangrt;", + "value": "U+0299C" }, { - entity: "varepsilon;", - value: "U+003F5" + "entity": "varepsilon;", + "value": "U+003F5" }, { - entity: "varkappa;", - value: "U+003F0" + "entity": "varkappa;", + "value": "U+003F0" }, { - entity: "varnothing;", - value: "U+02205" + "entity": "varnothing;", + "value": "U+02205" }, { - entity: "varphi;", - value: "U+003D5" + "entity": "varphi;", + "value": "U+003D5" }, { - entity: "varpi;", - value: "U+003D6" + "entity": "varpi;", + "value": "U+003D6" }, { - entity: "varpropto;", - value: "U+0221D" + "entity": "varpropto;", + "value": "U+0221D" }, { - entity: "varr;", - value: "U+02195" + "entity": "varr;", + "value": "U+02195" }, { - entity: "varrho;", - value: "U+003F1" + "entity": "varrho;", + "value": "U+003F1" }, { - entity: "varsigma;", - value: "U+003C2" + "entity": "varsigma;", + "value": "U+003C2" }, { - entity: "vartheta;", - value: "U+003D1" + "entity": "vartheta;", + "value": "U+003D1" }, { - entity: "vartriangleleft;", - value: "U+022B2" + "entity": "vartriangleleft;", + "value": "U+022B2" }, { - entity: "vartriangleright;", - value: "U+022B3" + "entity": "vartriangleright;", + "value": "U+022B3" }, { - entity: "vcy;", - value: "U+00432" + "entity": "vcy;", + "value": "U+00432" }, { - entity: "vdash;", - value: "U+022A2" + "entity": "vdash;", + "value": "U+022A2" }, { - entity: "vee;", - value: "U+02228" + "entity": "vee;", + "value": "U+02228" }, { - entity: "veebar;", - value: "U+022BB" + "entity": "veebar;", + "value": "U+022BB" }, { - entity: "veeeq;", - value: "U+0225A" + "entity": "veeeq;", + "value": "U+0225A" }, { - entity: "vellip;", - value: "U+022EE" + "entity": "vellip;", + "value": "U+022EE" }, { - entity: "verbar;", - value: "U+0007C" + "entity": "verbar;", + "value": "U+0007C" }, { - entity: "vert;", - value: "U+0007C" + "entity": "vert;", + "value": "U+0007C" }, { - entity: "vfr;", - value: "U+1D533" + "entity": "vfr;", + "value": "U+1D533" }, { - entity: "vltri;", - value: "U+022B2" + "entity": "vltri;", + "value": "U+022B2" }, { - entity: "vopf;", - value: "U+1D567" + "entity": "vopf;", + "value": "U+1D567" }, { - entity: "vprop;", - value: "U+0221D" + "entity": "vprop;", + "value": "U+0221D" }, { - entity: "vrtri;", - value: "U+022B3" + "entity": "vrtri;", + "value": "U+022B3" }, { - entity: "vscr;", - value: "U+1D4CB" + "entity": "vscr;", + "value": "U+1D4CB" }, { - entity: "vzigzag;", - value: "U+0299A" + "entity": "vzigzag;", + "value": "U+0299A" }, { - entity: "wcirc;", - value: "U+00175" + "entity": "wcirc;", + "value": "U+00175" }, { - entity: "wedbar;", - value: "U+02A5F" + "entity": "wedbar;", + "value": "U+02A5F" }, { - entity: "wedge;", - value: "U+02227" + "entity": "wedge;", + "value": "U+02227" }, { - entity: "wedgeq;", - value: "U+02259" + "entity": "wedgeq;", + "value": "U+02259" }, { - entity: "weierp;", - value: "U+02118" + "entity": "weierp;", + "value": "U+02118" }, { - entity: "wfr;", - value: "U+1D534" + "entity": "wfr;", + "value": "U+1D534" }, { - entity: "wopf;", - value: "U+1D568" + "entity": "wopf;", + "value": "U+1D568" }, { - entity: "wp;", - value: "U+02118" + "entity": "wp;", + "value": "U+02118" }, { - entity: "wr;", - value: "U+02240" + "entity": "wr;", + "value": "U+02240" }, { - entity: "wreath;", - value: "U+02240" + "entity": "wreath;", + "value": "U+02240" }, { - entity: "wscr;", - value: "U+1D4CC" + "entity": "wscr;", + "value": "U+1D4CC" }, { - entity: "xcap;", - value: "U+022C2" + "entity": "xcap;", + "value": "U+022C2" }, { - entity: "xcirc;", - value: "U+025EF" + "entity": "xcirc;", + "value": "U+025EF" }, { - entity: "xcup;", - value: "U+022C3" + "entity": "xcup;", + "value": "U+022C3" }, { - entity: "xdtri;", - value: "U+025BD" + "entity": "xdtri;", + "value": "U+025BD" }, { - entity: "xfr;", - value: "U+1D535" + "entity": "xfr;", + "value": "U+1D535" }, { - entity: "xhArr;", - value: "U+027FA" + "entity": "xhArr;", + "value": "U+027FA" }, { - entity: "xharr;", - value: "U+027F7" + "entity": "xharr;", + "value": "U+027F7" }, { - entity: "xi;", - value: "U+003BE" + "entity": "xi;", + "value": "U+003BE" }, { - entity: "xlArr;", - value: "U+027F8" + "entity": "xlArr;", + "value": "U+027F8" }, { - entity: "xlarr;", - value: "U+027F5" + "entity": "xlarr;", + "value": "U+027F5" }, { - entity: "xmap;", - value: "U+027FC" + "entity": "xmap;", + "value": "U+027FC" }, { - entity: "xnis;", - value: "U+022FB" + "entity": "xnis;", + "value": "U+022FB" }, { - entity: "xodot;", - value: "U+02A00" + "entity": "xodot;", + "value": "U+02A00" }, { - entity: "xopf;", - value: "U+1D569" + "entity": "xopf;", + "value": "U+1D569" }, { - entity: "xoplus;", - value: "U+02A01" + "entity": "xoplus;", + "value": "U+02A01" }, { - entity: "xotime;", - value: "U+02A02" + "entity": "xotime;", + "value": "U+02A02" }, { - entity: "xrArr;", - value: "U+027F9" + "entity": "xrArr;", + "value": "U+027F9" }, { - entity: "xrarr;", - value: "U+027F6" + "entity": "xrarr;", + "value": "U+027F6" }, { - entity: "xscr;", - value: "U+1D4CD" + "entity": "xscr;", + "value": "U+1D4CD" }, { - entity: "xsqcup;", - value: "U+02A06" + "entity": "xsqcup;", + "value": "U+02A06" }, { - entity: "xuplus;", - value: "U+02A04" + "entity": "xuplus;", + "value": "U+02A04" }, { - entity: "xutri;", - value: "U+025B3" + "entity": "xutri;", + "value": "U+025B3" }, { - entity: "xvee;", - value: "U+022C1" + "entity": "xvee;", + "value": "U+022C1" }, { - entity: "xwedge;", - value: "U+022C0" + "entity": "xwedge;", + "value": "U+022C0" }, { - entity: "yacute;", - value: "U+000FD" + "entity": "yacute;", + "value": "U+000FD" }, { - entity: "yacute", - value: "U+000FD" + "entity": "yacute", + "value": "U+000FD" }, { - entity: "yacy;", - value: "U+0044F" + "entity": "yacy;", + "value": "U+0044F" }, { - entity: "ycirc;", - value: "U+00177" + "entity": "ycirc;", + "value": "U+00177" }, { - entity: "ycy;", - value: "U+0044B" + "entity": "ycy;", + "value": "U+0044B" }, { - entity: "yen;", - value: "U+000A5" + "entity": "yen;", + "value": "U+000A5" }, { - entity: "yen", - value: "U+000A5" + "entity": "yen", + "value": "U+000A5" }, { - entity: "yfr;", - value: "U+1D536" + "entity": "yfr;", + "value": "U+1D536" }, { - entity: "yicy;", - value: "U+00457" + "entity": "yicy;", + "value": "U+00457" }, { - entity: "yopf;", - value: "U+1D56A" + "entity": "yopf;", + "value": "U+1D56A" }, { - entity: "yscr;", - value: "U+1D4CE" + "entity": "yscr;", + "value": "U+1D4CE" }, { - entity: "yucy;", - value: "U+0044E" + "entity": "yucy;", + "value": "U+0044E" }, { - entity: "yuml;", - value: "U+000FF" + "entity": "yuml;", + "value": "U+000FF" }, { - entity: "yuml", - value: "U+000FF" + "entity": "yuml", + "value": "U+000FF" }, { - entity: "zacute;", - value: "U+0017A" + "entity": "zacute;", + "value": "U+0017A" }, { - entity: "zcaron;", - value: "U+0017E" + "entity": "zcaron;", + "value": "U+0017E" }, { - entity: "zcy;", - value: "U+00437" + "entity": "zcy;", + "value": "U+00437" }, { - entity: "zdot;", - value: "U+0017C" + "entity": "zdot;", + "value": "U+0017C" }, { - entity: "zeetrf;", - value: "U+02128" + "entity": "zeetrf;", + "value": "U+02128" }, { - entity: "zeta;", - value: "U+003B6" + "entity": "zeta;", + "value": "U+003B6" }, { - entity: "zfr;", - value: "U+1D537" + "entity": "zfr;", + "value": "U+1D537" }, { - entity: "zhcy;", - value: "U+00436" + "entity": "zhcy;", + "value": "U+00436" }, { - entity: "zigrarr;", - value: "U+021DD" + "entity": "zigrarr;", + "value": "U+021DD" }, { - entity: "zopf;", - value: "U+1D56B" + "entity": "zopf;", + "value": "U+1D56B" }, { - entity: "zscr;", - value: "U+1D4CF" + "entity": "zscr;", + "value": "U+1D4CF" }, { - entity: "zwj;", - value: "U+0200D" + "entity": "zwj;", + "value": "U+0200D" }, { - entity: "zwnj;", - value: "U+0200C" + "entity": "zwnj;", + "value": "U+0200C" } ] diff --git a/WebCore/html/HTMLFormattingElementList.h b/WebCore/html/HTMLFormattingElementList.h index 135163c..aca05bb 100644 --- a/WebCore/html/HTMLFormattingElementList.h +++ b/WebCore/html/HTMLFormattingElementList.h @@ -32,7 +32,6 @@ namespace WebCore { -class AtomicString; class Element; // This may end up merged into HTMLElementStack. diff --git a/WebCore/html/HTMLInputElement.cpp b/WebCore/html/HTMLInputElement.cpp index f4528c2..f0245ec 100644 --- a/WebCore/html/HTMLInputElement.cpp +++ b/WebCore/html/HTMLInputElement.cpp @@ -67,9 +67,13 @@ #include "StepRange.h" #include "StringHash.h" #include "TextEvent.h" +<<<<<<< HEAD #ifdef ANDROID_ACCEPT_CHANGES_TO_FOCUSED_TEXTFIELDS #include "WebViewCore.h" #endif +======= +#include "WheelEvent.h" +>>>>>>> webkit.org at r65072 #include <wtf/HashMap.h> #include <wtf/MathExtras.h> #include <wtf/StdLibExtras.h> @@ -2040,7 +2044,7 @@ bool HTMLInputElement::storesValueSeparateFromAttribute() const return false; } -struct EventHandlingState { +struct EventHandlingState : FastAllocBase { RefPtr<HTMLInputElement> m_currRadio; bool m_indeterminate; bool m_checked; @@ -2419,6 +2423,20 @@ void HTMLInputElement::defaultEventHandler(Event* evt) if (evt->isBeforeTextInsertedEvent()) handleBeforeTextInsertedEvent(evt); + if (hasSpinButton() && evt->isWheelEvent()) { + WheelEvent* wheel = static_cast<WheelEvent*>(evt); + int step = 0; + if (wheel->wheelDeltaY() > 0) { + step = 1; + } else if (wheel->wheelDeltaY() < 0) { + step = -1; + } + if (step) { + stepUpFromRenderer(step); + evt->setDefaultHandled(); + return; + } + } if (isTextField() && renderer() && (evt->isMouseEvent() || evt->isDragEvent() || evt->isWheelEvent() || evt->type() == eventNames().blurEvent || evt->type() == eventNames().focusEvent)) toRenderTextControlSingleLine(renderer())->forwardEvent(evt); @@ -2814,10 +2832,16 @@ HTMLOptionElement* HTMLInputElement::selectedOption() const void HTMLInputElement::stepUpFromRenderer(int n) { - // The difference from stepUp()/stepDown() is: - // If the current value is invalid, the value will be - // - the minimum value if n > 0 - // - the maximum value if n < 0 + // The differences from stepUp()/stepDown(): + // If the current value is not a number, the value will be + // - The value should be the minimum value if n > 0 + // - The value should be the maximum value if n < 0 + // If the current value is smaller than the minimum value: + // - The value should be the minimum value if n > 0 + // - Nothing should happen if n < 0 + // If the current value is larger than the maximum value: + // - The value should be the maximum value if n < 0 + // - Nothing should happen if n > 0 ASSERT(hasSpinButton()); if (!hasSpinButton()) @@ -2829,7 +2853,7 @@ void HTMLInputElement::stepUpFromRenderer(int n) const double nan = numeric_limits<double>::quiet_NaN(); String currentStringValue = value(); double current = parseToDouble(currentStringValue, nan); - if (!isfinite(current)) + if (!isfinite(current) || (n > 0 && current < minimum()) || (n < 0 && current > maximum())) setValue(serialize(n > 0 ? minimum() : maximum())); else { ExceptionCode ec; diff --git a/WebCore/html/HTMLMediaElement.cpp b/WebCore/html/HTMLMediaElement.cpp index ad465bb..94c0dd2 100644 --- a/WebCore/html/HTMLMediaElement.cpp +++ b/WebCore/html/HTMLMediaElement.cpp @@ -108,8 +108,9 @@ HTMLMediaElement::HTMLMediaElement(const QualifiedName& tagName, Document* doc) #endif , m_restrictions(NoRestrictions) , m_preload(MediaPlayer::Auto) - , m_playing(false) + , m_displayMode(Unknown) , m_processingMediaPlayerCallback(0) + , m_playing(false) , m_isWaitingUntilMediaCanStart(false) , m_processingLoad(false) , m_delayingTheLoadEvent(false) @@ -494,6 +495,7 @@ void HTMLMediaElement::prepareForLoad() m_sentStalledEvent = false; m_haveFiredLoadedData = false; m_completelyLoaded = false; + m_displayMode = Unknown; // 1 - Abort any already-running instance of the resource selection algorithm for this element. m_currentSourceNode = 0; @@ -533,7 +535,6 @@ void HTMLMediaElement::prepareForLoad() m_playedTimeRanges = TimeRanges::create(); m_lastSeekTime = 0; m_closedCaptionsVisible = false; - } void HTMLMediaElement::loadInternal() @@ -671,11 +672,9 @@ void HTMLMediaElement::loadResource(const KURL& initialURL, ContentType& content #endif m_player->load(m_currentSrc, contentType); - if (isVideo() && m_player->canLoadPoster()) { - KURL posterURL = getNonEmptyURLAttribute(posterAttr); - if (!posterURL.isEmpty()) - m_player->setPoster(posterURL); - } + // If there is no poster to display, allow the media engine to render video frames as soon as + // they are available. + updateDisplayState(); if (renderer()) renderer()->updateFromElement(); @@ -746,7 +745,7 @@ void HTMLMediaElement::noneSupported() // 9 -Abort these steps. Until the load() method is invoked, the element won't attempt to load another resource. - updatePosterImage(); + updateDisplayState(); if (renderer()) renderer()->updateFromElement(); @@ -835,7 +834,7 @@ void HTMLMediaElement::setNetworkState(MediaPlayer::NetworkState state) else if (state == MediaPlayer::FormatError && m_loadState == LoadingFromSrcAttr) noneSupported(); - updatePosterImage(); + updateDisplayState(); return; } @@ -917,17 +916,13 @@ void HTMLMediaElement::setReadyState(MediaPlayer::ReadyState state) if (m_readyState >= HAVE_METADATA && oldState < HAVE_METADATA) { scheduleEvent(eventNames().durationchangeEvent); scheduleEvent(eventNames().loadedmetadataEvent); - -#if !ENABLE(PLUGIN_PROXY_FOR_VIDEO) - if (renderer() && renderer()->isVideo()) { - toRenderVideo(renderer())->videoSizeChanged(); - } -#endif + if (renderer()) + renderer()->updateFromElement(); m_delayingTheLoadEvent = false; m_player->seek(0); } - bool shouldUpdatePosterImage = false; + bool shouldUpdateDisplayState = false; // 4.8.10.7 says loadeddata is sent only when the new state *is* HAVE_CURRENT_DATA: "If the // previous ready state was HAVE_METADATA and the new ready state is HAVE_CURRENT_DATA", @@ -936,7 +931,7 @@ void HTMLMediaElement::setReadyState(MediaPlayer::ReadyState state) // We go with the later because it seems useful to count on getting this event if (m_readyState >= HAVE_CURRENT_DATA && oldState < HAVE_CURRENT_DATA && !m_haveFiredLoadedData) { m_haveFiredLoadedData = true; - shouldUpdatePosterImage = true; + shouldUpdateDisplayState = true; scheduleEvent(eventNames().loadeddataEvent); } @@ -945,7 +940,7 @@ void HTMLMediaElement::setReadyState(MediaPlayer::ReadyState state) scheduleEvent(eventNames().canplayEvent); if (isPotentiallyPlaying) scheduleEvent(eventNames().playingEvent); - shouldUpdatePosterImage = true; + shouldUpdateDisplayState = true; } if (m_readyState == HAVE_ENOUGH_DATA && oldState < HAVE_ENOUGH_DATA) { @@ -963,11 +958,11 @@ void HTMLMediaElement::setReadyState(MediaPlayer::ReadyState state) scheduleEvent(eventNames().playingEvent); } - shouldUpdatePosterImage = true; + shouldUpdateDisplayState = true; } - if (shouldUpdatePosterImage) - updatePosterImage(); + if (shouldUpdateDisplayState) + updateDisplayState(); updatePlayState(); } @@ -1071,7 +1066,6 @@ void HTMLMediaElement::seek(float time, ExceptionCode& ec) m_player->seek(time); // 10-15 are handled, if necessary, when the engine signals a readystate change. - } void HTMLMediaElement::finishSeek() @@ -1081,6 +1075,8 @@ void HTMLMediaElement::finishSeek() // 4.8.10.10 Seeking step 13 scheduleEvent(eventNames().seekedEvent); + + setDisplayMode(Video); } HTMLMediaElement::ReadyState HTMLMediaElement::readyState() const @@ -1585,13 +1581,8 @@ void HTMLMediaElement::mediaPlayerDurationChanged(MediaPlayer*) { beginProcessingMediaPlayerCallback(); scheduleEvent(eventNames().durationchangeEvent); -#if !ENABLE(PLUGIN_PROXY_FOR_VIDEO) - if (renderer()) { + if (renderer()) renderer()->updateFromElement(); - if (renderer()->isVideo()) - toRenderVideo(renderer())->videoSizeChanged(); - } -#endif endProcessingMediaPlayerCallback(); } @@ -1619,20 +1610,17 @@ void HTMLMediaElement::mediaPlayerSawUnsupportedTracks(MediaPlayer*) void HTMLMediaElement::mediaPlayerRepaint(MediaPlayer*) { beginProcessingMediaPlayerCallback(); + updateDisplayState(); if (renderer()) renderer()->repaint(); - - updatePosterImage(); endProcessingMediaPlayerCallback(); } void HTMLMediaElement::mediaPlayerSizeChanged(MediaPlayer*) { beginProcessingMediaPlayerCallback(); -#if !ENABLE(PLUGIN_PROXY_FOR_VIDEO) - if (renderer() && renderer()->isVideo()) - toRenderVideo(renderer())->videoSizeChanged(); -#endif + if (renderer()) + renderer()->updateFromElement(); endProcessingMediaPlayerCallback(); } @@ -1783,6 +1771,8 @@ void HTMLMediaElement::updatePlayState() bool shouldBePlaying = potentiallyPlaying(); bool playerPaused = m_player->paused(); if (shouldBePlaying && playerPaused) { + setDisplayMode(Video); + // Set rate before calling play in case the rate was set before the media engine wasn't setup. // The media engine should just stash the rate since it isn't already playing. m_player->setRate(m_playbackRate); diff --git a/WebCore/html/HTMLMediaElement.h b/WebCore/html/HTMLMediaElement.h index eede363..aeec188 100644 --- a/WebCore/html/HTMLMediaElement.h +++ b/WebCore/html/HTMLMediaElement.h @@ -178,6 +178,10 @@ protected: virtual void willMoveToNewOwnerDocument(); virtual void didMoveToNewOwnerDocument(); + enum DisplayMode { Unknown, None, Poster, Video }; + DisplayMode displayMode() const { return m_displayMode; } + virtual void setDisplayMode(DisplayMode mode) { m_displayMode = mode; } + private: virtual bool checkDTD(const Node* newChild); virtual void attributeChanged(Attribute*, bool preserveDecls); @@ -195,7 +199,8 @@ private: virtual void documentWillBecomeInactive(); virtual void documentDidBecomeActive(); virtual void mediaVolumeDidChange(); - virtual void updatePosterImage() { } + + virtual void updateDisplayState() { } void setReadyState(MediaPlayer::ReadyState); void setNetworkState(MediaPlayer::NetworkState); @@ -254,7 +259,8 @@ private: void pauseInternal(); void prepareForLoad(); - + void allowVideoRendering(); + bool processingMediaPlayerCallback() const { return m_processingMediaPlayerCallback > 0; } void beginProcessingMediaPlayerCallback() { ++m_processingMediaPlayerCallback; } void endProcessingMediaPlayerCallback() { ASSERT(m_processingMediaPlayerCallback); --m_processingMediaPlayerCallback; } @@ -326,14 +332,14 @@ private: MediaPlayer::Preload m_preload; - bool m_playing; + DisplayMode m_displayMode; // Counter incremented while processing a callback from the media player, so we can avoid // calling the media engine recursively. int m_processingMediaPlayerCallback; - bool m_isWaitingUntilMediaCanStart; - + bool m_playing : 1; + bool m_isWaitingUntilMediaCanStart : 1; bool m_processingLoad : 1; bool m_delayingTheLoadEvent : 1; bool m_haveFiredLoadedData : 1; diff --git a/WebCore/html/HTMLParserQuirks.h b/WebCore/html/HTMLParserQuirks.h index 176bbfb..50de710 100644 --- a/WebCore/html/HTMLParserQuirks.h +++ b/WebCore/html/HTMLParserQuirks.h @@ -26,11 +26,11 @@ #ifndef HTMLParserQuirks_h #define HTMLParserQuirks_h +#include <wtf/Forward.h> #include <wtf/Noncopyable.h> namespace WebCore { -class AtomicString; class Node; class HTMLParserQuirks : public Noncopyable { diff --git a/WebCore/html/HTMLQuoteElement.h b/WebCore/html/HTMLQuoteElement.h index df47e73..9261da6 100644 --- a/WebCore/html/HTMLQuoteElement.h +++ b/WebCore/html/HTMLQuoteElement.h @@ -24,12 +24,11 @@ #ifndef HTMLQuoteElement_h #define HTMLQuoteElement_h +#include <wtf/Forward.h> #include "HTMLElement.h" namespace WebCore { -class String; - class HTMLQuoteElement : public HTMLElement { public: static PassRefPtr<HTMLQuoteElement> create(const QualifiedName&, Document*); diff --git a/WebCore/html/HTMLScriptRunner.cpp b/WebCore/html/HTMLScriptRunner.cpp index f4b7013..4a9058f 100644 --- a/WebCore/html/HTMLScriptRunner.cpp +++ b/WebCore/html/HTMLScriptRunner.cpp @@ -105,7 +105,7 @@ ScriptSourceCode HTMLScriptRunner::sourceFromPendingScript(const PendingScript& return ScriptSourceCode(script.cachedScript()); } errorOccurred = false; - return ScriptSourceCode(script.element->textContent(), documentURLForScriptExecution(m_document), script.startingLineNumber); + return ScriptSourceCode(script.element()->textContent(), documentURLForScriptExecution(m_document), script.startingLineNumber()); } bool HTMLScriptRunner::isPendingScriptReady(const PendingScript& script) @@ -195,7 +195,7 @@ bool HTMLScriptRunner::execute(PassRefPtr<Element> scriptElement, int startLine) bool HTMLScriptRunner::haveParsingBlockingScript() const { - return !!m_parsingBlockingScript.element; + return !!m_parsingBlockingScript.element(); } bool HTMLScriptRunner::executeParsingBlockingScripts() @@ -230,7 +230,7 @@ bool HTMLScriptRunner::executeScriptsWaitingForStylesheets() void HTMLScriptRunner::requestScript(Element* script) { - ASSERT(!m_parsingBlockingScript.element); + ASSERT(!m_parsingBlockingScript.element()); AtomicString srcValue = script->getAttribute(srcAttr); // Allow the host to disllow script loads (using the XSSAuditor, etc.) if (!m_host->shouldLoadExternalScriptFromSrc(srcValue)) @@ -238,7 +238,7 @@ void HTMLScriptRunner::requestScript(Element* script) // FIXME: We need to resolve the url relative to the element. if (!script->dispatchBeforeLoadEvent(srcValue)) return; - m_parsingBlockingScript.element = script; + m_parsingBlockingScript.adoptElement(script); // This should correctly return 0 for empty or invalid srcValues. CachedScript* cachedScript = m_document->docLoader()->requestScript(srcValue, toScriptElement(script)->scriptCharset()); if (!cachedScript) { @@ -278,34 +278,4 @@ void HTMLScriptRunner::runScript(Element* script, int startingLineNumber) } } -HTMLScriptRunner::PendingScript::~PendingScript() -{ - if (m_cachedScript) - m_cachedScript->removeClient(this); -} - -PassRefPtr<Element> HTMLScriptRunner::PendingScript::releaseElementAndClear() -{ - setCachedScript(0); - startingLineNumber = 0; - m_watchingForLoad = false; - return element.release(); -} - -void HTMLScriptRunner::PendingScript::setCachedScript(CachedScript* cachedScript) -{ - if (m_cachedScript == cachedScript) - return; - if (m_cachedScript) - m_cachedScript->removeClient(this); - m_cachedScript = cachedScript; - if (m_cachedScript) - m_cachedScript->addClient(this); -} - -CachedScript* HTMLScriptRunner::PendingScript::cachedScript() const -{ - return m_cachedScript.get(); -} - } diff --git a/WebCore/html/HTMLScriptRunner.h b/WebCore/html/HTMLScriptRunner.h index cc69443..85801b2 100644 --- a/WebCore/html/HTMLScriptRunner.h +++ b/WebCore/html/HTMLScriptRunner.h @@ -26,14 +26,13 @@ #ifndef HTMLScriptRunner_h #define HTMLScriptRunner_h -#include "CachedResourceClient.h" -#include "CachedResourceHandle.h" +#include "PendingScript.h" #include <wtf/Noncopyable.h> #include <wtf/PassRefPtr.h> namespace WebCore { -class CachedResourceClient; +class CachedResource; class CachedScript; class Document; class Element; @@ -56,45 +55,6 @@ public: bool isExecutingScript() { return !!m_scriptNestingLevel; } private: - // A container for an external script which may be loaded and executed. - // - // A CachedResourceHandle alone does not prevent the underlying CachedResource - // from purging its data buffer. This class holds a dummy client open for its - // lifetime in order to guarantee that the data buffer will not be purged. - // - // FIXME: Finish turning this into a proper class. - class PendingScript : public CachedResourceClient, Noncopyable { - public: - PendingScript() - : startingLineNumber(0) - , m_watchingForLoad(false) - { - } - - ~PendingScript(); - - PassRefPtr<Element> releaseElementAndClear(); - - bool watchingForLoad() const { return m_watchingForLoad; } - void setWatchingForLoad(bool b) { m_watchingForLoad = b; } - - CachedScript* cachedScript() const; - void setCachedScript(CachedScript*); - - virtual void notifyFinished(CachedResource*) - { - } - - RefPtr<Element> element; - int startingLineNumber; // Only used for inline script tags. - // HTML5 has an isReady parameter, however isReady ends up equivalent to - // m_document->haveStylesheetsLoaded() && cachedScript->isLoaded() - - private: - bool m_watchingForLoad; - CachedResourceHandle<CachedScript> m_cachedScript; - }; - Frame* frame() const; bool haveParsingBlockingScript() const; diff --git a/WebCore/html/HTMLScriptRunnerHost.h b/WebCore/html/HTMLScriptRunnerHost.h index a129520..5b40a931 100644 --- a/WebCore/html/HTMLScriptRunnerHost.h +++ b/WebCore/html/HTMLScriptRunnerHost.h @@ -26,9 +26,10 @@ #ifndef HTMLScriptRunnerHost_h #define HTMLScriptRunnerHost_h +#include <wtf/Forward.h> + namespace WebCore { -class AtomicString; class CachedResource; class Element; class HTMLInputStream; diff --git a/WebCore/html/HTMLToken.h b/WebCore/html/HTMLToken.h index 8465a35..5f2869b 100644 --- a/WebCore/html/HTMLToken.h +++ b/WebCore/html/HTMLToken.h @@ -262,7 +262,7 @@ private: // want to end up with a cleaner interface between the two classes. friend class AtomicHTMLToken; - class DoctypeData { + class DoctypeData : public Noncopyable { public: DoctypeData() : m_hasPublicIdentifier(false) diff --git a/WebCore/html/HTMLTokenizer.cpp b/WebCore/html/HTMLTokenizer.cpp index c8234e4..a52aba6 100644 --- a/WebCore/html/HTMLTokenizer.cpp +++ b/WebCore/html/HTMLTokenizer.cpp @@ -97,6 +97,7 @@ inline bool isEndTagBufferingState(HTMLTokenizer::State state) } HTMLTokenizer::HTMLTokenizer() + : m_inputStreamPreprocessor(this) { reset(); } @@ -111,6 +112,7 @@ void HTMLTokenizer::reset() m_token = 0; m_lineNumber = 0; m_skipLeadingNewLineForListing = false; + m_forceNullCharacterReplacement = false; m_additionalAllowedCharacter = '\0'; } diff --git a/WebCore/html/HTMLTokenizer.h b/WebCore/html/HTMLTokenizer.h index 7ee9d41..0e9ba3a 100644 --- a/WebCore/html/HTMLTokenizer.h +++ b/WebCore/html/HTMLTokenizer.h @@ -34,6 +34,7 @@ namespace WebCore { +class Element; class HTMLToken; class HTMLTokenizer : public Noncopyable { @@ -132,14 +133,27 @@ public: // Hack to skip leading newline in <pre>/<listing> for authoring ease. // http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#parsing-main-inbody - void skipLeadingNewLineForListing() { m_skipLeadingNewLineForListing = true; } + void setSkipLeadingNewLineForListing(bool value) { m_skipLeadingNewLineForListing = value; } + + bool forceNullCharacterReplacement() const { return m_forceNullCharacterReplacement; } + void setForceNullCharacterReplacement(bool value) { m_forceNullCharacterReplacement = value; } + + bool shouldSkipNullCharacters() const + { + return !m_forceNullCharacterReplacement + && (m_state == DataState + || m_state == RCDATAState + || m_state == RAWTEXTState + || m_state == PLAINTEXTState); + } private: // http://www.whatwg.org/specs/web-apps/current-work/#preprocessing-the-input-stream class InputStreamPreprocessor : public Noncopyable { public: - InputStreamPreprocessor() - : m_nextInputCharacter('\0') + InputStreamPreprocessor(HTMLTokenizer* tokenizer) + : m_tokenizer(tokenizer) + , m_nextInputCharacter('\0') , m_skipNextNewLine(false) { } @@ -151,6 +165,7 @@ private: // characters in |source| (after collapsing \r\n, etc). ALWAYS_INLINE bool peek(SegmentedString& source, int& lineNumber) { + PeekAgain: m_nextInputCharacter = *source; // Every branch in this function is expensive, so we have a @@ -179,8 +194,15 @@ private: // a number of specific character values are parse errors and should be replaced // by the replacement character. We suspect this is a problem with the spec as doing // that filtering breaks surrogate pair handling and causes us not to match Minefield. - if (m_nextInputCharacter == '\0' && !shouldTreatNullAsEndOfFileMarker(source)) + if (m_nextInputCharacter == '\0' && !shouldTreatNullAsEndOfFileMarker(source)) { + if (m_tokenizer->shouldSkipNullCharacters()) { + source.advancePastNonNewline(); + if (source.isEmpty()) + return false; + goto PeekAgain; + } m_nextInputCharacter = 0xFFFD; + } } return true; } @@ -202,6 +224,8 @@ private: return source.isClosed() && source.length() == 1; } + HTMLTokenizer* m_tokenizer; + // http://www.whatwg.org/specs/web-apps/current-work/#next-input-character UChar m_nextInputCharacter; bool m_skipNextNewLine; @@ -242,6 +266,7 @@ private: int m_lineNumber; bool m_skipLeadingNewLineForListing; + bool m_forceNullCharacterReplacement; // http://www.whatwg.org/specs/web-apps/current-work/#temporary-buffer Vector<UChar, 32> m_temporaryBuffer; diff --git a/WebCore/html/HTMLTreeBuilder.cpp b/WebCore/html/HTMLTreeBuilder.cpp index ec15f9f..2c7d40d 100644 --- a/WebCore/html/HTMLTreeBuilder.cpp +++ b/WebCore/html/HTMLTreeBuilder.cpp @@ -61,20 +61,37 @@ static const int uninitializedLineNumberValue = -1; namespace { -inline bool isTreeBuilderWhitepace(UChar cc) +inline bool isTreeBuilderWhitepace(UChar c) { - return cc == '\t' || cc == '\x0A' || cc == '\x0C' || cc == '\x0D' || cc == ' '; + // FIXME: Consider branch permutations. + return c == '\t' || c == '\x0A' || c == '\x0C' || c == '\x0D' || c == ' '; } -inline bool hasNonWhitespace(const String& string) +inline bool isTreeBuilderWhitepaceOrReplacementCharacter(UChar c) +{ + return isTreeBuilderWhitepace(c) || c == 0xFFFD; +} + +template<bool isSpecialCharacter(UChar c)> +inline bool isAllSpecialCharacters(const String& string) { const UChar* characters = string.characters(); const unsigned length = string.length(); for (unsigned i = 0; i < length; ++i) { - if (!isTreeBuilderWhitepace(characters[i])) - return true; + if (!isSpecialCharacter(characters[i])) + return false; } - return false; + return true; +} + +inline bool isAllWhitespace(const String& string) +{ + return isAllSpecialCharacters<isTreeBuilderWhitepace>(string); +} + +inline bool isAllWhitespaceOrReplacementCharacters(const String& string) +{ + return isAllSpecialCharacters<isTreeBuilderWhitepaceOrReplacementCharacter>(string); } bool shouldUseLegacyTreeBuilder(Document* document) @@ -236,6 +253,29 @@ bool isNotFormattingAndNotPhrasing(const Element* element) return isScopingTag(tagName) || isSpecialTag(tagName); } +HTMLFormElement* closestFormAncestor(Element* element) +{ + while (element) { + if (element->hasTagName(formTag)) + return static_cast<HTMLFormElement*>(element); + Node* parent = element->parent(); + if (!parent || !parent->isElementNode()) + return 0; + element = static_cast<Element*>(parent); + } + return 0; +} + +// FIXME: This belongs on ContainerNode, where it could avoid the double ref +// by directly releasing into the Vector. Such an implementation would need to +// be careful not to send mutation events. +void takeChildrenFromNode(ContainerNode* container, Vector<RefPtr<Node> >& children) +{ + for (Node* child = container->firstChild(); child; child = child->nextSibling()) + children.append(child); + container->removeAllChildren(); +} + } // namespace class HTMLTreeBuilder::ExternalCharacterTokenBuffer : public Noncopyable { @@ -327,38 +367,89 @@ HTMLTreeBuilder::HTMLTreeBuilder(HTMLTokenizer* tokenizer, HTMLDocument* documen , m_originalInsertionMode(InitialMode) , m_secondaryInsertionMode(InitialMode) , m_tokenizer(tokenizer) - , m_legacyTreeBuilder(shouldUseLegacyTreeBuilder(document) ? new LegacyHTMLTreeBuilder(document, reportErrors) : 0) , m_lastScriptElementStartLine(uninitializedLineNumberValue) , m_scriptToProcessStartLine(uninitializedLineNumberValue) - , m_fragmentScriptingPermission(FragmentScriptingAllowed) - , m_isParsingFragment(false) { } // FIXME: Member variables should be grouped into self-initializing structs to // minimize code duplication between these constructors. -HTMLTreeBuilder::HTMLTreeBuilder(HTMLTokenizer* tokenizer, DocumentFragment* fragment, FragmentScriptingPermission scriptingPermission) +HTMLTreeBuilder::HTMLTreeBuilder(HTMLTokenizer* tokenizer, DocumentFragment* fragment, Element* contextElement, FragmentScriptingPermission scriptingPermission) : m_framesetOk(true) - , m_document(fragment->document()) - , m_tree(fragment->document(), scriptingPermission, true) + , m_fragmentContext(fragment, contextElement, scriptingPermission, shouldUseLegacyTreeBuilder(fragment->document())) + , m_document(m_fragmentContext.document()) + , m_tree(m_document, scriptingPermission, true) , m_reportErrors(false) // FIXME: Why not report errors in fragments? , m_isPaused(false) , m_insertionMode(InitialMode) , m_originalInsertionMode(InitialMode) , m_secondaryInsertionMode(InitialMode) , m_tokenizer(tokenizer) - , m_legacyTreeBuilder(new LegacyHTMLTreeBuilder(fragment, scriptingPermission)) + , m_legacyTreeBuilder(shouldUseLegacyTreeBuilder(fragment->document()) ? new LegacyHTMLTreeBuilder(fragment, scriptingPermission) : 0) , m_lastScriptElementStartLine(uninitializedLineNumberValue) , m_scriptToProcessStartLine(uninitializedLineNumberValue) - , m_fragmentScriptingPermission(scriptingPermission) - , m_isParsingFragment(true) { + if (shouldUseLegacyTreeBuilder(fragment->document())) + return; + // This is steps 2-6 of the HTML5 Fragment Case parsing algorithm: + // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#fragment-case + if (contextElement) + m_document->setParseMode(contextElement->document()->parseMode()); + processFakeStartTag(htmlTag); + resetInsertionModeAppropriately(); + m_tree.setForm(closestFormAncestor(contextElement)); } HTMLTreeBuilder::~HTMLTreeBuilder() { } +HTMLTreeBuilder::FragmentParsingContext::FragmentParsingContext() + : m_fragment(0) + , m_contextElement(0) + , m_usingLegacyTreeBuilder(false) + , m_scriptingPermission(FragmentScriptingAllowed) +{ +} + +HTMLTreeBuilder::FragmentParsingContext::FragmentParsingContext(DocumentFragment* fragment, Element* contextElement, FragmentScriptingPermission scriptingPermission, bool legacyMode) + : m_dummyDocumentForFragmentParsing(legacyMode ? 0 : HTMLDocument::create(0, KURL())) + , m_fragment(fragment) + , m_contextElement(contextElement) + , m_usingLegacyTreeBuilder(legacyMode) + , m_scriptingPermission(scriptingPermission) +{ +} + +Document* HTMLTreeBuilder::FragmentParsingContext::document() const +{ + ASSERT(m_fragment); + if (m_usingLegacyTreeBuilder) + return m_fragment->document(); + return m_dummyDocumentForFragmentParsing.get(); +} + +void HTMLTreeBuilder::FragmentParsingContext::finished() +{ + // Populate the DocumentFragment with the parsed content now that we're done. + ContainerNode* root = m_dummyDocumentForFragmentParsing.get(); + if (m_contextElement) + root = m_dummyDocumentForFragmentParsing->documentElement(); + Vector<RefPtr<Node> > children; + takeChildrenFromNode(root, children); + for (unsigned i = 0; i < children.size(); ++i) { + ExceptionCode ec = 0; + // FIXME: We need a parser-safe (no events) version of adoptNode. + RefPtr<Node> child = m_fragment->document()->adoptNode(children[i].release(), ec); + ASSERT(!ec); + m_fragment->parserAddChild(child.release()); + } +} + +HTMLTreeBuilder::FragmentParsingContext::~FragmentParsingContext() +{ +} + static void convertToOldStyle(AtomicHTMLToken& token, Token& oldStyleToken) { switch (token.type()) { @@ -412,9 +503,9 @@ HTMLTokenizer::State HTMLTreeBuilder::adjustedLexerState(HTMLTokenizer::State st if (tagName == styleTag || tagName == iframeTag || tagName == xmpTag - || tagName == noembedTag + || (tagName == noembedTag && pluginsEnabled(frame)) || tagName == noframesTag - || (tagName == noscriptTag && isScriptingFlagEnabled(frame))) + || (tagName == noscriptTag && scriptEnabled(frame))) return HTMLTokenizer::RAWTEXTState; if (tagName == plaintextTag) @@ -453,14 +544,14 @@ void HTMLTreeBuilder::passTokenToLegacyParser(HTMLToken& token) m_lastScriptElement = static_pointer_cast<Element>(result); m_lastScriptElementStartLine = m_tokenizer->lineNumber(); } else if (oldStyleToken.tagName == preTag || oldStyleToken.tagName == listingTag) - m_tokenizer->skipLeadingNewLineForListing(); + m_tokenizer->setSkipLeadingNewLineForListing(true); else m_tokenizer->setState(adjustedLexerState(m_tokenizer->state(), oldStyleToken.tagName, m_document->frame())); } else if (token.type() == HTMLToken::EndTag) { if (oldStyleToken.tagName == scriptTag) { if (m_lastScriptElement) { ASSERT(m_lastScriptElementStartLine != uninitializedLineNumberValue); - if (m_fragmentScriptingPermission == FragmentScriptingNotAllowed) { + if (m_fragmentContext.scriptingPermission() == FragmentScriptingNotAllowed) { // FIXME: This is a horrible hack for platform/Pasteboard. // Clear the <script> tag when using the Parser to create // a DocumentFragment for pasting so that javascript content @@ -493,6 +584,11 @@ void HTMLTreeBuilder::constructTreeFromToken(HTMLToken& rawToken) AtomicHTMLToken token(rawToken); processToken(token); + + // Swallowing U+0000 characters isn't in the HTML5 spec, but turning all + // the U+0000 characters into replacement characters has compatibility + // problems. + m_tokenizer->setForceNullCharacterReplacement(m_insertionMode == TextMode || m_insertionMode == InForeignContentMode); } void HTMLTreeBuilder::processToken(AtomicHTMLToken& token) @@ -776,12 +872,19 @@ void HTMLTreeBuilder::processStartTagForInBody(AtomicHTMLToken& token) return; } if (token.name() == bodyTag) { + if (!m_tree.openElements()->secondElementIsHTMLBodyElement() || m_tree.openElements()->hasOnlyOneElement()) { + ASSERT(isParsingFragment()); + return; + } m_tree.insertHTMLBodyStartTagInBody(token); return; } if (token.name() == framesetTag) { parseError(token); - notImplemented(); // fragment case + if (!m_tree.openElements()->secondElementIsHTMLBodyElement() || m_tree.openElements()->hasOnlyOneElement()) { + ASSERT(isParsingFragment()); + return; + } if (!m_framesetOk) return; ExceptionCode ec = 0; @@ -832,7 +935,7 @@ void HTMLTreeBuilder::processStartTagForInBody(AtomicHTMLToken& token) if (token.name() == preTag || token.name() == listingTag) { processFakePEndTagIfPInButtonScope(); m_tree.insertHTMLElement(token); - m_tokenizer->skipLeadingNewLineForListing(); + m_tokenizer->setSkipLeadingNewLineForListing(true); m_framesetOk = false; return; } @@ -952,7 +1055,7 @@ void HTMLTreeBuilder::processStartTagForInBody(AtomicHTMLToken& token) } if (token.name() == textareaTag) { m_tree.insertHTMLElement(token); - m_tokenizer->skipLeadingNewLineForListing(); + m_tokenizer->setSkipLeadingNewLineForListing(true); m_tokenizer->setState(HTMLTokenizer::RCDATAState); m_originalInsertionMode = m_insertionMode; m_framesetOk = false; @@ -971,11 +1074,11 @@ void HTMLTreeBuilder::processStartTagForInBody(AtomicHTMLToken& token) processGenericRawTextStartTag(token); return; } - if (token.name() == noembedTag) { + if (token.name() == noembedTag && pluginsEnabled(m_document->frame())) { processGenericRawTextStartTag(token); return; } - if (token.name() == noscriptTag && isScriptingFlagEnabled(m_document->frame())) { + if (token.name() == noscriptTag && scriptEnabled(m_document->frame())) { processGenericRawTextStartTag(token); return; } @@ -1052,7 +1155,7 @@ void HTMLTreeBuilder::processStartTagForInBody(AtomicHTMLToken& token) bool HTMLTreeBuilder::processColgroupEndTagForInColumnGroup() { if (m_tree.currentElement() == m_tree.openElements()->htmlElement()) { - ASSERT(m_isParsingFragment); + ASSERT(isParsingFragment()); // FIXME: parse error return false; } @@ -1113,7 +1216,7 @@ void HTMLTreeBuilder::processStartTagForInTable(AtomicHTMLToken& token) if (token.name() == tableTag) { parseError(token); if (!processTableEndTagForInTable()) { - ASSERT(m_isParsingFragment); + ASSERT(isParsingFragment()); return; } processStartTag(token); @@ -1262,7 +1365,7 @@ void HTMLTreeBuilder::processStartTag(AtomicHTMLToken& token) || token.name() == trTag) { parseError(token); if (!processCaptionEndTagForInCaption()) { - ASSERT(m_isParsingFragment); + ASSERT(isParsingFragment()); return; } processStartTag(token); @@ -1281,7 +1384,7 @@ void HTMLTreeBuilder::processStartTag(AtomicHTMLToken& token) return; } if (!processColgroupEndTagForInColumnGroup()) { - ASSERT(m_isParsingFragment); + ASSERT(isParsingFragment()); return; } processStartTag(token); @@ -1304,7 +1407,7 @@ void HTMLTreeBuilder::processStartTag(AtomicHTMLToken& token) if (isCaptionColOrColgroupTag(token.name()) || isTableBodyContextTag(token.name())) { // FIXME: This is slow. if (!m_tree.openElements()->inTableScope(tbodyTag.localName()) && !m_tree.openElements()->inTableScope(theadTag.localName()) && !m_tree.openElements()->inTableScope(tfootTag.localName())) { - ASSERT(m_isParsingFragment); + ASSERT(isParsingFragment()); parseError(token); return; } @@ -1329,7 +1432,7 @@ void HTMLTreeBuilder::processStartTag(AtomicHTMLToken& token) || isCaptionColOrColgroupTag(token.name()) || isTableBodyContextTag(token.name())) { if (!processTrEndTagForInRow()) { - ASSERT(m_isParsingFragment); + ASSERT(isParsingFragment()); return; } ASSERT(insertionMode() == InTableBodyMode); @@ -1346,7 +1449,7 @@ void HTMLTreeBuilder::processStartTag(AtomicHTMLToken& token) || isTableBodyContextTag(token.name())) { // FIXME: This could be more efficient. if (!m_tree.openElements()->inTableScope(tdTag) && !m_tree.openElements()->inTableScope(thTag)) { - ASSERT(m_isParsingFragment); + ASSERT(isParsingFragment()); parseError(token); return; } @@ -1630,7 +1733,12 @@ void HTMLTreeBuilder::reparentChildren(Element* oldParent, Element* newParent) // http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#parsing-main-inbody void HTMLTreeBuilder::callTheAdoptionAgency(AtomicHTMLToken& token) { - while (1) { + // The adoption agency algorithm is N^2. We limit the number of iterations + // to stop from hanging the whole browser. This limit is copied from the + // legacy tree builder and might need to be tweaked in the future. + static const int adoptionAgencyIterationLimit = 10; + + for (int i = 0; i < adoptionAgencyIterationLimit; ++i) { // 1. Element* formattingElement = m_tree.activeFormattingElements()->closestElementInScopeWithName(token.name()); if (!formattingElement || ((m_tree.openElements()->contains(formattingElement)) && !m_tree.openElements()->inScope(formattingElement))) { @@ -1663,7 +1771,7 @@ void HTMLTreeBuilder::callTheAdoptionAgency(AtomicHTMLToken& token) HTMLElementStack::ElementRecord* node = furthestBlock; HTMLElementStack::ElementRecord* nextNode = node->next(); HTMLElementStack::ElementRecord* lastNode = furthestBlock; - while (1) { + for (int i = 0; i < adoptionAgencyIterationLimit; ++i) { // 6.1 node = nextNode; ASSERT(node); @@ -1690,7 +1798,7 @@ void HTMLTreeBuilder::callTheAdoptionAgency(AtomicHTMLToken& token) // 6.6 // Use appendChild instead of parserAddChild to handle possible reparenting. ExceptionCode ec; - node->element()->appendChild(lastNode->element(), ec); + node->element()->appendChild(lastNode->element(), ec, true); ASSERT(!ec); // 6.7 lastNode = node; @@ -1705,7 +1813,7 @@ void HTMLTreeBuilder::callTheAdoptionAgency(AtomicHTMLToken& token) m_tree.fosterParent(lastNode->element()); else { ExceptionCode ec; - commonAncestor->appendChild(lastNode->element(), ec); + commonAncestor->appendChild(lastNode->element(), ec, true); ASSERT(!ec); } // 8 @@ -1718,8 +1826,9 @@ void HTMLTreeBuilder::callTheAdoptionAgency(AtomicHTMLToken& token) // be in HTMLConstructionSite. My guess is that steps 8--12 // should all be in some HTMLConstructionSite function. furthestBlockElement->parserAddChild(newElement); - if (furthestBlockElement->attached()) { - ASSERT(!newElement->attached()); + if (furthestBlockElement->attached() && !newElement->attached()) { + // Notice that newElement might already be attached if, for example, one of the reparented + // children is a style element, which attaches itself automatically. newElement->attach(); } // 11 @@ -1754,12 +1863,12 @@ void HTMLTreeBuilder::resetInsertionModeAppropriately() while (1) { Element* node = nodeRecord->element(); if (node == m_tree.openElements()->bottom()) { - ASSERT(m_isParsingFragment); + ASSERT(isParsingFragment()); last = true; - notImplemented(); // node = m_contextElement; + node = m_fragmentContext.contextElement(); } if (node->hasTagName(selectTag)) { - ASSERT(m_isParsingFragment); + ASSERT(isParsingFragment()); return setInsertionModeAndEnd(InSelectMode, foreign); } if (node->hasTagName(tdTag) || node->hasTagName(thTag)) @@ -1771,30 +1880,30 @@ void HTMLTreeBuilder::resetInsertionModeAppropriately() if (node->hasTagName(captionTag)) return setInsertionModeAndEnd(InCaptionMode, foreign); if (node->hasTagName(colgroupTag)) { - ASSERT(m_isParsingFragment); + ASSERT(isParsingFragment()); return setInsertionModeAndEnd(InColumnGroupMode, foreign); } if (node->hasTagName(tableTag)) return setInsertionModeAndEnd(InTableMode, foreign); if (node->hasTagName(headTag)) { - ASSERT(m_isParsingFragment); + ASSERT(isParsingFragment()); return setInsertionModeAndEnd(InBodyMode, foreign); } if (node->hasTagName(bodyTag)) return setInsertionModeAndEnd(InBodyMode, foreign); if (node->hasTagName(framesetTag)) { - ASSERT(m_isParsingFragment); + ASSERT(isParsingFragment()); return setInsertionModeAndEnd(InFramesetMode, foreign); } if (node->hasTagName(htmlTag)) { - ASSERT(m_isParsingFragment); + ASSERT(isParsingFragment()); return setInsertionModeAndEnd(BeforeHeadMode, foreign); } if (node->namespaceURI() == SVGNames::svgNamespaceURI || node->namespaceURI() == MathMLNames::mathmlNamespaceURI) foreign = true; if (last) { - ASSERT(m_isParsingFragment); + ASSERT(isParsingFragment()); return setInsertionModeAndEnd(InBodyMode, foreign); } nodeRecord = nodeRecord->next(); @@ -1817,7 +1926,7 @@ void HTMLTreeBuilder::processEndTagForInTableBody(AtomicHTMLToken& token) if (token.name() == tableTag) { // FIXME: This is slow. if (!m_tree.openElements()->inTableScope(tbodyTag.localName()) && !m_tree.openElements()->inTableScope(theadTag.localName()) && !m_tree.openElements()->inTableScope(tfootTag.localName())) { - ASSERT(m_isParsingFragment); + ASSERT(isParsingFragment()); parseError(token); return; } @@ -1847,7 +1956,7 @@ void HTMLTreeBuilder::processEndTagForInRow(AtomicHTMLToken& token) } if (token.name() == tableTag) { if (!processTrEndTagForInRow()) { - ASSERT(m_isParsingFragment); + ASSERT(isParsingFragment()); return; } ASSERT(insertionMode() == InTableBodyMode); @@ -1901,7 +2010,7 @@ void HTMLTreeBuilder::processEndTagForInCell(AtomicHTMLToken& token) || token.name() == trTag || isTableBodyContextTag(token.name())) { if (!m_tree.openElements()->inTableScope(token.name())) { - ASSERT(m_isParsingFragment); + ASSERT(isParsingFragment()); // FIXME: It is unclear what the exact ASSERT should be. // http://www.w3.org/Bugs/Public/show_bug.cgi?id=10098 parseError(token); @@ -1938,6 +2047,7 @@ void HTMLTreeBuilder::processEndTagForInBody(AtomicHTMLToken& token) || token.name() == divTag || token.name() == dlTag || token.name() == fieldsetTag + || token.name() == figcaptionTag || token.name() == figureTag || token.name() == footerTag || token.name() == headerTag @@ -1948,6 +2058,7 @@ void HTMLTreeBuilder::processEndTagForInBody(AtomicHTMLToken& token) || token.name() == olTag || token.name() == preTag || token.name() == sectionTag + || token.name() == summaryTag || token.name() == ulTag) { if (!m_tree.openElements()->inScope(token.name())) { parseError(token); @@ -2051,7 +2162,7 @@ void HTMLTreeBuilder::processEndTagForInBody(AtomicHTMLToken& token) bool HTMLTreeBuilder::processCaptionEndTagForInCaption() { if (!m_tree.openElements()->inTableScope(captionTag.localName())) { - ASSERT(m_isParsingFragment); + ASSERT(isParsingFragment()); // FIXME: parse error return false; } @@ -2066,7 +2177,7 @@ bool HTMLTreeBuilder::processCaptionEndTagForInCaption() bool HTMLTreeBuilder::processTrEndTagForInRow() { if (!m_tree.openElements()->inTableScope(trTag.localName())) { - ASSERT(m_isParsingFragment); + ASSERT(isParsingFragment()); // FIXME: parse error return false; } @@ -2080,7 +2191,7 @@ bool HTMLTreeBuilder::processTrEndTagForInRow() bool HTMLTreeBuilder::processTableEndTagForInTable() { if (!m_tree.openElements()->inTableScope(tableTag)) { - ASSERT(m_isParsingFragment); + ASSERT(isParsingFragment()); // FIXME: parse error. return false; } @@ -2172,7 +2283,7 @@ void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token) if (token.name() == tableTag) { parseError(token); if (!processCaptionEndTagForInCaption()) { - ASSERT(m_isParsingFragment); + ASSERT(isParsingFragment()); return; } processEndTag(token); @@ -2201,7 +2312,7 @@ void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token) return; } if (!processColgroupEndTagForInColumnGroup()) { - ASSERT(m_isParsingFragment); + ASSERT(isParsingFragment()); return; } processEndTag(token); @@ -2221,7 +2332,7 @@ void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token) case AfterBodyMode: ASSERT(insertionMode() == AfterBodyMode); if (token.name() == htmlTag) { - if (m_isParsingFragment) { + if (isParsingFragment()) { parseError(token); return; } @@ -2273,7 +2384,7 @@ void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token) return; } m_tree.openElements()->pop(); - if (!m_isParsingFragment && !m_tree.currentElement()->hasTagName(framesetTag)) + if (!isParsingFragment() && !m_tree.currentElement()->hasTagName(framesetTag)) setInsertionMode(AfterFramesetMode); return; } @@ -2491,7 +2602,7 @@ ReprocessBuffer: m_tree.reconstructTheActiveFormattingElements(); String characters = buffer.takeRemaining(); m_tree.insertTextNode(characters); - if (m_framesetOk && hasNonWhitespace(characters)) + if (m_framesetOk && !isAllWhitespaceOrReplacementCharacters(characters)) m_framesetOk = false; break; } @@ -2516,7 +2627,7 @@ ReprocessBuffer: if (buffer.isEmpty()) return; if (!processColgroupEndTagForInColumnGroup()) { - ASSERT(m_isParsingFragment); + ASSERT(isParsingFragment()); return; } goto ReprocessBuffer; @@ -2565,7 +2676,7 @@ ReprocessBuffer: ASSERT(insertionMode() == InForeignContentMode); String characters = buffer.takeRemaining(); m_tree.insertTextNode(characters); - if (m_framesetOk && hasNonWhitespace(characters)) + if (m_framesetOk && !isAllWhitespace(characters)) m_framesetOk = false; break; } @@ -2636,11 +2747,11 @@ void HTMLTreeBuilder::processEndOfFile(AtomicHTMLToken& token) break; case InColumnGroupMode: if (m_tree.currentElement() == m_tree.openElements()->htmlElement()) { - ASSERT(m_isParsingFragment); + ASSERT(isParsingFragment()); return; } if (!processColgroupEndTagForInColumnGroup()) { - ASSERT(m_isParsingFragment); + ASSERT(isParsingFragment()); return; } processEndOfFile(token); @@ -2709,7 +2820,7 @@ void HTMLTreeBuilder::defaultForAfterHead() void HTMLTreeBuilder::defaultForInTableText() { String characters = String::adopt(m_pendingTableCharacters); - if (hasNonWhitespace(characters)) { + if (!isAllWhitespace(characters)) { // FIXME: parse error HTMLConstructionSite::RedirectToFosterParentGuard redirecter(m_tree); m_tree.reconstructTheActiveFormattingElements(); @@ -2744,7 +2855,7 @@ bool HTMLTreeBuilder::processStartTagForInHead(AtomicHTMLToken& token) return true; } if (token.name() == noscriptTag) { - if (isScriptingFlagEnabled(m_document->frame())) { + if (scriptEnabled(m_document->frame())) { processGenericRawTextStartTag(token); return true; } @@ -2804,12 +2915,16 @@ void HTMLTreeBuilder::finished() return; } + if (isParsingFragment()) { + m_fragmentContext.finished(); + return; + } + // Warning, this may delete the parser, so don't try to do anything else after this. - if (!m_isParsingFragment) - m_document->finishedParsing(); + m_document->finishedParsing(); } -bool HTMLTreeBuilder::isScriptingFlagEnabled(Frame* frame) +bool HTMLTreeBuilder::scriptEnabled(Frame* frame) { if (!frame) return false; @@ -2818,4 +2933,11 @@ bool HTMLTreeBuilder::isScriptingFlagEnabled(Frame* frame) return false; } +bool HTMLTreeBuilder::pluginsEnabled(Frame* frame) +{ + if (!frame) + return false; + return frame->loader()->subframeLoader()->allowPlugins(NotAboutToInstantiatePlugin); +} + } diff --git a/WebCore/html/HTMLTreeBuilder.h b/WebCore/html/HTMLTreeBuilder.h index d723384..24cb542 100644 --- a/WebCore/html/HTMLTreeBuilder.h +++ b/WebCore/html/HTMLTreeBuilder.h @@ -54,7 +54,7 @@ class HTMLTreeBuilder : public Noncopyable { public: // FIXME: Replace constructors with create() functions returning PassOwnPtrs HTMLTreeBuilder(HTMLTokenizer*, HTMLDocument*, bool reportErrors); - HTMLTreeBuilder(HTMLTokenizer*, DocumentFragment*, FragmentScriptingPermission); + HTMLTreeBuilder(HTMLTokenizer*, DocumentFragment*, Element* contextElement, FragmentScriptingPermission); ~HTMLTreeBuilder(); void setPaused(bool paused) { m_isPaused = paused; } @@ -74,6 +74,9 @@ public: // until we stop using the legacy parser. DO NOT CALL THIS METHOD. LegacyHTMLTreeBuilder* legacyTreeBuilder() const { return m_legacyTreeBuilder.get(); } + static bool scriptEnabled(Frame*); + static bool pluginsEnabled(Frame*); + private: class FakeInsertionMode; class ExternalCharacterTokenBuffer; @@ -105,6 +108,8 @@ private: AfterAfterFramesetMode, }; + bool isParsingFragment() const { return !!m_fragmentContext.fragment(); } + void passTokenToLegacyParser(HTMLToken&); void processToken(AtomicHTMLToken&); @@ -192,7 +197,31 @@ private: void setInsertionModeAndEnd(InsertionMode, bool foreign); // Helper for resetInsertionModeAppropriately void resetInsertionModeAppropriately(); - static bool isScriptingFlagEnabled(Frame* frame); + class FragmentParsingContext : public Noncopyable { + public: + FragmentParsingContext(); + FragmentParsingContext(DocumentFragment*, Element* contextElement, FragmentScriptingPermission, bool usingLegacyTreeBuilder); + ~FragmentParsingContext(); + + Document* document() const; + DocumentFragment* fragment() const { return m_fragment; } + Element* contextElement() const { ASSERT(m_fragment); ASSERT(!m_usingLegacyTreeBuilder); return m_contextElement; } + FragmentScriptingPermission scriptingPermission() const { ASSERT(m_fragment); return m_scriptingPermission; } + + void finished(); + + private: + RefPtr<Document> m_dummyDocumentForFragmentParsing; + DocumentFragment* m_fragment; + Element* m_contextElement; + bool m_usingLegacyTreeBuilder; + + // FragmentScriptingNotAllowed causes the Parser to remove children + // from <script> tags (so javascript doesn't show up in pastes). + FragmentScriptingPermission m_scriptingPermission; + }; + + FragmentParsingContext m_fragmentContext; Document* m_document; HTMLConstructionSite m_tree; @@ -225,12 +254,6 @@ private: RefPtr<Element> m_scriptToProcess; // <script> tag which needs processing before resuming the parser. int m_scriptToProcessStartLine; // Starting line number of the script tag needing processing. - - // FIXME: FragmentScriptingPermission is a HACK for platform/Pasteboard. - // FragmentScriptingNotAllowed causes the Parser to remove children - // from <script> tags (so javascript doesn't show up in pastes). - FragmentScriptingPermission m_fragmentScriptingPermission; - bool m_isParsingFragment; }; } diff --git a/WebCore/html/HTMLVideoElement.cpp b/WebCore/html/HTMLVideoElement.cpp index bfdf241..ed2d35c 100644 --- a/WebCore/html/HTMLVideoElement.cpp +++ b/WebCore/html/HTMLVideoElement.cpp @@ -47,7 +47,6 @@ using namespace HTMLNames; inline HTMLVideoElement::HTMLVideoElement(const QualifiedName& tagName, Document* document) : HTMLMediaElement(tagName, document) - , m_shouldDisplayPosterImage(false) { ASSERT(hasTagName(videoTag)); } @@ -74,8 +73,8 @@ void HTMLVideoElement::attach() HTMLMediaElement::attach(); #if !ENABLE(PLUGIN_PROXY_FOR_VIDEO) - updatePosterImage(); - if (m_shouldDisplayPosterImage) { + updateDisplayState(); + if (shouldDisplayPosterImage()) { if (!m_imageLoader) m_imageLoader.set(new HTMLImageLoader(this)); m_imageLoader->updateFromElement(); @@ -91,9 +90,8 @@ void HTMLVideoElement::detach() { HTMLMediaElement::detach(); - if (!m_shouldDisplayPosterImage) - if (m_imageLoader) - m_imageLoader.clear(); + if (!shouldDisplayPosterImage() && m_imageLoader) + m_imageLoader.clear(); } void HTMLVideoElement::parseMappedAttribute(Attribute* attr) @@ -101,17 +99,21 @@ void HTMLVideoElement::parseMappedAttribute(Attribute* attr) const QualifiedName& attrName = attr->name(); if (attrName == posterAttr) { - updatePosterImage(); - if (m_shouldDisplayPosterImage) { + // Force a poster recalc by setting m_displayMode to Unknown directly before calling updateDisplayState. + HTMLMediaElement::setDisplayMode(Unknown); + updateDisplayState(); #if !ENABLE(PLUGIN_PROXY_FOR_VIDEO) + if (shouldDisplayPosterImage()) { if (!m_imageLoader) m_imageLoader.set(new HTMLImageLoader(this)); m_imageLoader->updateFromElementIgnoringPreviousError(); -#else - if (player()) - player()->setPoster(getNonEmptyURLAttribute(posterAttr)); -#endif + } else { + if (m_imageLoader) + m_imageLoader.clear(); + if (renderer()) + toRenderImage(renderer())->setCachedImage(0); } +#endif } else if (attrName == widthAttr) addCSSLength(attr, CSSPropertyWidth, attr->value()); else if (attrName == heightAttr) @@ -172,20 +174,42 @@ const QualifiedName& HTMLVideoElement::imageSourceAttributeName() const return posterAttr; } -void HTMLVideoElement::updatePosterImage() +void HTMLVideoElement::setDisplayMode(DisplayMode mode) { -#if !ENABLE(PLUGIN_PROXY_FOR_VIDEO) - bool oldShouldShowPosterImage = m_shouldDisplayPosterImage; -#endif + DisplayMode oldMode = displayMode(); + KURL poster = getNonEmptyURLAttribute(posterAttr); + + if (!poster.isEmpty()) { + // We have a poster path, but only show it until the user triggers display by playing or seeking and the + // media engine has something to display. + if (mode == Video) { + if (oldMode != Video && player()) + player()->prepareForRendering(); + if (!hasAvailableVideoFrame()) + mode = Poster; + } + } else if (oldMode != Video && player()) + player()->prepareForRendering(); - m_shouldDisplayPosterImage = !getAttribute(posterAttr).isEmpty() && !hasAvailableVideoFrame(); + HTMLMediaElement::setDisplayMode(mode); + + if (player() && player()->canLoadPoster()) + player()->setPoster(poster); #if !ENABLE(PLUGIN_PROXY_FOR_VIDEO) - if (renderer() && oldShouldShowPosterImage != m_shouldDisplayPosterImage) + if (renderer() && displayMode() != oldMode) renderer()->updateFromElement(); #endif } +void HTMLVideoElement::updateDisplayState() +{ + if (getNonEmptyURLAttribute(posterAttr).isEmpty()) + setDisplayMode(Video); + else if (displayMode() < Poster) + setDisplayMode(Poster); +} + void HTMLVideoElement::paintCurrentFrameInContext(GraphicsContext* context, const IntRect& destRect) { MediaPlayer* player = HTMLMediaElement::player(); diff --git a/WebCore/html/HTMLVideoElement.h b/WebCore/html/HTMLVideoElement.h index e7c3f34..04a0beb 100644 --- a/WebCore/html/HTMLVideoElement.h +++ b/WebCore/html/HTMLVideoElement.h @@ -55,11 +55,11 @@ public: void webkitEnterFullScreen(bool isUserGesture, ExceptionCode& ec) { webkitEnterFullscreen(isUserGesture, ec); } void webkitExitFullScreen() { webkitExitFullscreen(); } - bool shouldDisplayPosterImage() const { return m_shouldDisplayPosterImage; } - // Used by canvas to gain raw pixel access void paintCurrentFrameInContext(GraphicsContext*, const IntRect&); + bool shouldDisplayPosterImage() const { return displayMode() == Poster; } + private: HTMLVideoElement(const QualifiedName&, Document*); @@ -78,11 +78,14 @@ private: virtual const QualifiedName& imageSourceAttributeName() const; virtual bool hasAvailableVideoFrame() const; - virtual void updatePosterImage(); + virtual void updateDisplayState(); + virtual void willMoveToNewOwnerDocument(); + virtual void setDisplayMode(DisplayMode); + OwnPtr<HTMLImageLoader> m_imageLoader; - bool m_shouldDisplayPosterImage; + }; } //namespace diff --git a/WebCore/html/HTMLViewSourceDocument.cpp b/WebCore/html/HTMLViewSourceDocument.cpp index 6cee27c..e1b959b 100644 --- a/WebCore/html/HTMLViewSourceDocument.cpp +++ b/WebCore/html/HTMLViewSourceDocument.cpp @@ -19,7 +19,7 @@ * 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. + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "config.h" @@ -69,26 +69,26 @@ DocumentParser* HTMLViewSourceDocument::createParser() void HTMLViewSourceDocument::createContainingTable() { RefPtr<HTMLHtmlElement> html = HTMLHtmlElement::create(this); - legacyParserAddChild(html); + parserAddChild(html); html->attach(); RefPtr<HTMLBodyElement> body = HTMLBodyElement::create(this); - html->legacyParserAddChild(body); + html->parserAddChild(body); body->attach(); - + // Create a line gutter div that can be used to make sure the gutter extends down the height of the whole // document. RefPtr<HTMLDivElement> div = HTMLDivElement::create(this); RefPtr<NamedNodeMap> attrs = NamedNodeMap::create(); attrs->addAttribute(Attribute::createMapped(classAttr, "webkit-line-gutter-backdrop")); div->setAttributeMap(attrs.release()); - body->legacyParserAddChild(div); + body->parserAddChild(div); div->attach(); RefPtr<HTMLTableElement> table = HTMLTableElement::create(this); - body->legacyParserAddChild(table); + body->parserAddChild(table); table->attach(); m_tbody = HTMLTableSectionElement::create(tbodyTag, this); - table->legacyParserAddChild(m_tbody); + table->parserAddChild(m_tbody); m_tbody->attach(); m_current = m_tbody; } @@ -137,7 +137,7 @@ void HTMLViewSourceDocument::addViewSourceToken(Token* token) if (guide->at(i) == 'a' || guide->at(i) == 'x' || guide->at(i) == 'v') { // Add in the string. addText(String(static_cast<UChar*>(guide->data()) + begin, i - begin), classNameStr); - + begin = i + 1; if (guide->at(i) == 'a') { @@ -149,7 +149,7 @@ void HTMLViewSourceDocument::addViewSourceToken(Token* token) if (attr) { if (guide->at(i) == 'a') { String name = attr->name().toString(); - + m_current = addSpanWithClassName("webkit-html-attribute-name"); addText(name, "webkit-html-attribute-name"); if (m_current != m_tbody) @@ -179,7 +179,7 @@ void HTMLViewSourceDocument::addViewSourceToken(Token* token) } } } - + // Add in any string that might be left. if (begin < size) addText(String(static_cast<UChar*>(guide->data()) + begin, size - begin), classNameStr); @@ -187,7 +187,7 @@ void HTMLViewSourceDocument::addViewSourceToken(Token* token) // Add in the end tag. addText(">", classNameStr); } - + m_current = m_td; } } @@ -214,7 +214,7 @@ PassRefPtr<Element> HTMLViewSourceDocument::addSpanWithClassName(const String& c RefPtr<NamedNodeMap> attrs = NamedNodeMap::create(); attrs->addAttribute(Attribute::createMapped(classAttr, className)); span->setAttributeMap(attrs.release()); - m_current->legacyParserAddChild(span); + m_current->parserAddChild(span); span->attach(); return span.release(); } @@ -223,15 +223,15 @@ void HTMLViewSourceDocument::addLine(const String& className) { // Create a table row. RefPtr<HTMLTableRowElement> trow = HTMLTableRowElement::create(this); - m_tbody->legacyParserAddChild(trow); + m_tbody->parserAddChild(trow); trow->attach(); - + // Create a cell that will hold the line number (it is generated in the stylesheet using counters). RefPtr<HTMLTableCellElement> td = HTMLTableCellElement::create(tdTag, this); RefPtr<NamedNodeMap> attrs = NamedNodeMap::create(); attrs->addAttribute(Attribute::createMapped(classAttr, "webkit-line-number")); td->setAttributeMap(attrs.release()); - trow->legacyParserAddChild(td); + trow->parserAddChild(td); td->attach(); // Create a second cell for the line contents @@ -239,7 +239,7 @@ void HTMLViewSourceDocument::addLine(const String& className) attrs = NamedNodeMap::create(); attrs->addAttribute(Attribute::createMapped(classAttr, "webkit-line-content")); td->setAttributeMap(attrs.release()); - trow->legacyParserAddChild(td); + trow->parserAddChild(td); td->attach(); m_current = m_td = td; @@ -276,12 +276,12 @@ void HTMLViewSourceDocument::addText(const String& text, const String& className if (m_current == m_tbody) addLine(className); RefPtr<Text> t = Text::create(this, substring); - m_current->legacyParserAddChild(t); + m_current->parserAddChild(t); t->attach(); if (i < size - 1) m_current = m_tbody; } - + // Set current to m_tbody if the last character was a newline. if (text[text.length() - 1] == '\n') m_current = m_tbody; @@ -291,7 +291,7 @@ PassRefPtr<Element> HTMLViewSourceDocument::addLink(const String& url, bool isAn { if (m_current == m_tbody) addLine("webkit-html-tag"); - + // Now create a link for the attribute value instead of a span. RefPtr<HTMLAnchorElement> anchor = HTMLAnchorElement::create(this); RefPtr<NamedNodeMap> attrs = NamedNodeMap::create(); @@ -304,7 +304,7 @@ PassRefPtr<Element> HTMLViewSourceDocument::addLink(const String& url, bool isAn attrs->addAttribute(Attribute::createMapped(targetAttr, "_blank")); attrs->addAttribute(Attribute::createMapped(hrefAttr, url)); anchor->setAttributeMap(attrs.release()); - m_current->legacyParserAddChild(anchor); + m_current->parserAddChild(anchor); anchor->attach(); return anchor.release(); } diff --git a/WebCore/html/LegacyHTMLDocumentParser.cpp b/WebCore/html/LegacyHTMLDocumentParser.cpp index cb5fac8..980d6ed 100644 --- a/WebCore/html/LegacyHTMLDocumentParser.cpp +++ b/WebCore/html/LegacyHTMLDocumentParser.cpp @@ -346,7 +346,7 @@ LegacyHTMLDocumentParser::State LegacyHTMLDocumentParser::parseNonHTMLText(Segme if (state.inScript()) state = scriptHandler(state); else { - state = processListing(SegmentedString(m_scriptCode, m_scriptCodeSize), state); + state = processListing(SegmentedString(String(m_scriptCode, m_scriptCodeSize)), state); processToken(); if (state.inStyle()) { m_currentToken.tagName = styleTag.localName(); @@ -451,7 +451,7 @@ LegacyHTMLDocumentParser::State LegacyHTMLDocumentParser::scriptHandler(State st } } - state = processListing(SegmentedString(m_scriptCode, m_scriptCodeSize), state); + state = processListing(SegmentedString(String(m_scriptCode, m_scriptCodeSize)), state); RefPtr<Node> node = processToken(); if (node && m_scriptingPermission == FragmentScriptingNotAllowed) { @@ -625,7 +625,7 @@ LegacyHTMLDocumentParser::State LegacyHTMLDocumentParser::parseComment(Segmented m_scriptCode[m_scriptCodeSize + 1] = 0; m_currentToken.tagName = commentAtom; m_currentToken.beginTag = true; - state = processListing(SegmentedString(m_scriptCode, m_scriptCodeSize - endCharsCount), state); + state = processListing(SegmentedString(String(m_scriptCode, m_scriptCodeSize - endCharsCount)), state); processToken(); m_currentToken.tagName = commentAtom; m_currentToken.beginTag = false; diff --git a/WebCore/html/StepRange.h b/WebCore/html/StepRange.h index 2f5013a..ce044ea 100644 --- a/WebCore/html/StepRange.h +++ b/WebCore/html/StepRange.h @@ -21,12 +21,12 @@ #ifndef StepRange_h #define StepRange_h +#include <wtf/Forward.h> #include <wtf/Noncopyable.h> namespace WebCore { class HTMLInputElement; -class String; class StepRange : public Noncopyable { public: diff --git a/WebCore/html/ValidityState.cpp b/WebCore/html/ValidityState.cpp index 6a159e8..e286b64 100644 --- a/WebCore/html/ValidityState.cpp +++ b/WebCore/html/ValidityState.cpp @@ -66,6 +66,12 @@ String ValidityState::validationMessage() const return String(); } +void ValidityState::setCustomErrorMessage(const String& message) +{ + m_customErrorMessage = message; + m_control->setNeedsValidityCheck(); +} + bool ValidityState::typeMismatch() const { if (!m_control->hasTagName(inputTag)) diff --git a/WebCore/html/ValidityState.h b/WebCore/html/ValidityState.h index 78238f1..04f11a1 100644 --- a/WebCore/html/ValidityState.h +++ b/WebCore/html/ValidityState.h @@ -41,7 +41,7 @@ public: String validationMessage() const; - void setCustomErrorMessage(const String& message) { m_customErrorMessage = message; } + void setCustomErrorMessage(const String&); bool valueMissing() const { return m_control->valueMissing(); } bool typeMismatch() const; diff --git a/WebCore/html/canvas/ArrayBuffer.cpp b/WebCore/html/canvas/ArrayBuffer.cpp index 0ba2ffd..3b204ff 100644 --- a/WebCore/html/canvas/ArrayBuffer.cpp +++ b/WebCore/html/canvas/ArrayBuffer.cpp @@ -53,26 +53,32 @@ PassRefPtr<ArrayBuffer> ArrayBuffer::create(ArrayBuffer* other) ArrayBuffer::ArrayBuffer(void* data, unsigned sizeInBytes) : m_sizeInBytes(sizeInBytes) - , m_data(data) { + , m_data(data) +{ } -void* ArrayBuffer::data() { +void* ArrayBuffer::data() +{ return m_data; } -const void* ArrayBuffer::data() const { +const void* ArrayBuffer::data() const +{ return m_data; } -unsigned ArrayBuffer::byteLength() const { +unsigned ArrayBuffer::byteLength() const +{ return m_sizeInBytes; } -ArrayBuffer::~ArrayBuffer() { +ArrayBuffer::~ArrayBuffer() +{ WTF::fastFree(m_data); } -void* ArrayBuffer::tryAllocate(unsigned numElements, unsigned elementByteSize) { +void* ArrayBuffer::tryAllocate(unsigned numElements, unsigned elementByteSize) +{ void* result; // Do not allow 32-bit overflow of the total size if (numElements) { diff --git a/WebCore/html/canvas/ArrayBufferView.cpp b/WebCore/html/canvas/ArrayBufferView.cpp index 787fd61..bd22f88 100644 --- a/WebCore/html/canvas/ArrayBufferView.cpp +++ b/WebCore/html/canvas/ArrayBufferView.cpp @@ -28,6 +28,7 @@ #if ENABLE(3D_CANVAS) #include "ArrayBufferView.h" + #include "ArrayBuffer.h" namespace WebCore { @@ -46,9 +47,9 @@ ArrayBufferView::~ArrayBufferView() void ArrayBufferView::setImpl(ArrayBufferView* array, unsigned byteOffset, ExceptionCode& ec) { - if (byteOffset > byteLength() || - byteOffset + array->byteLength() > byteLength() || - byteOffset + array->byteLength() < byteOffset) { + if (byteOffset > byteLength() + || byteOffset + array->byteLength() > byteLength() + || byteOffset + array->byteLength() < byteOffset) { // Out of range offset or overflow ec = INDEX_SIZE_ERR; return; diff --git a/WebCore/html/canvas/ArrayBufferView.h b/WebCore/html/canvas/ArrayBufferView.h index dcf6d13..29ad691 100644 --- a/WebCore/html/canvas/ArrayBufferView.h +++ b/WebCore/html/canvas/ArrayBufferView.h @@ -26,13 +26,14 @@ #ifndef ArrayBufferView_h #define ArrayBufferView_h -#include <algorithm> +#include "ArrayBuffer.h" #include "ExceptionCode.h" + +#include <algorithm> #include <limits.h> #include <wtf/PassRefPtr.h> #include <wtf/RefCounted.h> #include <wtf/RefPtr.h> -#include "ArrayBuffer.h" namespace WebCore { diff --git a/WebCore/html/canvas/CanvasGradient.h b/WebCore/html/canvas/CanvasGradient.h index 0a77652..7550f9b 100644 --- a/WebCore/html/canvas/CanvasGradient.h +++ b/WebCore/html/canvas/CanvasGradient.h @@ -28,13 +28,12 @@ #define CanvasGradient_h #include "Gradient.h" +#include <wtf/Forward.h> #include <wtf/PassRefPtr.h> #include <wtf/RefCounted.h> namespace WebCore { - class String; - typedef int ExceptionCode; class CanvasGradient : public RefCounted<CanvasGradient> { diff --git a/WebCore/html/canvas/CanvasNumberArray.h b/WebCore/html/canvas/CanvasNumberArray.h index eb79866..09714a0 100644 --- a/WebCore/html/canvas/CanvasNumberArray.h +++ b/WebCore/html/canvas/CanvasNumberArray.h @@ -26,6 +26,7 @@ #ifndef CanvasNumberArray_h #define CanvasNumberArray_h +#include <wtf/Forward.h> #include <wtf/PassRefPtr.h> #include <wtf/RefCounted.h> #include <wtf/Vector.h> @@ -33,8 +34,6 @@ namespace WebCore { - class String; - class CanvasNumberArray : public RefCounted<CanvasNumberArray> { public: static PassRefPtr<CanvasNumberArray> create(unsigned length); diff --git a/WebCore/html/canvas/CanvasObject.h b/WebCore/html/canvas/CanvasObject.h deleted file mode 100644 index 6f89f12..0000000 --- a/WebCore/html/canvas/CanvasObject.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (C) 2009 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 COMPUTER, 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 COMPUTER, 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 CanvasObject_h -#define CanvasObject_h - -#include <wtf/PassRefPtr.h> -#include <wtf/RefCounted.h> - -#include "GraphicsContext3D.h" - -namespace WebCore { - - class WebGLRenderingContext; - - class CanvasObject : public RefCounted<CanvasObject> { - public: - virtual ~CanvasObject(); - - Platform3DObject object() const { return m_object; } - void setObject(Platform3DObject, bool shouldDeleteObject = true); - void deleteObject(); - - void detachContext() - { - deleteObject(); - m_context = 0; - } - - WebGLRenderingContext* context() const { return m_context; } - - virtual bool isBuffer() const { return false; } - virtual bool isFramebuffer() const { return false; } - virtual bool isProgram() const { return false; } - virtual bool isRenderbuffer() const { return false; } - virtual bool isShader() const { return false; } - virtual bool isTexture() const { return false; } - - protected: - CanvasObject(WebGLRenderingContext*); - virtual void _deleteObject(Platform3DObject) = 0; - - private: - Platform3DObject m_object; - // The shouldDeleteObject flag indicates whether this wrapper - // owns the underlying resource and should delete it when the - // wrapper is unreferenced for the last time and deleted. It - // is only set to false for certain objects returned from get - // queries. FIXME: should consider canonicalizing all of these - // objects in the future. - bool m_shouldDeleteObject; - WebGLRenderingContext* m_context; - }; - -} // namespace WebCore - -#endif // CanvasObject_h diff --git a/WebCore/html/canvas/CanvasPattern.h b/WebCore/html/canvas/CanvasPattern.h index 6c012d1..91e0794 100644 --- a/WebCore/html/canvas/CanvasPattern.h +++ b/WebCore/html/canvas/CanvasPattern.h @@ -27,13 +27,13 @@ #define CanvasPattern_h #include "Pattern.h" +#include <wtf/Forward.h> #include <wtf/PassRefPtr.h> #include <wtf/RefCounted.h> namespace WebCore { class Image; - class String; typedef int ExceptionCode; diff --git a/WebCore/html/canvas/CanvasRenderingContext.h b/WebCore/html/canvas/CanvasRenderingContext.h index 2ee1693..cb26363 100644 --- a/WebCore/html/canvas/CanvasRenderingContext.h +++ b/WebCore/html/canvas/CanvasRenderingContext.h @@ -30,7 +30,8 @@ namespace WebCore { - class CanvasObject; + class WebGLObject; + class GraphicsContext3D; class HTMLCanvasElement; class CanvasRenderingContext : public Noncopyable { @@ -47,6 +48,12 @@ namespace WebCore { virtual bool is2d() const { return false; } virtual bool is3d() const { return false; } virtual bool isAccelerated() const { return false; } + + // For accelerated canvases, returns a pointer to the underlying GraphicsContext3D. + // For non accelerated canvases returns 0. + virtual GraphicsContext3D* graphicsContext3D() const { return 0; } + + virtual void paintRenderingResultsToCanvas() {} private: HTMLCanvasElement* m_canvas; diff --git a/WebCore/html/canvas/CanvasRenderingContext2D.cpp b/WebCore/html/canvas/CanvasRenderingContext2D.cpp index 3b05348..559ddda 100644 --- a/WebCore/html/canvas/CanvasRenderingContext2D.cpp +++ b/WebCore/html/canvas/CanvasRenderingContext2D.cpp @@ -58,7 +58,13 @@ #include "StrokeStyleApplier.h" #include "TextMetrics.h" -#include <stdio.h> +#if ENABLE(ACCELERATED_2D_CANVAS) +#include "FrameView.h" +#include "GraphicsContext3D.h" +#if USE(ACCELERATED_COMPOSITING) +#include "RenderLayer.h" +#endif +#endif #include <wtf/ByteArray.h> #include <wtf/MathExtras.h> @@ -100,6 +106,9 @@ CanvasRenderingContext2D::CanvasRenderingContext2D(HTMLCanvasElement* canvas, bo #if ENABLE(DASHBOARD_SUPPORT) , m_usesDashboardCompatibilityMode(usesDashboardCompatibilityMode) #endif +#if ENABLE(ACCELERATED_2D_CANVAS) + , m_context3D(0) +#endif { #if !ENABLE(DASHBOARD_SUPPORT) ASSERT_UNUSED(usesDashboardCompatibilityMode, !usesDashboardCompatibilityMode); @@ -108,17 +117,53 @@ CanvasRenderingContext2D::CanvasRenderingContext2D(HTMLCanvasElement* canvas, bo // Make sure that even if the drawingContext() has a different default // thickness, it is in sync with the canvas thickness. setLineWidth(lineWidth()); + +#if ENABLE(ACCELERATED_2D_CANVAS) + Page* p = canvas->document()->page(); + if (!p) + return; + if (!p->settings()->accelerated2dCanvasEnabled()) + return; + if (FrameView* view = canvas->document()->view()) { + if (ScrollView* rootView = view->root()) { + if (HostWindow* hostWindow = view->root()->hostWindow()) { + // Set up our context + GraphicsContext3D::Attributes attr; + attr.stencil = true; + m_context3D = GraphicsContext3D::create(attr, hostWindow); + if (m_context3D) + if (GraphicsContext* c = drawingContext()) + c->setGraphicsContext3D(m_context3D.get(), IntSize(canvas->width(), canvas->height())); + } + } + } +#endif } CanvasRenderingContext2D::~CanvasRenderingContext2D() { } +bool CanvasRenderingContext2D::isAccelerated() const +{ +#if ENABLE(ACCELERATED_2D_CANVAS) + return m_context3D; +#else + return false; +#endif +} + void CanvasRenderingContext2D::reset() { m_stateStack.resize(1); m_stateStack.first() = State(); m_path.clear(); +#if ENABLE(ACCELERATED_2D_CANVAS) + if (m_context3D) { + if (GraphicsContext* c = drawingContext()) + c->setGraphicsContext3D(m_context3D.get(), IntSize(canvas()->width(), canvas()->height())); + } +#endif } CanvasRenderingContext2D::State::State() @@ -511,6 +556,8 @@ void CanvasRenderingContext2D::setStrokeColor(const String& color) void CanvasRenderingContext2D::setStrokeColor(float grayLevel) { + if (state().m_strokeStyle && state().m_strokeStyle->isEquivalentColor(grayLevel, grayLevel, grayLevel, 1.0f)) + return; setStrokeStyle(CanvasStyle::create(grayLevel, 1)); } @@ -521,16 +568,22 @@ void CanvasRenderingContext2D::setStrokeColor(const String& color, float alpha) void CanvasRenderingContext2D::setStrokeColor(float grayLevel, float alpha) { + if (state().m_strokeStyle && state().m_strokeStyle->isEquivalentColor(grayLevel, grayLevel, grayLevel, alpha)) + return; setStrokeStyle(CanvasStyle::create(grayLevel, alpha)); } void CanvasRenderingContext2D::setStrokeColor(float r, float g, float b, float a) { + if (state().m_strokeStyle && state().m_strokeStyle->isEquivalentColor(r, g, b, a)) + return; setStrokeStyle(CanvasStyle::create(r, g, b, a)); } void CanvasRenderingContext2D::setStrokeColor(float c, float m, float y, float k, float a) { + if (state().m_strokeStyle && state().m_strokeStyle->isEquivalentColor(c, m, y, k, a)) + return; setStrokeStyle(CanvasStyle::create(c, m, y, k, a)); } @@ -544,6 +597,8 @@ void CanvasRenderingContext2D::setFillColor(const String& color) void CanvasRenderingContext2D::setFillColor(float grayLevel) { + if (state().m_fillStyle && state().m_fillStyle->isEquivalentColor(grayLevel, grayLevel, grayLevel, 1.0f)) + return; setFillStyle(CanvasStyle::create(grayLevel, 1)); } @@ -554,16 +609,22 @@ void CanvasRenderingContext2D::setFillColor(const String& color, float alpha) void CanvasRenderingContext2D::setFillColor(float grayLevel, float alpha) { + if (state().m_fillStyle && state().m_fillStyle->isEquivalentColor(grayLevel, grayLevel, grayLevel, alpha)) + return; setFillStyle(CanvasStyle::create(grayLevel, alpha)); } void CanvasRenderingContext2D::setFillColor(float r, float g, float b, float a) { + if (state().m_fillStyle && state().m_fillStyle->isEquivalentColor(r, g, b, a)) + return; setFillStyle(CanvasStyle::create(r, g, b, a)); } void CanvasRenderingContext2D::setFillColor(float c, float m, float y, float k, float a) { + if (state().m_fillStyle && state().m_fillStyle->isEquivalentColor(c, m, y, k, a)) + return; setFillStyle(CanvasStyle::create(c, m, y, k, a)); } @@ -1434,7 +1495,14 @@ void CanvasRenderingContext2D::willDraw(const FloatRect& r, unsigned options) // we'd have to keep the clip path around. } - canvas()->willDraw(dirtyRect); +#if ENABLE(ACCELERATED_2D_CANVAS) && USE(ACCELERATED_COMPOSITING) + // If we are drawing to hardware and we have a composited layer, just call rendererContentChanged(). + RenderBox* renderBox = canvas()->renderBox(); + if (m_context3D && renderBox && renderBox->hasLayer() && renderBox->layer()->hasAcceleratedCompositing()) + renderBox->layer()->rendererContentChanged(); + else +#endif + canvas()->willDraw(dirtyRect); } GraphicsContext* CanvasRenderingContext2D::drawingContext() const @@ -1772,4 +1840,11 @@ const Font& CanvasRenderingContext2D::accessFont() return state().m_font; } +void CanvasRenderingContext2D::paintRenderingResultsToCanvas() +{ +#if ENABLE(ACCELERATED_2D_CANVAS) + drawingContext()->syncSoftwareCanvas(); +#endif +} + } // namespace WebCore diff --git a/WebCore/html/canvas/CanvasRenderingContext2D.h b/WebCore/html/canvas/CanvasRenderingContext2D.h index 22ed7fc..f610250 100644 --- a/WebCore/html/canvas/CanvasRenderingContext2D.h +++ b/WebCore/html/canvas/CanvasRenderingContext2D.h @@ -42,6 +42,10 @@ #include <ApplicationServices/ApplicationServices.h> #endif +#if USE(ACCELERATED_COMPOSITING) +#include "GraphicsLayer.h" +#endif + namespace WebCore { class CanvasGradient; @@ -56,6 +60,10 @@ class ImageData; class KURL; class TextMetrics; +#if ENABLE(ACCELERATED_2D_CANVAS) +class GraphicsContext3D; +#endif + typedef int ExceptionCode; class CanvasRenderingContext2D : public CanvasRenderingContext { @@ -65,6 +73,7 @@ public: virtual ~CanvasRenderingContext2D(); virtual bool is2d() const { return true; } + virtual bool isAccelerated() const; CanvasStyle* strokeStyle() const; void setStrokeStyle(PassRefPtr<CanvasStyle>); @@ -212,6 +221,12 @@ public: LineCap getLineCap() const { return state().m_lineCap; } LineJoin getLineJoin() const { return state().m_lineJoin; } + virtual void paintRenderingResultsToCanvas(); + +#if ENABLE(ACCELERATED_2D_CANVAS) + virtual GraphicsContext3D* graphicsContext3D() const { return m_context3D.get(); } +#endif + private: struct State { State(); @@ -281,6 +296,10 @@ private: #if ENABLE(DASHBOARD_SUPPORT) bool m_usesDashboardCompatibilityMode; #endif + +#if ENABLE(ACCELERATED_2D_CANVAS) + OwnPtr<GraphicsContext3D> m_context3D; +#endif }; } // namespace WebCore diff --git a/WebCore/html/canvas/CanvasStyle.cpp b/WebCore/html/canvas/CanvasStyle.cpp index 1ae5236..52b31c8 100644 --- a/WebCore/html/canvas/CanvasStyle.cpp +++ b/WebCore/html/canvas/CanvasStyle.cpp @@ -144,6 +144,26 @@ bool CanvasStyle::isEquivalentColor(const CanvasStyle& other) const return false; } +bool CanvasStyle::isEquivalentColor(float r, float g, float b, float a) const +{ + if (m_type != RGBA) + return false; + + return m_rgba == makeRGBA32FromFloats(r, g, b, a); +} + +bool CanvasStyle::isEquivalentColor(float c, float m, float y, float k, float a) const +{ + if (m_type != CMYKA) + return false; + + return c == m_cmyka.c + && m == m_cmyka.m + && y == m_cmyka.y + && k == m_cmyka.k + && a == m_cmyka.a; +} + void CanvasStyle::applyStrokeColor(GraphicsContext* context) { if (!context) diff --git a/WebCore/html/canvas/CanvasStyle.h b/WebCore/html/canvas/CanvasStyle.h index 76ba6ef..8e47e63 100644 --- a/WebCore/html/canvas/CanvasStyle.h +++ b/WebCore/html/canvas/CanvasStyle.h @@ -56,6 +56,8 @@ namespace WebCore { void applyStrokeColor(GraphicsContext*); bool isEquivalentColor(const CanvasStyle&) const; + bool isEquivalentColor(float r, float g, float b, float a) const; + bool isEquivalentColor(float c, float m, float y, float k, float a) const; private: CanvasStyle(RGBA32 rgba); diff --git a/WebCore/html/canvas/TypedArrayBase.h b/WebCore/html/canvas/TypedArrayBase.h index a8bebd9..c55896b 100644 --- a/WebCore/html/canvas/TypedArrayBase.h +++ b/WebCore/html/canvas/TypedArrayBase.h @@ -27,8 +27,8 @@ #ifndef TypedArrayBase_h #define TypedArrayBase_h -#include "ArrayBufferView.h" #include "ArrayBuffer.h" +#include "ArrayBufferView.h" namespace WebCore { diff --git a/WebCore/html/canvas/WebGLBuffer.cpp b/WebCore/html/canvas/WebGLBuffer.cpp index e449052..fc98a9d 100644 --- a/WebCore/html/canvas/WebGLBuffer.cpp +++ b/WebCore/html/canvas/WebGLBuffer.cpp @@ -28,6 +28,8 @@ #if ENABLE(3D_CANVAS) #include "WebGLBuffer.h" + +#include "CheckedInt.h" #include "WebGLRenderingContext.h" namespace WebCore { @@ -38,7 +40,7 @@ PassRefPtr<WebGLBuffer> WebGLBuffer::create(WebGLRenderingContext* ctx) } WebGLBuffer::WebGLBuffer(WebGLRenderingContext* ctx) - : CanvasObject(ctx) + : WebGLObject(ctx) , m_target(0) , m_byteLength(0) , m_nextAvailableCacheEntry(0) @@ -47,153 +49,116 @@ WebGLBuffer::WebGLBuffer(WebGLRenderingContext* ctx) clearCachedMaxIndices(); } -void WebGLBuffer::_deleteObject(Platform3DObject object) +void WebGLBuffer::deleteObjectImpl(Platform3DObject object) { context()->graphicsContext3D()->deleteBuffer(object); } -bool WebGLBuffer::associateBufferData(int size) +bool WebGLBuffer::associateBufferDataImpl(ArrayBuffer* array, unsigned byteOffset, unsigned byteLength) { - if (!m_target) - return false; + if (array && byteLength) { + CheckedInt<uint32_t> checkedOffset(byteOffset); + CheckedInt<uint32_t> checkedLength(byteLength); + CheckedInt<uint32_t> checkedMax = checkedOffset + checkedLength; + if (!checkedMax.valid() || checkedMax.value() > array->byteLength()) + return false; + } - if (m_target == GraphicsContext3D::ELEMENT_ARRAY_BUFFER) { - m_byteLength = size; + switch (m_target) { + case GraphicsContext3D::ELEMENT_ARRAY_BUFFER: + m_byteLength = byteLength; clearCachedMaxIndices(); - m_elementArrayBuffer = ArrayBuffer::create(size, 1); - if (!m_elementArrayBuffer) { - m_byteLength = 0; - return false; - } + if (byteLength) { + m_elementArrayBuffer = ArrayBuffer::create(byteLength, 1); + if (!m_elementArrayBuffer) { + m_byteLength = 0; + return false; + } + if (array) { + // We must always clone the incoming data because client-side + // modifications without calling bufferData or bufferSubData + // must never be able to change the validation results. + memcpy(static_cast<unsigned char*>(m_elementArrayBuffer->data()), + static_cast<unsigned char*>(array->data()) + byteOffset, + byteLength); + } + } else + m_elementArrayBuffer = 0; return true; - } else if (m_target == GraphicsContext3D::ARRAY_BUFFER) { - m_byteLength = size; + case GraphicsContext3D::ARRAY_BUFFER: + m_byteLength = byteLength; return true; + default: + return false; } +} - return false; +bool WebGLBuffer::associateBufferData(int size) +{ + if (size < 0) + return false; + return associateBufferDataImpl(0, 0, static_cast<unsigned>(size)); } bool WebGLBuffer::associateBufferData(ArrayBuffer* array) { - if (!m_target) - return false; if (!array) return false; - - if (m_target == GraphicsContext3D::ELEMENT_ARRAY_BUFFER) { - clearCachedMaxIndices(); - m_byteLength = array->byteLength(); - // We must always clone the incoming data because client-side - // modifications without calling bufferData or bufferSubData - // must never be able to change the validation results. - m_elementArrayBuffer = ArrayBuffer::create(array); - if (!m_elementArrayBuffer) { - m_byteLength = 0; - return false; - } - return true; - } - - if (m_target == GraphicsContext3D::ARRAY_BUFFER) { - m_byteLength = array->byteLength(); - return true; - } - - return false; + return associateBufferDataImpl(array, 0, array->byteLength()); } bool WebGLBuffer::associateBufferData(ArrayBufferView* array) { - if (!m_target) - return false; if (!array) return false; + return associateBufferDataImpl(array->buffer().get(), array->byteOffset(), array->byteLength()); +} - if (m_target == GraphicsContext3D::ELEMENT_ARRAY_BUFFER) { - clearCachedMaxIndices(); - m_byteLength = array->byteLength(); - // We must always clone the incoming data because client-side - // modifications without calling bufferData or bufferSubData - // must never be able to change the validation results. - m_elementArrayBuffer = ArrayBuffer::create(array->buffer().get()); - if (!m_elementArrayBuffer) { - m_byteLength = 0; +bool WebGLBuffer::associateBufferSubDataImpl(long offset, ArrayBuffer* array, unsigned arrayByteOffset, unsigned byteLength) +{ + if (!array || offset < 0) + return false; + + if (byteLength) { + CheckedInt<uint32_t> checkedBufferOffset(offset); + CheckedInt<uint32_t> checkedArrayOffset(arrayByteOffset); + CheckedInt<uint32_t> checkedLength(byteLength); + CheckedInt<uint32_t> checkedArrayMax = checkedArrayOffset + checkedLength; + CheckedInt<uint32_t> checkedBufferMax = checkedBufferOffset + checkedLength; + if (!checkedArrayMax.valid() || checkedArrayMax.value() > array->byteLength() || !checkedBufferMax.valid() || checkedBufferMax.value() > m_byteLength) return false; - } - return true; } - if (m_target == GraphicsContext3D::ARRAY_BUFFER) { - m_byteLength = array->byteLength(); + switch (m_target) { + case GraphicsContext3D::ELEMENT_ARRAY_BUFFER: + clearCachedMaxIndices(); + if (byteLength) { + if (!m_elementArrayBuffer) + return false; + memcpy(static_cast<unsigned char*>(m_elementArrayBuffer->data()) + offset, + static_cast<unsigned char*>(array->data()) + arrayByteOffset, + byteLength); + } return true; + case GraphicsContext3D::ARRAY_BUFFER: + return true; + default: + return false; } - - return false; } bool WebGLBuffer::associateBufferSubData(long offset, ArrayBuffer* array) { - if (!m_target) - return false; if (!array) return false; - - if (m_target == GraphicsContext3D::ELEMENT_ARRAY_BUFFER) { - clearCachedMaxIndices(); - - // We need to protect against integer overflow with these tests - if (offset < 0) - return false; - - unsigned long uoffset = static_cast<unsigned long>(offset); - if (uoffset > m_byteLength || array->byteLength() > m_byteLength - uoffset) - return false; - - if (!m_elementArrayBuffer) - return false; - - memcpy(static_cast<unsigned char*>(m_elementArrayBuffer->data()) + offset, - static_cast<unsigned char*>(array->data()), - array->byteLength()); - return true; - } - - if (m_target == GraphicsContext3D::ARRAY_BUFFER) - return array->byteLength() + offset <= m_byteLength; - - return false; + return associateBufferSubDataImpl(offset, array, 0, array->byteLength()); } bool WebGLBuffer::associateBufferSubData(long offset, ArrayBufferView* array) { - if (!m_target) - return false; if (!array) return false; - - if (m_target == GraphicsContext3D::ELEMENT_ARRAY_BUFFER) { - clearCachedMaxIndices(); - - // We need to protect against integer overflow with these tests - if (offset < 0) - return false; - - unsigned long uoffset = static_cast<unsigned long>(offset); - if (uoffset > m_byteLength || array->byteLength() > m_byteLength - uoffset) - return false; - - if (!m_elementArrayBuffer) - return false; - - memcpy(static_cast<unsigned char*>(m_elementArrayBuffer->data()) + offset, array->baseAddress(), array->byteLength()); - return true; - } - - if (m_target == GraphicsContext3D::ARRAY_BUFFER) - return array->byteLength() + offset <= m_byteLength; - - return false; + return associateBufferSubDataImpl(offset, array->buffer().get(), array->byteOffset(), array->byteLength()); } unsigned WebGLBuffer::byteLength() const diff --git a/WebCore/html/canvas/WebGLBuffer.h b/WebCore/html/canvas/WebGLBuffer.h index 1280cf9..a7a25b9 100644 --- a/WebCore/html/canvas/WebGLBuffer.h +++ b/WebCore/html/canvas/WebGLBuffer.h @@ -26,72 +26,77 @@ #ifndef WebGLBuffer_h #define WebGLBuffer_h -#include "CanvasObject.h" #include "ArrayBuffer.h" +#include "WebGLObject.h" #include <wtf/PassRefPtr.h> #include <wtf/RefCounted.h> namespace WebCore { - - class WebGLBuffer : public CanvasObject { - public: - virtual ~WebGLBuffer() { deleteObject(); } - - static PassRefPtr<WebGLBuffer> create(WebGLRenderingContext*); - - bool associateBufferData(int size); - bool associateBufferData(ArrayBuffer* array); - bool associateBufferData(ArrayBufferView* array); - bool associateBufferSubData(long offset, ArrayBuffer* array); - bool associateBufferSubData(long offset, ArrayBufferView* array); - - unsigned byteLength() const; - const ArrayBuffer* elementArrayBuffer() const { return m_elementArrayBuffer.get(); } - - // Gets the cached max index for the given type. Returns -1 if - // none has been set. - long getCachedMaxIndex(unsigned long type); - // Sets the cached max index for the given type. - void setCachedMaxIndex(unsigned long type, long value); - - unsigned long getTarget() const { return m_target; } - void setTarget(unsigned long); - - protected: - WebGLBuffer(WebGLRenderingContext*); - - virtual void _deleteObject(Platform3DObject o); - - private: - virtual bool isBuffer() const { return true; } - - unsigned long m_target; - - RefPtr<ArrayBuffer> m_elementArrayBuffer; - unsigned m_byteLength; - - // Optimization for index validation. For each type of index - // (i.e., UNSIGNED_SHORT), cache the maximum index in the - // entire buffer. - // - // This is sufficient to eliminate a lot of work upon each - // draw call as long as all bound array buffers are at least - // that size. - struct MaxIndexCacheEntry { - unsigned long type; - long maxIndex; - }; - // OpenGL ES 2.0 only has two valid index types (UNSIGNED_BYTE - // and UNSIGNED_SHORT), but might as well leave open the - // possibility of adding others. - MaxIndexCacheEntry m_maxIndexCache[4]; - unsigned m_nextAvailableCacheEntry; - - // Clears all of the cached max indices. - void clearCachedMaxIndices(); + +class WebGLBuffer : public WebGLObject { +public: + virtual ~WebGLBuffer() { deleteObject(); } + + static PassRefPtr<WebGLBuffer> create(WebGLRenderingContext*); + + bool associateBufferData(int size); + bool associateBufferData(ArrayBuffer* array); + bool associateBufferData(ArrayBufferView* array); + bool associateBufferSubData(long offset, ArrayBuffer* array); + bool associateBufferSubData(long offset, ArrayBufferView* array); + + unsigned byteLength() const; + const ArrayBuffer* elementArrayBuffer() const { return m_elementArrayBuffer.get(); } + + // Gets the cached max index for the given type. Returns -1 if + // none has been set. + long getCachedMaxIndex(unsigned long type); + // Sets the cached max index for the given type. + void setCachedMaxIndex(unsigned long type, long value); + + unsigned long getTarget() const { return m_target; } + void setTarget(unsigned long); + +protected: + WebGLBuffer(WebGLRenderingContext*); + + virtual void deleteObjectImpl(Platform3DObject o); + +private: + virtual bool isBuffer() const { return true; } + + unsigned long m_target; + + RefPtr<ArrayBuffer> m_elementArrayBuffer; + unsigned m_byteLength; + + // Optimization for index validation. For each type of index + // (i.e., UNSIGNED_SHORT), cache the maximum index in the + // entire buffer. + // + // This is sufficient to eliminate a lot of work upon each + // draw call as long as all bound array buffers are at least + // that size. + struct MaxIndexCacheEntry { + unsigned long type; + long maxIndex; }; - + // OpenGL ES 2.0 only has two valid index types (UNSIGNED_BYTE + // and UNSIGNED_SHORT), but might as well leave open the + // possibility of adding others. + MaxIndexCacheEntry m_maxIndexCache[4]; + unsigned m_nextAvailableCacheEntry; + + // Clears all of the cached max indices. + void clearCachedMaxIndices(); + + // Helper function called by the three associateBufferData(). + bool associateBufferDataImpl(ArrayBuffer* array, unsigned byteOffset, unsigned byteLength); + // Helper function called by the two associateBufferSubData(). + bool associateBufferSubDataImpl(long offset, ArrayBuffer* array, unsigned arrayByteOffset, unsigned byteLength); +}; + } // namespace WebCore #endif // WebGLBuffer_h diff --git a/WebCore/html/canvas/WebGLFramebuffer.cpp b/WebCore/html/canvas/WebGLFramebuffer.cpp index a3d4681..bfa08b7 100644 --- a/WebCore/html/canvas/WebGLFramebuffer.cpp +++ b/WebCore/html/canvas/WebGLFramebuffer.cpp @@ -28,6 +28,7 @@ #if ENABLE(3D_CANVAS) #include "WebGLFramebuffer.h" + #include "WebGLRenderingContext.h" namespace WebCore { @@ -38,7 +39,7 @@ PassRefPtr<WebGLFramebuffer> WebGLFramebuffer::create(WebGLRenderingContext* ctx } WebGLFramebuffer::WebGLFramebuffer(WebGLRenderingContext* ctx) - : CanvasObject(ctx) + : WebGLObject(ctx) , m_colorAttachment(0) , m_depthAttachment(0) , m_stencilAttachment(0) @@ -47,7 +48,7 @@ WebGLFramebuffer::WebGLFramebuffer(WebGLRenderingContext* ctx) setObject(context()->graphicsContext3D()->createFramebuffer()); } -void WebGLFramebuffer::setAttachment(unsigned long attachment, CanvasObject* attachedObject) +void WebGLFramebuffer::setAttachment(unsigned long attachment, WebGLObject* attachedObject) { if (!object()) return; @@ -77,10 +78,10 @@ void WebGLFramebuffer::onBind() initializeRenderbuffers(); } -void WebGLFramebuffer::onAttachedObjectChange(CanvasObject* object) +void WebGLFramebuffer::onAttachedObjectChange(WebGLObject* object) { // Currently object == 0 is not considered, but this might change if the - // lifespan of CanvasObject changes. + // lifespan of WebGLObject changes. if (object && (object == m_colorAttachment || object == m_depthAttachment || object == m_stencilAttachment || object == m_depthStencilAttachment)) @@ -105,12 +106,12 @@ unsigned long WebGLFramebuffer::getColorBufferFormat() return 0; } -void WebGLFramebuffer::_deleteObject(Platform3DObject object) +void WebGLFramebuffer::deleteObjectImpl(Platform3DObject object) { context()->graphicsContext3D()->deleteFramebuffer(object); } -bool WebGLFramebuffer::isUninitialized(CanvasObject* attachedObject) +bool WebGLFramebuffer::isUninitialized(WebGLObject* attachedObject) { if (attachedObject && attachedObject->object() && attachedObject->isRenderbuffer() && !(reinterpret_cast<WebGLRenderbuffer*>(attachedObject))->isInitialized()) @@ -118,7 +119,7 @@ bool WebGLFramebuffer::isUninitialized(CanvasObject* attachedObject) return false; } -void WebGLFramebuffer::setInitialized(CanvasObject* attachedObject) +void WebGLFramebuffer::setInitialized(WebGLObject* attachedObject) { if (attachedObject && attachedObject->object() && attachedObject->isRenderbuffer()) (reinterpret_cast<WebGLRenderbuffer*>(attachedObject))->setInitialized(); diff --git a/WebCore/html/canvas/WebGLFramebuffer.h b/WebCore/html/canvas/WebGLFramebuffer.h index ae1f4dc..ac945dd 100644 --- a/WebCore/html/canvas/WebGLFramebuffer.h +++ b/WebCore/html/canvas/WebGLFramebuffer.h @@ -26,59 +26,59 @@ #ifndef WebGLFramebuffer_h #define WebGLFramebuffer_h -#include "CanvasObject.h" +#include "WebGLObject.h" #include <wtf/PassRefPtr.h> #include <wtf/RefCounted.h> namespace WebCore { - class WebGLFramebuffer : public CanvasObject { - public: - virtual ~WebGLFramebuffer() { deleteObject(); } - - static PassRefPtr<WebGLFramebuffer> create(WebGLRenderingContext*); - - bool isDepthAttached() const { return (m_depthAttachment && m_depthAttachment->object()); } - bool isStencilAttached() const { return (m_stencilAttachment && m_stencilAttachment->object()); } - bool isDepthStencilAttached() const { return (m_depthStencilAttachment && m_depthStencilAttachment->object()); } - - void setAttachment(unsigned long, CanvasObject*); - - // This function is called right after a framebuffer is bound. - // Because renderbuffers and textures attached to the framebuffer might - // have changed and the framebuffer might have become complete when it - // isn't bound, so we need to clear un-initialized renderbuffers. - void onBind(); - - // When a texture or a renderbuffer changes, we need to check the - // current bound framebuffer; if the newly changed object is attached - // to the framebuffer and the framebuffer becomes complete, we need to - // clear un-initialized renderbuffers. - void onAttachedObjectChange(CanvasObject*); - - unsigned long getColorBufferFormat(); - - protected: - WebGLFramebuffer(WebGLRenderingContext*); - - virtual void _deleteObject(Platform3DObject); - - private: - virtual bool isFramebuffer() const { return true; } - - bool isUninitialized(CanvasObject*); - void setInitialized(CanvasObject*); - void initializeRenderbuffers(); - - // These objects are kept alive by the global table in - // WebGLRenderingContext. - CanvasObject* m_colorAttachment; - CanvasObject* m_depthAttachment; - CanvasObject* m_stencilAttachment; - CanvasObject* m_depthStencilAttachment; - }; - +class WebGLFramebuffer : public WebGLObject { +public: + virtual ~WebGLFramebuffer() { deleteObject(); } + + static PassRefPtr<WebGLFramebuffer> create(WebGLRenderingContext*); + + bool isDepthAttached() const { return (m_depthAttachment && m_depthAttachment->object()); } + bool isStencilAttached() const { return (m_stencilAttachment && m_stencilAttachment->object()); } + bool isDepthStencilAttached() const { return (m_depthStencilAttachment && m_depthStencilAttachment->object()); } + + void setAttachment(unsigned long, WebGLObject*); + + // This function is called right after a framebuffer is bound. + // Because renderbuffers and textures attached to the framebuffer might + // have changed and the framebuffer might have become complete when it + // isn't bound, so we need to clear un-initialized renderbuffers. + void onBind(); + + // When a texture or a renderbuffer changes, we need to check the + // current bound framebuffer; if the newly changed object is attached + // to the framebuffer and the framebuffer becomes complete, we need to + // clear un-initialized renderbuffers. + void onAttachedObjectChange(WebGLObject*); + + unsigned long getColorBufferFormat(); + +protected: + WebGLFramebuffer(WebGLRenderingContext*); + + virtual void deleteObjectImpl(Platform3DObject); + +private: + virtual bool isFramebuffer() const { return true; } + + bool isUninitialized(WebGLObject*); + void setInitialized(WebGLObject*); + void initializeRenderbuffers(); + + // These objects are kept alive by the global table in + // WebGLRenderingContext. + WebGLObject* m_colorAttachment; + WebGLObject* m_depthAttachment; + WebGLObject* m_stencilAttachment; + WebGLObject* m_depthStencilAttachment; +}; + } // namespace WebCore #endif // WebGLFramebuffer_h diff --git a/WebCore/html/canvas/WebGLGetInfo.cpp b/WebCore/html/canvas/WebGLGetInfo.cpp index 0c8b548..6aff82f 100644 --- a/WebCore/html/canvas/WebGLGetInfo.cpp +++ b/WebCore/html/canvas/WebGLGetInfo.cpp @@ -29,14 +29,15 @@ #if ENABLE(3D_CANVAS) #include "WebGLGetInfo.h" -#include "WebGLBuffer.h" + #include "Float32Array.h" -#include "WebGLFramebuffer.h" #include "Int32Array.h" +#include "Uint8Array.h" +#include "WebGLBuffer.h" +#include "WebGLFramebuffer.h" #include "WebGLProgram.h" #include "WebGLRenderbuffer.h" #include "WebGLTexture.h" -#include "Uint8Array.h" namespace WebCore { diff --git a/WebCore/html/canvas/WebGLGetInfo.h b/WebCore/html/canvas/WebGLGetInfo.h index 94f6f9b..caee520 100644 --- a/WebCore/html/canvas/WebGLGetInfo.h +++ b/WebCore/html/canvas/WebGLGetInfo.h @@ -27,20 +27,18 @@ #ifndef WebGLGetInfo_h #define WebGLGetInfo_h -#include "wtf/PassRefPtr.h" -#include "wtf/RefPtr.h" +#include "Float32Array.h" +#include "Int32Array.h" #include "PlatformString.h" - +#include "Uint8Array.h" #include "WebGLBuffer.h" -#include "Float32Array.h" #include "WebGLFramebuffer.h" -#include "Int32Array.h" -// FIXME: implement WebGLObjectArray -//#include "WebGLObjectArray.h" #include "WebGLProgram.h" #include "WebGLRenderbuffer.h" #include "WebGLTexture.h" -#include "Uint8Array.h" + +#include <wtf/PassRefPtr.h> +#include <wtf/RefPtr.h> namespace WebCore { @@ -74,7 +72,7 @@ public: WebGLGetInfo(const bool* value, int size); WebGLGetInfo(float value); WebGLGetInfo(long value); - // Represents the NULL value and type + // Represents the null value and type. WebGLGetInfo(); WebGLGetInfo(const String& value); WebGLGetInfo(unsigned long value); @@ -132,4 +130,4 @@ private: } // namespace WebCore -#endif // WebGLGetInfo_h +#endif // WebGLGetInfo_h diff --git a/WebCore/html/canvas/CanvasObject.cpp b/WebCore/html/canvas/WebGLObject.cpp index 6c7667b..6a34269 100644 --- a/WebCore/html/canvas/CanvasObject.cpp +++ b/WebCore/html/canvas/WebGLObject.cpp @@ -27,25 +27,26 @@ #if ENABLE(3D_CANVAS) -#include "CanvasObject.h" +#include "WebGLObject.h" + #include "WebGLRenderingContext.h" namespace WebCore { -CanvasObject::CanvasObject(WebGLRenderingContext* context) +WebGLObject::WebGLObject(WebGLRenderingContext* context) : m_object(0) , m_shouldDeleteObject(true) , m_context(context) { } -CanvasObject::~CanvasObject() +WebGLObject::~WebGLObject() { if (m_context) m_context->removeObject(this); } -void CanvasObject::setObject(Platform3DObject object, bool shouldDeleteObject) +void WebGLObject::setObject(Platform3DObject object, bool shouldDeleteObject) { if (object == m_object) return; @@ -55,13 +56,13 @@ void CanvasObject::setObject(Platform3DObject object, bool shouldDeleteObject) m_shouldDeleteObject = shouldDeleteObject; } -void CanvasObject::deleteObject() +void WebGLObject::deleteObject() { if (m_object) { if (m_shouldDeleteObject) if (m_context) { m_context->graphicsContext3D()->makeContextCurrent(); - _deleteObject(m_object); + deleteObjectImpl(m_object); } m_object = 0; } diff --git a/WebCore/html/canvas/WebGLObject.h b/WebCore/html/canvas/WebGLObject.h new file mode 100644 index 0000000..b66311f --- /dev/null +++ b/WebCore/html/canvas/WebGLObject.h @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2009 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 COMPUTER, 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 COMPUTER, 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 WebGLObject_h +#define WebGLObject_h + +#include "GraphicsContext3D.h" + +#include <wtf/PassRefPtr.h> +#include <wtf/RefCounted.h> + +namespace WebCore { + +class WebGLRenderingContext; + +class WebGLObject : public RefCounted<WebGLObject> { +public: + virtual ~WebGLObject(); + + Platform3DObject object() const { return m_object; } + void setObject(Platform3DObject, bool shouldDeleteObject = true); + void deleteObject(); + + void detachContext() + { + deleteObject(); + m_context = 0; + } + + WebGLRenderingContext* context() const { return m_context; } + + virtual bool isBuffer() const { return false; } + virtual bool isFramebuffer() const { return false; } + virtual bool isProgram() const { return false; } + virtual bool isRenderbuffer() const { return false; } + virtual bool isShader() const { return false; } + virtual bool isTexture() const { return false; } + +protected: + WebGLObject(WebGLRenderingContext*); + virtual void deleteObjectImpl(Platform3DObject) = 0; + +private: + Platform3DObject m_object; + // The shouldDeleteObject flag indicates whether this wrapper + // owns the underlying resource and should delete it when the + // wrapper is unreferenced for the last time and deleted. It + // is only set to false for certain objects returned from get + // queries. FIXME: should consider canonicalizing all of these + // objects in the future. + bool m_shouldDeleteObject; + WebGLRenderingContext* m_context; +}; + +} // namespace WebCore + +#endif // WebGLObject_h diff --git a/WebCore/html/canvas/WebGLProgram.cpp b/WebCore/html/canvas/WebGLProgram.cpp index 0004465..846b171 100644 --- a/WebCore/html/canvas/WebGLProgram.cpp +++ b/WebCore/html/canvas/WebGLProgram.cpp @@ -28,6 +28,7 @@ #if ENABLE(3D_CANVAS) #include "WebGLProgram.h" + #include "WebGLRenderingContext.h" namespace WebCore { @@ -38,13 +39,13 @@ PassRefPtr<WebGLProgram> WebGLProgram::create(WebGLRenderingContext* ctx) } WebGLProgram::WebGLProgram(WebGLRenderingContext* ctx) - : CanvasObject(ctx) + : WebGLObject(ctx) , m_linkFailure(false) { setObject(context()->graphicsContext3D()->createProgram()); } -void WebGLProgram::_deleteObject(Platform3DObject object) +void WebGLProgram::deleteObjectImpl(Platform3DObject object) { context()->graphicsContext3D()->deleteProgram(object); } @@ -56,17 +57,17 @@ bool WebGLProgram::cacheActiveAttribLocations() return false; GraphicsContext3D* context3d = context()->graphicsContext3D(); int linkStatus; - context3d->getProgramiv(this, GraphicsContext3D::LINK_STATUS, &linkStatus); + context3d->getProgramiv(object(), GraphicsContext3D::LINK_STATUS, &linkStatus); if (!linkStatus) return false; int numAttribs = 0; - context3d->getProgramiv(this, GraphicsContext3D::ACTIVE_ATTRIBUTES, &numAttribs); + context3d->getProgramiv(object(), GraphicsContext3D::ACTIVE_ATTRIBUTES, &numAttribs); m_activeAttribLocations.resize(static_cast<size_t>(numAttribs)); for (int i = 0; i < numAttribs; ++i) { ActiveInfo info; - context3d->getActiveAttrib(this, i, info); - m_activeAttribLocations[i] = context3d->getAttribLocation(this, info.name.charactersWithNullTermination()); + context3d->getActiveAttrib(object(), i, info); + m_activeAttribLocations[i] = context3d->getAttribLocation(object(), info.name.charactersWithNullTermination()); } return true; diff --git a/WebCore/html/canvas/WebGLProgram.h b/WebCore/html/canvas/WebGLProgram.h index 1049334..0156938 100644 --- a/WebCore/html/canvas/WebGLProgram.h +++ b/WebCore/html/canvas/WebGLProgram.h @@ -26,47 +26,47 @@ #ifndef WebGLProgram_h #define WebGLProgram_h -#include "CanvasObject.h" +#include "WebGLObject.h" #include <wtf/PassRefPtr.h> #include <wtf/RefCounted.h> #include <wtf/Vector.h> namespace WebCore { - - class WebGLProgram : public CanvasObject { - public: - virtual ~WebGLProgram() { deleteObject(); } - - static PassRefPtr<WebGLProgram> create(WebGLRenderingContext*); - - // cacheActiveAttribLocation() is only called once after linkProgram() - // succeeds. - bool cacheActiveAttribLocations(); - int numActiveAttribLocations() const; - int getActiveAttribLocation(int index) const; - - bool isUsingVertexAttrib0() const; - - // Return true means getProgramParameter(LINK_STATUS) should return - // false; return false means we should actually call - // getProgramParameter(LINK_STATUS) to find out. - bool isLinkFailureFlagSet() const { return m_linkFailure; } - void setLinkFailureFlag(bool failed) { m_linkFailure = failed; } - - protected: - WebGLProgram(WebGLRenderingContext*); - - virtual void _deleteObject(Platform3DObject); - - private: - virtual bool isProgram() const { return true; } - - Vector<int> m_activeAttribLocations; - - bool m_linkFailure; - }; - + +class WebGLProgram : public WebGLObject { +public: + virtual ~WebGLProgram() { deleteObject(); } + + static PassRefPtr<WebGLProgram> create(WebGLRenderingContext*); + + // cacheActiveAttribLocation() is only called once after linkProgram() + // succeeds. + bool cacheActiveAttribLocations(); + int numActiveAttribLocations() const; + int getActiveAttribLocation(int index) const; + + bool isUsingVertexAttrib0() const; + + // Return true means getProgramParameter(LINK_STATUS) should return + // false; return false means we should actually call + // getProgramParameter(LINK_STATUS) to find out. + bool isLinkFailureFlagSet() const { return m_linkFailure; } + void setLinkFailureFlag(bool failed) { m_linkFailure = failed; } + +protected: + WebGLProgram(WebGLRenderingContext*); + + virtual void deleteObjectImpl(Platform3DObject); + +private: + virtual bool isProgram() const { return true; } + + Vector<int> m_activeAttribLocations; + + bool m_linkFailure; +}; + } // namespace WebCore #endif // WebGLProgram_h diff --git a/WebCore/html/canvas/WebGLRenderbuffer.cpp b/WebCore/html/canvas/WebGLRenderbuffer.cpp index 701e2c9..7bc2eec 100644 --- a/WebCore/html/canvas/WebGLRenderbuffer.cpp +++ b/WebCore/html/canvas/WebGLRenderbuffer.cpp @@ -28,6 +28,7 @@ #if ENABLE(3D_CANVAS) #include "WebGLRenderbuffer.h" + #include "WebGLRenderingContext.h" namespace WebCore { @@ -38,14 +39,14 @@ PassRefPtr<WebGLRenderbuffer> WebGLRenderbuffer::create(WebGLRenderingContext* c } WebGLRenderbuffer::WebGLRenderbuffer(WebGLRenderingContext* ctx) - : CanvasObject(ctx) + : WebGLObject(ctx) , m_internalFormat(GraphicsContext3D::RGBA4) , m_initialized(false) { setObject(context()->graphicsContext3D()->createRenderbuffer()); } -void WebGLRenderbuffer::_deleteObject(Platform3DObject object) +void WebGLRenderbuffer::deleteObjectImpl(Platform3DObject object) { context()->graphicsContext3D()->deleteRenderbuffer(object); } diff --git a/WebCore/html/canvas/WebGLRenderbuffer.h b/WebCore/html/canvas/WebGLRenderbuffer.h index dbb08c1..5765061 100644 --- a/WebCore/html/canvas/WebGLRenderbuffer.h +++ b/WebCore/html/canvas/WebGLRenderbuffer.h @@ -26,37 +26,37 @@ #ifndef WebGLRenderbuffer_h #define WebGLRenderbuffer_h -#include "CanvasObject.h" +#include "WebGLObject.h" #include <wtf/PassRefPtr.h> #include <wtf/RefCounted.h> namespace WebCore { - - class WebGLRenderbuffer : public CanvasObject { - public: - virtual ~WebGLRenderbuffer() { deleteObject(); } - - static PassRefPtr<WebGLRenderbuffer> create(WebGLRenderingContext*); - - void setInternalFormat(unsigned long internalformat) { m_internalFormat = internalformat; } - unsigned long getInternalFormat() const { return m_internalFormat; } - - bool isInitialized() const { return m_initialized; } - void setInitialized() { m_initialized = true; } - - protected: - WebGLRenderbuffer(WebGLRenderingContext*); - - virtual void _deleteObject(Platform3DObject); - - private: - virtual bool isRenderbuffer() const { return true; } - - unsigned long m_internalFormat; - bool m_initialized; - }; - + +class WebGLRenderbuffer : public WebGLObject { +public: + virtual ~WebGLRenderbuffer() { deleteObject(); } + + static PassRefPtr<WebGLRenderbuffer> create(WebGLRenderingContext*); + + void setInternalFormat(unsigned long internalformat) { m_internalFormat = internalformat; } + unsigned long getInternalFormat() const { return m_internalFormat; } + + bool isInitialized() const { return m_initialized; } + void setInitialized() { m_initialized = true; } + +protected: + WebGLRenderbuffer(WebGLRenderingContext*); + + virtual void deleteObjectImpl(Platform3DObject); + +private: + virtual bool isRenderbuffer() const { return true; } + + unsigned long m_internalFormat; + bool m_initialized; +}; + } // namespace WebCore #endif // WebGLRenderbuffer_h diff --git a/WebCore/html/canvas/WebGLRenderingContext.cpp b/WebCore/html/canvas/WebGLRenderingContext.cpp index fb17db9..0284ec6 100644 --- a/WebCore/html/canvas/WebGLRenderingContext.cpp +++ b/WebCore/html/canvas/WebGLRenderingContext.cpp @@ -29,8 +29,8 @@ #include "WebGLRenderingContext.h" -#include "CheckedInt.h" #include "CanvasPixelArray.h" +#include "CheckedInt.h" #include "Console.h" #include "DOMWindow.h" #include "FrameView.h" @@ -41,15 +41,15 @@ #include "NotImplemented.h" #include "RenderBox.h" #include "RenderLayer.h" -#include "WebGLActiveInfo.h" #include "Uint16Array.h" +#include "WebGLActiveInfo.h" #include "WebGLBuffer.h" #include "WebGLContextAttributes.h" #include "WebGLFramebuffer.h" #include "WebGLProgram.h" #include "WebGLRenderbuffer.h" -#include "WebGLTexture.h" #include "WebGLShader.h" +#include "WebGLTexture.h" #include "WebGLUniformLocation.h" #include <wtf/ByteArray.h> @@ -57,6 +57,11 @@ namespace WebCore { +static inline Platform3DObject objectOrZero(WebGLObject* object) +{ + return object ? object->object() : 0; +} + class WebGLStateRestorer { public: WebGLStateRestorer(WebGLRenderingContext* context, @@ -151,7 +156,7 @@ void WebGLRenderingContext::markContextChanged() m_markedCanvasDirty = true; } -bool WebGLRenderingContext::paintRenderingResultsToCanvas() +void WebGLRenderingContext::paintRenderingResultsToCanvas() { if (m_markedCanvasDirty) { // FIXME: It should not be necessary to clear the image before doing a readback. @@ -159,16 +164,13 @@ bool WebGLRenderingContext::paintRenderingResultsToCanvas() canvas()->buffer()->clearImage(); m_markedCanvasDirty = false; m_context->paintRenderingResultsToCanvas(this); - return true; } - return false; } void WebGLRenderingContext::beginPaint() { - if (m_markedCanvasDirty) { + if (m_markedCanvasDirty) m_context->beginPaint(this); - } } void WebGLRenderingContext::endPaint() @@ -193,14 +195,9 @@ void WebGLRenderingContext::reshape(int width, int height) m_context->reshape(width, height); } -int WebGLRenderingContext::sizeInBytes(int type, ExceptionCode& ec) +int WebGLRenderingContext::sizeInBytes(int type) { - UNUSED_PARAM(ec); - int result = m_context->sizeInBytes(type); - if (result <= 0) - m_context->synthesizeGLError(GraphicsContext3D::INVALID_ENUM); - - return result; + return m_context->sizeInBytes(type); } void WebGLRenderingContext::activeTexture(unsigned long texture, ExceptionCode& ec) @@ -220,7 +217,7 @@ void WebGLRenderingContext::attachShader(WebGLProgram* program, WebGLShader* sha UNUSED_PARAM(ec); if (!validateWebGLObject(program) || !validateWebGLObject(shader)) return; - m_context->attachShader(program, shader); + m_context->attachShader(objectOrZero(program), objectOrZero(shader)); cleanupAfterGraphicsCall(false); } @@ -229,7 +226,7 @@ void WebGLRenderingContext::bindAttribLocation(WebGLProgram* program, unsigned l UNUSED_PARAM(ec); if (!validateWebGLObject(program)) return; - m_context->bindAttribLocation(program, index, name); + m_context->bindAttribLocation(objectOrZero(program), index, name); cleanupAfterGraphicsCall(false); } @@ -254,7 +251,7 @@ void WebGLRenderingContext::bindBuffer(unsigned long target, WebGLBuffer* buffer return; } - m_context->bindBuffer(target, buffer); + m_context->bindBuffer(target, objectOrZero(buffer)); if (buffer) buffer->setTarget(target); cleanupAfterGraphicsCall(false); @@ -273,7 +270,7 @@ void WebGLRenderingContext::bindFramebuffer(unsigned long target, WebGLFramebuff return; } m_framebufferBinding = buffer; - m_context->bindFramebuffer(target, buffer); + m_context->bindFramebuffer(target, objectOrZero(buffer)); if (m_framebufferBinding) m_framebufferBinding->onBind(); cleanupAfterGraphicsCall(false); @@ -291,7 +288,7 @@ void WebGLRenderingContext::bindRenderbuffer(unsigned long target, WebGLRenderbu return; } m_renderbufferBinding = renderBuffer; - m_context->bindRenderbuffer(target, renderBuffer); + m_context->bindRenderbuffer(target, objectOrZero(renderBuffer)); cleanupAfterGraphicsCall(false); } @@ -314,9 +311,28 @@ void WebGLRenderingContext::bindTexture(unsigned long target, WebGLTexture* text m_context->synthesizeGLError(GraphicsContext3D::INVALID_ENUM); return; } - m_context->bindTexture(target, texture); + m_context->bindTexture(target, objectOrZero(texture)); if (!isGLES2Compliant() && texture) texture->setTarget(target, maxLevel); + + // FIXME: do we want to do this on all platforms? +#if PLATFORM(CHROMIUM) + // FIXME: GL_TEXTURE_WRAP_R isn't exposed in the OpenGL ES 2.0 + // API. On desktop OpenGL implementations it seems necessary to + // set this wrap mode to GL_CLAMP_TO_EDGE to get correct behavior + // of cube maps. + if (texture) { + if (target == GraphicsContext3D::TEXTURE_CUBE_MAP) { + if (!texture->isCubeMapRWrapModeInitialized()) { + static const int textureWrapR = 0x8072; + texParameteri(GraphicsContext3D::TEXTURE_CUBE_MAP, textureWrapR, GraphicsContext3D::CLAMP_TO_EDGE); + texture->setCubeMapRWrapModeInitialized(true); + } + } else + texture->setCubeMapRWrapModeInitialized(false); + } +#endif + cleanupAfterGraphicsCall(false); } @@ -326,7 +342,7 @@ void WebGLRenderingContext::blendColor(double red, double green, double blue, do cleanupAfterGraphicsCall(false); } -void WebGLRenderingContext::blendEquation( unsigned long mode ) +void WebGLRenderingContext::blendEquation(unsigned long mode) { if (!isGLES2Compliant()) { if (!validateBlendEquation(mode)) @@ -497,7 +513,7 @@ void WebGLRenderingContext::compileShader(WebGLShader* shader, ExceptionCode& ec UNUSED_PARAM(ec); if (!validateWebGLObject(shader)) return; - m_context->compileShader(shader); + m_context->compileShader(objectOrZero(shader)); cleanupAfterGraphicsCall(false); } @@ -687,7 +703,7 @@ void WebGLRenderingContext::detachShader(WebGLProgram* program, WebGLShader* sha UNUSED_PARAM(ec); if (!validateWebGLObject(program) || !validateWebGLObject(shader)) return; - m_context->detachShader(program, shader); + m_context->detachShader(objectOrZero(program), objectOrZero(shader)); cleanupAfterGraphicsCall(false); } @@ -872,7 +888,7 @@ bool WebGLRenderingContext::validateRenderingState(long numElementsRequired) return numElementsRequired <= smallestNumElements; } -bool WebGLRenderingContext::validateWebGLObject(CanvasObject* object) +bool WebGLRenderingContext::validateWebGLObject(WebGLObject* object) { if (!object) { m_context->synthesizeGLError(GraphicsContext3D::INVALID_VALUE); @@ -1056,7 +1072,7 @@ void WebGLRenderingContext::framebufferRenderbuffer(unsigned long target, unsign return; } } - m_context->framebufferRenderbuffer(target, attachment, renderbuffertarget, buffer); + m_context->framebufferRenderbuffer(target, attachment, renderbuffertarget, objectOrZero(buffer)); m_framebufferBinding->setAttachment(attachment, buffer); cleanupAfterGraphicsCall(false); } @@ -1081,7 +1097,7 @@ void WebGLRenderingContext::framebufferTexture2D(unsigned long target, unsigned m_context->synthesizeGLError(GraphicsContext3D::INVALID_OPERATION); return; } - m_context->framebufferTexture2D(target, attachment, textarget, texture, level); + m_context->framebufferTexture2D(target, attachment, textarget, objectOrZero(texture), level); m_framebufferBinding->setAttachment(attachment, texture); cleanupAfterGraphicsCall(false); } @@ -1119,9 +1135,8 @@ PassRefPtr<WebGLActiveInfo> WebGLRenderingContext::getActiveAttrib(WebGLProgram* ActiveInfo info; if (!validateWebGLObject(program)) return 0; - if (!m_context->getActiveAttrib(program, index, info)) { + if (!m_context->getActiveAttrib(objectOrZero(program), index, info)) return 0; - } return WebGLActiveInfo::create(info.name, info.type, info.size); } @@ -1131,13 +1146,11 @@ PassRefPtr<WebGLActiveInfo> WebGLRenderingContext::getActiveUniform(WebGLProgram ActiveInfo info; if (!validateWebGLObject(program)) return 0; - if (!m_context->getActiveUniform(program, index, info)) { + if (!m_context->getActiveUniform(objectOrZero(program), index, info)) return 0; - } - if (!isGLES2Compliant()) { + if (!isGLES2Compliant()) if (info.size > 1 && !info.name.endsWith("[0]")) info.name.append("[0]"); - } return WebGLActiveInfo::create(info.name, info.type, info.size); } @@ -1148,11 +1161,11 @@ bool WebGLRenderingContext::getAttachedShaders(WebGLProgram* program, Vector<Web if (!validateWebGLObject(program)) return false; int numShaders = 0; - m_context->getProgramiv(program, GraphicsContext3D::ATTACHED_SHADERS, &numShaders); + m_context->getProgramiv(objectOrZero(program), GraphicsContext3D::ATTACHED_SHADERS, &numShaders); if (numShaders) { OwnArrayPtr<unsigned int> shaders(new unsigned int[numShaders]); int count; - m_context->getAttachedShaders(program, numShaders, &count, shaders.get()); + m_context->getAttachedShaders(objectOrZero(program), numShaders, &count, shaders.get()); if (count != numShaders) return false; shaderObjects.resize(numShaders); @@ -1170,7 +1183,7 @@ bool WebGLRenderingContext::getAttachedShaders(WebGLProgram* program, Vector<Web int WebGLRenderingContext::getAttribLocation(WebGLProgram* program, const String& name) { - return m_context->getAttribLocation(program, name); + return m_context->getAttribLocation(objectOrZero(program), name); } WebGLGetInfo WebGLRenderingContext::getBufferParameter(unsigned long target, unsigned long pname, ExceptionCode& ec) @@ -1191,8 +1204,7 @@ WebGLGetInfo WebGLRenderingContext::getBufferParameter(unsigned long target, uns m_context->getBufferParameteriv(target, pname, &value); if (pname == GraphicsContext3D::BUFFER_SIZE) return WebGLGetInfo(static_cast<long>(value)); - else - return WebGLGetInfo(static_cast<unsigned long>(value)); + return WebGLGetInfo(static_cast<unsigned long>(value)); } PassRefPtr<WebGLContextAttributes> WebGLRenderingContext::getContextAttributes() @@ -1234,23 +1246,22 @@ WebGLGetInfo WebGLRenderingContext::getFramebufferAttachmentParameter(unsigned l m_context->getFramebufferAttachmentParameteriv(target, attachment, pname, &value); if (pname == GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE) return WebGLGetInfo(static_cast<unsigned long>(value)); - else - return WebGLGetInfo(static_cast<long>(value)); - } else { - WebGLStateRestorer(this, false); - int type = 0; - m_context->getFramebufferAttachmentParameteriv(target, attachment, GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &type); - int value = 0; - m_context->getFramebufferAttachmentParameteriv(target, attachment, GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &value); - switch (type) { - case GraphicsContext3D::RENDERBUFFER: - return WebGLGetInfo(PassRefPtr<WebGLRenderbuffer>(findRenderbuffer(static_cast<Platform3DObject>(value)))); - case GraphicsContext3D::TEXTURE: - return WebGLGetInfo(PassRefPtr<WebGLTexture>(findTexture(static_cast<Platform3DObject>(value)))); - default: - // FIXME: raise exception? - return WebGLGetInfo(); - } + return WebGLGetInfo(static_cast<long>(value)); + } + + WebGLStateRestorer(this, false); + int type = 0; + m_context->getFramebufferAttachmentParameteriv(target, attachment, GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &type); + int value = 0; + m_context->getFramebufferAttachmentParameteriv(target, attachment, GraphicsContext3D::FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &value); + switch (type) { + case GraphicsContext3D::RENDERBUFFER: + return WebGLGetInfo(PassRefPtr<WebGLRenderbuffer>(findRenderbuffer(static_cast<Platform3DObject>(value)))); + case GraphicsContext3D::TEXTURE: + return WebGLGetInfo(PassRefPtr<WebGLTexture>(findTexture(static_cast<Platform3DObject>(value)))); + default: + // FIXME: raise exception? + return WebGLGetInfo(); } } @@ -1448,12 +1459,12 @@ WebGLGetInfo WebGLRenderingContext::getProgramParameter(WebGLProgram* program, u switch (pname) { case GraphicsContext3D::DELETE_STATUS: case GraphicsContext3D::VALIDATE_STATUS: - m_context->getProgramiv(program, pname, &value); + m_context->getProgramiv(objectOrZero(program), pname, &value); return WebGLGetInfo(static_cast<bool>(value)); case GraphicsContext3D::LINK_STATUS: if (program->isLinkFailureFlagSet()) return WebGLGetInfo(false); - m_context->getProgramiv(program, pname, &value); + m_context->getProgramiv(objectOrZero(program), pname, &value); return WebGLGetInfo(static_cast<bool>(value)); case GraphicsContext3D::INFO_LOG_LENGTH: case GraphicsContext3D::ATTACHED_SHADERS: @@ -1461,7 +1472,7 @@ WebGLGetInfo WebGLRenderingContext::getProgramParameter(WebGLProgram* program, u case GraphicsContext3D::ACTIVE_ATTRIBUTE_MAX_LENGTH: case GraphicsContext3D::ACTIVE_UNIFORMS: case GraphicsContext3D::ACTIVE_UNIFORM_MAX_LENGTH: - m_context->getProgramiv(program, pname, &value); + m_context->getProgramiv(objectOrZero(program), pname, &value); return WebGLGetInfo(static_cast<long>(value)); default: m_context->synthesizeGLError(GraphicsContext3D::INVALID_ENUM); @@ -1475,7 +1486,7 @@ String WebGLRenderingContext::getProgramInfoLog(WebGLProgram* program, Exception if (!validateWebGLObject(program)) return ""; WebGLStateRestorer(this, false); - return m_context->getProgramInfoLog(program); + return m_context->getProgramInfoLog(objectOrZero(program)); } WebGLGetInfo WebGLRenderingContext::getRenderbufferParameter(unsigned long target, unsigned long pname, ExceptionCode& ec) @@ -1521,14 +1532,14 @@ WebGLGetInfo WebGLRenderingContext::getShaderParameter(WebGLShader* shader, unsi switch (pname) { case GraphicsContext3D::DELETE_STATUS: case GraphicsContext3D::COMPILE_STATUS: - m_context->getShaderiv(shader, pname, &value); + m_context->getShaderiv(objectOrZero(shader), pname, &value); return WebGLGetInfo(static_cast<bool>(value)); case GraphicsContext3D::SHADER_TYPE: - m_context->getShaderiv(shader, pname, &value); + m_context->getShaderiv(objectOrZero(shader), pname, &value); return WebGLGetInfo(static_cast<unsigned long>(value)); case GraphicsContext3D::INFO_LOG_LENGTH: case GraphicsContext3D::SHADER_SOURCE_LENGTH: - m_context->getShaderiv(shader, pname, &value); + m_context->getShaderiv(objectOrZero(shader), pname, &value); return WebGLGetInfo(static_cast<long>(value)); default: m_context->synthesizeGLError(GraphicsContext3D::INVALID_ENUM); @@ -1542,7 +1553,7 @@ String WebGLRenderingContext::getShaderInfoLog(WebGLShader* shader, ExceptionCod if (!validateWebGLObject(shader)) return ""; WebGLStateRestorer(this, false); - return m_context->getShaderInfoLog(shader); + return m_context->getShaderInfoLog(objectOrZero(shader)); } String WebGLRenderingContext::getShaderSource(WebGLShader* shader, ExceptionCode& ec) @@ -1551,7 +1562,7 @@ String WebGLRenderingContext::getShaderSource(WebGLShader* shader, ExceptionCode if (!validateWebGLObject(shader)) return ""; WebGLStateRestorer(this, false); - return m_context->getShaderSource(shader); + return m_context->getShaderSource(objectOrZero(shader)); } String WebGLRenderingContext::getString(unsigned long name) @@ -1601,10 +1612,10 @@ WebGLGetInfo WebGLRenderingContext::getUniform(WebGLProgram* program, const WebG WebGLStateRestorer(this, false); // FIXME: make this more efficient using WebGLUniformLocation and caching types in it int activeUniforms = 0; - m_context->getProgramiv(program, GraphicsContext3D::ACTIVE_UNIFORMS, &activeUniforms); + m_context->getProgramiv(objectOrZero(program), GraphicsContext3D::ACTIVE_UNIFORMS, &activeUniforms); for (int i = 0; i < activeUniforms; i++) { ActiveInfo info; - if (!m_context->getActiveUniform(program, i, info)) + if (!m_context->getActiveUniform(objectOrZero(program), i, info)) return WebGLGetInfo(); // Strip "[0]" from the name if it's an array. if (info.size > 1) @@ -1618,7 +1629,7 @@ WebGLGetInfo WebGLRenderingContext::getUniform(WebGLProgram* program, const WebG name.append(']'); } // Now need to look this up by name again to find its location - long loc = m_context->getUniformLocation(program, name); + long loc = m_context->getUniformLocation(objectOrZero(program), name); if (loc == location) { // Found it. Use the type in the ActiveInfo to determine the return type. GraphicsContext3D::WebGLEnumType baseType; @@ -1693,21 +1704,21 @@ WebGLGetInfo WebGLRenderingContext::getUniform(WebGLProgram* program, const WebG switch (baseType) { case GraphicsContext3D::FLOAT: { float value[16] = {0}; - m_context->getUniformfv(program, location, value); + m_context->getUniformfv(objectOrZero(program), location, value); if (length == 1) return WebGLGetInfo(value[0]); return WebGLGetInfo(Float32Array::create(value, length)); } case GraphicsContext3D::INT: { int value[16] = {0}; - m_context->getUniformiv(program, location, value); + m_context->getUniformiv(objectOrZero(program), location, value); if (length == 1) return WebGLGetInfo(static_cast<long>(value[0])); return WebGLGetInfo(Int32Array::create(value, length)); } case GraphicsContext3D::BOOL: { int value[16] = {0}; - m_context->getUniformiv(program, location, value); + m_context->getUniformiv(objectOrZero(program), location, value); if (length > 1) { unsigned char boolValue[16] = {0}; for (unsigned j = 0; j < length; j++) @@ -1733,7 +1744,7 @@ PassRefPtr<WebGLUniformLocation> WebGLRenderingContext::getUniformLocation(WebGL if (!validateWebGLObject(program)) return 0; WebGLStateRestorer(this, false); - long uniformLocation = m_context->getUniformLocation(program, name); + long uniformLocation = m_context->getUniformLocation(objectOrZero(program), name); if (uniformLocation == -1) return 0; return WebGLUniformLocation::create(program, uniformLocation); @@ -1811,7 +1822,7 @@ bool WebGLRenderingContext::isBuffer(WebGLBuffer* buffer) if (!buffer) return false; - return m_context->isBuffer(buffer); + return m_context->isBuffer(buffer->object()); } bool WebGLRenderingContext::isEnabled(unsigned long cap) @@ -1828,7 +1839,7 @@ bool WebGLRenderingContext::isFramebuffer(WebGLFramebuffer* framebuffer) if (!framebuffer) return false; - return m_context->isFramebuffer(framebuffer); + return m_context->isFramebuffer(framebuffer->object()); } bool WebGLRenderingContext::isProgram(WebGLProgram* program) @@ -1836,7 +1847,7 @@ bool WebGLRenderingContext::isProgram(WebGLProgram* program) if (!program) return false; - return m_context->isProgram(program); + return m_context->isProgram(program->object()); } bool WebGLRenderingContext::isRenderbuffer(WebGLRenderbuffer* renderbuffer) @@ -1844,7 +1855,7 @@ bool WebGLRenderingContext::isRenderbuffer(WebGLRenderbuffer* renderbuffer) if (!renderbuffer) return false; - return m_context->isRenderbuffer(renderbuffer); + return m_context->isRenderbuffer(renderbuffer->object()); } bool WebGLRenderingContext::isShader(WebGLShader* shader) @@ -1852,7 +1863,7 @@ bool WebGLRenderingContext::isShader(WebGLShader* shader) if (!shader) return false; - return m_context->isShader(shader); + return m_context->isShader(shader->object()); } bool WebGLRenderingContext::isTexture(WebGLTexture* texture) @@ -1860,7 +1871,7 @@ bool WebGLRenderingContext::isTexture(WebGLTexture* texture) if (!texture) return false; - return m_context->isTexture(texture); + return m_context->isTexture(texture->object()); } void WebGLRenderingContext::lineWidth(double width) @@ -1896,7 +1907,7 @@ void WebGLRenderingContext::linkProgram(WebGLProgram* program, ExceptionCode& ec program->setLinkFailureFlag(false); } - m_context->linkProgram(program); + m_context->linkProgram(objectOrZero(program)); program->cacheActiveAttribLocations(); cleanupAfterGraphicsCall(false); } @@ -2041,7 +2052,7 @@ void WebGLRenderingContext::shaderSource(WebGLShader* shader, const String& stri UNUSED_PARAM(ec); if (!validateWebGLObject(shader)) return; - m_context->shaderSource(shader, string); + m_context->shaderSource(objectOrZero(shader), string); cleanupAfterGraphicsCall(false); } @@ -2930,7 +2941,7 @@ void WebGLRenderingContext::useProgram(WebGLProgram* program, ExceptionCode& ec) return; } m_currentProgram = program; - m_context->useProgram(program); + m_context->useProgram(objectOrZero(program)); cleanupAfterGraphicsCall(false); } @@ -2939,7 +2950,7 @@ void WebGLRenderingContext::validateProgram(WebGLProgram* program, ExceptionCode UNUSED_PARAM(ec); if (!validateWebGLObject(program)) return; - m_context->validateProgram(program); + m_context->validateProgram(objectOrZero(program)); cleanupAfterGraphicsCall(false); } @@ -3005,6 +3016,7 @@ void WebGLRenderingContext::vertexAttrib4fv(unsigned long index, float* v, int s void WebGLRenderingContext::vertexAttribPointer(unsigned long index, long size, unsigned long type, bool normalized, long stride, long offset, ExceptionCode& ec) { + UNUSED_PARAM(ec); if (index >= m_maxVertexAttribs) { m_context->synthesizeGLError(GraphicsContext3D::INVALID_VALUE); return; @@ -3018,15 +3030,17 @@ void WebGLRenderingContext::vertexAttribPointer(unsigned long index, long size, return; } // Determine the number of elements the bound buffer can hold, given the offset, size, type and stride - long bytesPerElement = size * sizeInBytes(type, ec); - if (bytesPerElement <= 0) + long bytesPerElement = size * sizeInBytes(type); + if (bytesPerElement <= 0) { + m_context->synthesizeGLError(GraphicsContext3D::INVALID_ENUM); return; + } if (index >= m_vertexAttribState.size()) m_vertexAttribState.resize(index + 1); long validatedStride = bytesPerElement; - if (stride != 0) { + if (stride) { if ((long) stride < bytesPerElement) { m_context->synthesizeGLError(GraphicsContext3D::INVALID_VALUE); return; @@ -3059,12 +3073,12 @@ void WebGLRenderingContext::viewport(long x, long y, unsigned long width, unsign cleanupAfterGraphicsCall(false); } -void WebGLRenderingContext::removeObject(CanvasObject* object) +void WebGLRenderingContext::removeObject(WebGLObject* object) { m_canvasObjects.remove(object); } -void WebGLRenderingContext::addObject(CanvasObject* object) +void WebGLRenderingContext::addObject(WebGLObject* object) { removeObject(object); m_canvasObjects.add(object); @@ -3072,8 +3086,8 @@ void WebGLRenderingContext::addObject(CanvasObject* object) void WebGLRenderingContext::detachAndRemoveAllObjects() { - HashSet<RefPtr<CanvasObject> >::iterator pend = m_canvasObjects.end(); - for (HashSet<RefPtr<CanvasObject> >::iterator it = m_canvasObjects.begin(); it != pend; ++it) + HashSet<RefPtr<WebGLObject> >::iterator pend = m_canvasObjects.end(); + for (HashSet<RefPtr<WebGLObject> >::iterator it = m_canvasObjects.begin(); it != pend; ++it) (*it)->detachContext(); m_canvasObjects.clear(); @@ -3083,8 +3097,8 @@ WebGLTexture* WebGLRenderingContext::findTexture(Platform3DObject obj) { if (!obj) return 0; - HashSet<RefPtr<CanvasObject> >::iterator pend = m_canvasObjects.end(); - for (HashSet<RefPtr<CanvasObject> >::iterator it = m_canvasObjects.begin(); it != pend; ++it) { + HashSet<RefPtr<WebGLObject> >::iterator pend = m_canvasObjects.end(); + for (HashSet<RefPtr<WebGLObject> >::iterator it = m_canvasObjects.begin(); it != pend; ++it) { if ((*it)->isTexture() && (*it)->object() == obj) return reinterpret_cast<WebGLTexture*>((*it).get()); } @@ -3095,8 +3109,8 @@ WebGLRenderbuffer* WebGLRenderingContext::findRenderbuffer(Platform3DObject obj) { if (!obj) return 0; - HashSet<RefPtr<CanvasObject> >::iterator pend = m_canvasObjects.end(); - for (HashSet<RefPtr<CanvasObject> >::iterator it = m_canvasObjects.begin(); it != pend; ++it) { + HashSet<RefPtr<WebGLObject> >::iterator pend = m_canvasObjects.end(); + for (HashSet<RefPtr<WebGLObject> >::iterator it = m_canvasObjects.begin(); it != pend; ++it) { if ((*it)->isRenderbuffer() && (*it)->object() == obj) return reinterpret_cast<WebGLRenderbuffer*>((*it).get()); } @@ -3107,8 +3121,8 @@ WebGLBuffer* WebGLRenderingContext::findBuffer(Platform3DObject obj) { if (!obj) return 0; - HashSet<RefPtr<CanvasObject> >::iterator pend = m_canvasObjects.end(); - for (HashSet<RefPtr<CanvasObject> >::iterator it = m_canvasObjects.begin(); it != pend; ++it) { + HashSet<RefPtr<WebGLObject> >::iterator pend = m_canvasObjects.end(); + for (HashSet<RefPtr<WebGLObject> >::iterator it = m_canvasObjects.begin(); it != pend; ++it) { if ((*it)->isBuffer() && (*it)->object() == obj) return reinterpret_cast<WebGLBuffer*>((*it).get()); } @@ -3119,8 +3133,8 @@ WebGLShader* WebGLRenderingContext::findShader(Platform3DObject obj) { if (!obj) return 0; - HashSet<RefPtr<CanvasObject> >::iterator pend = m_canvasObjects.end(); - for (HashSet<RefPtr<CanvasObject> >::iterator it = m_canvasObjects.begin(); it != pend; ++it) { + HashSet<RefPtr<WebGLObject> >::iterator pend = m_canvasObjects.end(); + for (HashSet<RefPtr<WebGLObject> >::iterator it = m_canvasObjects.begin(); it != pend; ++it) { if ((*it)->isShader() && (*it)->object() == obj) return reinterpret_cast<WebGLShader*>((*it).get()); } @@ -3242,9 +3256,9 @@ void WebGLRenderingContext::handleNPOTTextures(bool prepareToDraw) texCubeMap = m_textureUnits[ii].m_textureCubeMapBinding.get(); } if (m_textureUnits[ii].m_texture2DBinding && m_textureUnits[ii].m_texture2DBinding->needToUseBlackTexture()) - m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, tex2D); + m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, objectOrZero(tex2D)); if (m_textureUnits[ii].m_textureCubeMapBinding && m_textureUnits[ii].m_textureCubeMapBinding->needToUseBlackTexture()) - m_context->bindTexture(GraphicsContext3D::TEXTURE_CUBE_MAP, texCubeMap); + m_context->bindTexture(GraphicsContext3D::TEXTURE_CUBE_MAP, objectOrZero(texCubeMap)); } } if (resetActiveUnit) @@ -3255,12 +3269,12 @@ void WebGLRenderingContext::createFallbackBlackTextures1x1() { unsigned char black[] = {0, 0, 0, 255}; m_blackTexture2D = createTexture(); - m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, m_blackTexture2D.get()); + m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, m_blackTexture2D->object()); m_context->texImage2D(GraphicsContext3D::TEXTURE_2D, 0, GraphicsContext3D::RGBA, 1, 1, 0, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNED_BYTE, black); m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, 0); m_blackTextureCubeMap = createTexture(); - m_context->bindTexture(GraphicsContext3D::TEXTURE_CUBE_MAP, m_blackTextureCubeMap.get()); + m_context->bindTexture(GraphicsContext3D::TEXTURE_CUBE_MAP, m_blackTextureCubeMap->object()); m_context->texImage2D(GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_X, 0, GraphicsContext3D::RGBA, 1, 1, 0, GraphicsContext3D::RGBA, GraphicsContext3D::UNSIGNED_BYTE, black); m_context->texImage2D(GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GraphicsContext3D::RGBA, 1, 1, @@ -3716,7 +3730,7 @@ void WebGLRenderingContext::initVertexAttrib0() { m_vertexAttribState.resize(1); m_vertexAttrib0Buffer = createBuffer(); - m_context->bindBuffer(GraphicsContext3D::ARRAY_BUFFER, m_vertexAttrib0Buffer.get()); + m_context->bindBuffer(GraphicsContext3D::ARRAY_BUFFER, m_vertexAttrib0Buffer->object()); m_context->bufferData(GraphicsContext3D::ARRAY_BUFFER, 0, GraphicsContext3D::DYNAMIC_DRAW); m_context->vertexAttribPointer(0, 4, GraphicsContext3D::FLOAT, false, 0, 0); m_vertexAttribState[0].bufferBinding = m_vertexAttrib0Buffer; @@ -3735,7 +3749,7 @@ bool WebGLRenderingContext::simulateVertexAttrib0(long numVertex) if (state.enabled || !m_currentProgram || !m_currentProgram->object() || !m_currentProgram->isUsingVertexAttrib0()) return false; - m_context->bindBuffer(GraphicsContext3D::ARRAY_BUFFER, m_vertexAttrib0Buffer.get()); + m_context->bindBuffer(GraphicsContext3D::ARRAY_BUFFER, m_vertexAttrib0Buffer->object()); long bufferDataSize = (numVertex + 1) * 4 * sizeof(float); if (bufferDataSize > m_vertexAttrib0BufferSize || state.value[0] != m_vertexAttrib0BufferValue[0] @@ -3764,10 +3778,10 @@ void WebGLRenderingContext::restoreStatesAfterVertexAttrib0Simulation() { const VertexAttribState& state = m_vertexAttribState[0]; if (state.bufferBinding != m_vertexAttrib0Buffer) { - m_context->bindBuffer(GraphicsContext3D::ARRAY_BUFFER, state.bufferBinding.get()); + m_context->bindBuffer(GraphicsContext3D::ARRAY_BUFFER, objectOrZero(state.bufferBinding.get())); m_context->vertexAttribPointer(0, state.size, state.type, state.normalized, state.originalStride, state.offset); } - m_context->bindBuffer(GraphicsContext3D::ARRAY_BUFFER, m_boundArrayBuffer.get()); + m_context->bindBuffer(GraphicsContext3D::ARRAY_BUFFER, objectOrZero(m_boundArrayBuffer.get())); } } // namespace WebCore diff --git a/WebCore/html/canvas/WebGLRenderingContext.h b/WebCore/html/canvas/WebGLRenderingContext.h index 017570b..608797f 100644 --- a/WebCore/html/canvas/WebGLRenderingContext.h +++ b/WebCore/html/canvas/WebGLRenderingContext.h @@ -29,11 +29,11 @@ #include "CanvasRenderingContext.h" #include "ExceptionCode.h" #include "Float32Array.h" -#include "WebGLGetInfo.h" -#include "Int32Array.h" -#include "Uint8Array.h" #include "GraphicsContext3D.h" +#include "Int32Array.h" #include "PlatformString.h" +#include "Uint8Array.h" +#include "WebGLGetInfo.h" namespace WebCore { @@ -41,7 +41,7 @@ class WebGLActiveInfo; class WebGLBuffer; class WebGLContextAttributes; class WebGLFramebuffer; -class CanvasObject; +class WebGLObject; class WebGLProgram; class WebGLRenderbuffer; class WebGLShader; @@ -52,480 +52,478 @@ class HTMLVideoElement; class ImageData; class WebKitCSSMatrix; - class WebGLRenderingContext : public CanvasRenderingContext { - public: - static PassOwnPtr<WebGLRenderingContext> create(HTMLCanvasElement*, WebGLContextAttributes*); - virtual ~WebGLRenderingContext(); - - virtual bool is3d() const { return true; } - virtual bool isAccelerated() const { return true; } - - // Helper to return the size in bytes of OpenGL data types - // like GL_FLOAT, GL_INT, etc. - int sizeInBytes(int type, ExceptionCode& ec); - - void activeTexture(unsigned long texture, ExceptionCode& ec); - void attachShader(WebGLProgram*, WebGLShader*, ExceptionCode& ec); - void bindAttribLocation(WebGLProgram*, unsigned long index, const String& name, ExceptionCode& ec); - void bindBuffer(unsigned long target, WebGLBuffer*, ExceptionCode& ec); - void bindFramebuffer(unsigned long target, WebGLFramebuffer*, ExceptionCode& ec); - void bindRenderbuffer(unsigned long target, WebGLRenderbuffer*, ExceptionCode& ec); - void bindTexture(unsigned long target, WebGLTexture*, ExceptionCode& ec); - void blendColor(double red, double green, double blue, double alpha); - void blendEquation(unsigned long mode); - void blendEquationSeparate(unsigned long modeRGB, unsigned long modeAlpha); - void blendFunc(unsigned long sfactor, unsigned long dfactor); - void blendFuncSeparate(unsigned long srcRGB, unsigned long dstRGB, unsigned long srcAlpha, unsigned long dstAlpha); +class WebGLRenderingContext : public CanvasRenderingContext { +public: + static PassOwnPtr<WebGLRenderingContext> create(HTMLCanvasElement*, WebGLContextAttributes*); + virtual ~WebGLRenderingContext(); - void bufferData(unsigned long target, int size, unsigned long usage, ExceptionCode&); - void bufferData(unsigned long target, ArrayBuffer* data, unsigned long usage, ExceptionCode&); - void bufferData(unsigned long target, ArrayBufferView* data, unsigned long usage, ExceptionCode&); - void bufferSubData(unsigned long target, long offset, ArrayBuffer* data, ExceptionCode&); - void bufferSubData(unsigned long target, long offset, ArrayBufferView* data, ExceptionCode&); - - unsigned long checkFramebufferStatus(unsigned long target); - void clear(unsigned long mask); - void clearColor(double red, double green, double blue, double alpha); - void clearDepth(double); - void clearStencil(long); - void colorMask(bool red, bool green, bool blue, bool alpha); - void compileShader(WebGLShader*, ExceptionCode& ec); - - //void compressedTexImage2D(unsigned long target, long level, unsigned long internalformat, unsigned long width, unsigned long height, long border, unsigned long imageSize, const void* data); - //void compressedTexSubImage2D(unsigned long target, long level, long xoffset, long yoffset, unsigned long width, unsigned long height, unsigned long format, unsigned long imageSize, const void* data); - - void copyTexImage2D(unsigned long target, long level, unsigned long internalformat, long x, long y, unsigned long width, unsigned long height, long border); - void copyTexSubImage2D(unsigned long target, long level, long xoffset, long yoffset, long x, long y, unsigned long width, unsigned long height); - - PassRefPtr<WebGLBuffer> createBuffer(); - PassRefPtr<WebGLFramebuffer> createFramebuffer(); - PassRefPtr<WebGLProgram> createProgram(); - PassRefPtr<WebGLRenderbuffer> createRenderbuffer(); - PassRefPtr<WebGLShader> createShader(unsigned long type, ExceptionCode&); - PassRefPtr<WebGLTexture> createTexture(); - - void cullFace(unsigned long mode); - - void deleteBuffer(WebGLBuffer*); - void deleteFramebuffer(WebGLFramebuffer*); - void deleteProgram(WebGLProgram*); - void deleteRenderbuffer(WebGLRenderbuffer*); - void deleteShader(WebGLShader*); - void deleteTexture(WebGLTexture*); - - void depthFunc(unsigned long); - void depthMask(bool); - void depthRange(double zNear, double zFar); - void detachShader(WebGLProgram*, WebGLShader*, ExceptionCode&); - void disable(unsigned long cap); - void disableVertexAttribArray(unsigned long index, ExceptionCode&); - void drawArrays(unsigned long mode, long first, long count, ExceptionCode&); - void drawElements(unsigned long mode, long count, unsigned long type, long offset, ExceptionCode&); - - void enable(unsigned long cap); - void enableVertexAttribArray(unsigned long index, ExceptionCode&); - void finish(); - void flush(); - void framebufferRenderbuffer(unsigned long target, unsigned long attachment, unsigned long renderbuffertarget, WebGLRenderbuffer*, ExceptionCode& ec); - void framebufferTexture2D(unsigned long target, unsigned long attachment, unsigned long textarget, WebGLTexture*, long level, ExceptionCode& ec); - void frontFace(unsigned long mode); - void generateMipmap(unsigned long target); - - PassRefPtr<WebGLActiveInfo> getActiveAttrib(WebGLProgram*, unsigned long index, ExceptionCode&); - PassRefPtr<WebGLActiveInfo> getActiveUniform(WebGLProgram*, unsigned long index, ExceptionCode&); - - bool getAttachedShaders(WebGLProgram*, Vector<WebGLShader*>&, ExceptionCode&); - - int getAttribLocation(WebGLProgram*, const String& name); - - WebGLGetInfo getBufferParameter(unsigned long target, unsigned long pname, ExceptionCode&); - - PassRefPtr<WebGLContextAttributes> getContextAttributes(); - - unsigned long getError(); - - WebGLGetInfo getFramebufferAttachmentParameter(unsigned long target, unsigned long attachment, unsigned long pname, ExceptionCode&); - - WebGLGetInfo getParameter(unsigned long pname, ExceptionCode&); - - WebGLGetInfo getProgramParameter(WebGLProgram*, unsigned long pname, ExceptionCode&); - - String getProgramInfoLog(WebGLProgram*, ExceptionCode& ec); - - WebGLGetInfo getRenderbufferParameter(unsigned long target, unsigned long pname, ExceptionCode&); - - WebGLGetInfo getShaderParameter(WebGLShader*, unsigned long pname, ExceptionCode& ec); - - String getShaderInfoLog(WebGLShader*, ExceptionCode& ec); - - // TBD - // void glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision); - - String getShaderSource(WebGLShader*, ExceptionCode&); - String getString(unsigned long name); - - WebGLGetInfo getTexParameter(unsigned long target, unsigned long pname, ExceptionCode&); - - WebGLGetInfo getUniform(WebGLProgram*, const WebGLUniformLocation*, ExceptionCode&); - - PassRefPtr<WebGLUniformLocation> getUniformLocation(WebGLProgram*, const String&, ExceptionCode&); - - WebGLGetInfo getVertexAttrib(unsigned long index, unsigned long pname, ExceptionCode&); - - long getVertexAttribOffset(unsigned long index, unsigned long pname); - - void hint(unsigned long target, unsigned long mode); - bool isBuffer(WebGLBuffer*); - bool isEnabled(unsigned long cap); - bool isFramebuffer(WebGLFramebuffer*); - bool isProgram(WebGLProgram*); - bool isRenderbuffer(WebGLRenderbuffer*); - bool isShader(WebGLShader*); - bool isTexture(WebGLTexture*); - void lineWidth(double); - void linkProgram(WebGLProgram*, ExceptionCode&); - void pixelStorei(unsigned long pname, long param); - void polygonOffset(double factor, double units); - void readPixels(long x, long y, long width, long height, unsigned long format, unsigned long type, ArrayBufferView* pixels); - void releaseShaderCompiler(); - void renderbufferStorage(unsigned long target, unsigned long internalformat, unsigned long width, unsigned long height); - void sampleCoverage(double value, bool invert); - void scissor(long x, long y, unsigned long width, unsigned long height); - void shaderSource(WebGLShader*, const String&, ExceptionCode&); - void stencilFunc(unsigned long func, long ref, unsigned long mask); - void stencilFuncSeparate(unsigned long face, unsigned long func, long ref, unsigned long mask); - void stencilMask(unsigned long); - void stencilMaskSeparate(unsigned long face, unsigned long mask); - void stencilOp(unsigned long fail, unsigned long zfail, unsigned long zpass); - void stencilOpSeparate(unsigned long face, unsigned long fail, unsigned long zfail, unsigned long zpass); + virtual bool is3d() const { return true; } + virtual bool isAccelerated() const { return true; } - void texImage2D(unsigned target, unsigned level, unsigned internalformat, - unsigned width, unsigned height, unsigned border, - unsigned format, unsigned type, ArrayBufferView* pixels, ExceptionCode&); - void texImage2D(unsigned target, unsigned level, unsigned internalformat, - unsigned format, unsigned type, ImageData* pixels, ExceptionCode&); - void texImage2D(unsigned target, unsigned level, unsigned internalformat, - unsigned format, unsigned type, HTMLImageElement* image, ExceptionCode&); - void texImage2D(unsigned target, unsigned level, unsigned internalformat, - unsigned format, unsigned type, HTMLCanvasElement* canvas, ExceptionCode&); - void texImage2D(unsigned target, unsigned level, unsigned internalformat, - unsigned format, unsigned type, HTMLVideoElement* video, ExceptionCode&); - // Obsolete entry points -- to be removed shortly. (FIXME) - void texImage2D(unsigned target, unsigned level, ImageData* pixels, ExceptionCode&); - void texImage2D(unsigned target, unsigned level, ImageData* pixels, bool flipY, ExceptionCode&); - void texImage2D(unsigned target, unsigned level, ImageData* pixels, bool flipY, bool premultiplyAlpha, ExceptionCode&); - void texImage2D(unsigned target, unsigned level, HTMLImageElement* image, ExceptionCode&); - void texImage2D(unsigned target, unsigned level, HTMLImageElement* image, bool flipY, ExceptionCode&); - void texImage2D(unsigned target, unsigned level, HTMLImageElement* image, bool flipY, bool premultiplyAlpha, ExceptionCode&); - void texImage2D(unsigned target, unsigned level, HTMLCanvasElement* canvas, ExceptionCode&); - void texImage2D(unsigned target, unsigned level, HTMLCanvasElement* canvas, bool flipY, ExceptionCode&); - void texImage2D(unsigned target, unsigned level, HTMLCanvasElement* canvas, bool flipY, bool premultiplyAlpha, ExceptionCode&); - void texImage2D(unsigned target, unsigned level, HTMLVideoElement* video, ExceptionCode&); - void texImage2D(unsigned target, unsigned level, HTMLVideoElement* video, bool flipY, ExceptionCode&); - void texImage2D(unsigned target, unsigned level, HTMLVideoElement* video, bool flipY, bool premultiplyAlpha, ExceptionCode&); - - void texParameterf(unsigned target, unsigned pname, float param); - void texParameteri(unsigned target, unsigned pname, int param); - - void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, - unsigned width, unsigned height, - unsigned format, unsigned type, ArrayBufferView* pixels, ExceptionCode&); - void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, - unsigned format, unsigned type, ImageData* pixels, ExceptionCode&); - void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, - unsigned format, unsigned type, HTMLImageElement* image, ExceptionCode&); - void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, - unsigned format, unsigned type, HTMLCanvasElement* canvas, ExceptionCode&); - void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, - unsigned format, unsigned type, HTMLVideoElement* video, ExceptionCode&); - // Obsolete entry points -- to be removed shortly. (FIXME) - void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, ImageData* pixels, ExceptionCode&); - void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, ImageData* pixels, bool flipY, ExceptionCode&); - void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, ImageData* pixels, bool flipY, bool premultiplyAlpha, ExceptionCode&); - void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, HTMLImageElement* image, ExceptionCode&); - void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, HTMLImageElement* image, bool flipY, ExceptionCode&); - void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, HTMLImageElement* image, bool flipY, bool premultiplyAlpha, ExceptionCode&); - void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, HTMLCanvasElement* canvas, ExceptionCode&); - void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, HTMLCanvasElement* canvas, bool flipY, ExceptionCode&); - void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, HTMLCanvasElement* canvas, bool flipY, bool premultiplyAlpha, ExceptionCode&); - void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, HTMLVideoElement* video, ExceptionCode&); - void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, HTMLVideoElement* video, bool flipY, ExceptionCode&); - void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, HTMLVideoElement* video, bool flipY, bool premultiplyAlpha, ExceptionCode&); - - void uniform1f(const WebGLUniformLocation* location, float x, ExceptionCode&); - void uniform1fv(const WebGLUniformLocation* location, Float32Array* v, ExceptionCode&); - void uniform1fv(const WebGLUniformLocation* location, float* v, int size, ExceptionCode&); - void uniform1i(const WebGLUniformLocation* location, int x, ExceptionCode&); - void uniform1iv(const WebGLUniformLocation* location, Int32Array* v, ExceptionCode&); - void uniform1iv(const WebGLUniformLocation* location, int* v, int size, ExceptionCode&); - void uniform2f(const WebGLUniformLocation* location, float x, float y, ExceptionCode&); - void uniform2fv(const WebGLUniformLocation* location, Float32Array* v, ExceptionCode&); - void uniform2fv(const WebGLUniformLocation* location, float* v, int size, ExceptionCode&); - void uniform2i(const WebGLUniformLocation* location, int x, int y, ExceptionCode&); - void uniform2iv(const WebGLUniformLocation* location, Int32Array* v, ExceptionCode&); - void uniform2iv(const WebGLUniformLocation* location, int* v, int size, ExceptionCode&); - void uniform3f(const WebGLUniformLocation* location, float x, float y, float z, ExceptionCode&); - void uniform3fv(const WebGLUniformLocation* location, Float32Array* v, ExceptionCode&); - void uniform3fv(const WebGLUniformLocation* location, float* v, int size, ExceptionCode&); - void uniform3i(const WebGLUniformLocation* location, int x, int y, int z, ExceptionCode&); - void uniform3iv(const WebGLUniformLocation* location, Int32Array* v, ExceptionCode&); - void uniform3iv(const WebGLUniformLocation* location, int* v, int size, ExceptionCode&); - void uniform4f(const WebGLUniformLocation* location, float x, float y, float z, float w, ExceptionCode&); - void uniform4fv(const WebGLUniformLocation* location, Float32Array* v, ExceptionCode&); - void uniform4fv(const WebGLUniformLocation* location, float* v, int size, ExceptionCode&); - void uniform4i(const WebGLUniformLocation* location, int x, int y, int z, int w, ExceptionCode&); - void uniform4iv(const WebGLUniformLocation* location, Int32Array* v, ExceptionCode&); - void uniform4iv(const WebGLUniformLocation* location, int* v, int size, ExceptionCode&); - void uniformMatrix2fv(const WebGLUniformLocation* location, bool transpose, Float32Array* value, ExceptionCode&); - void uniformMatrix2fv(const WebGLUniformLocation* location, bool transpose, float* value, int size, ExceptionCode&); - void uniformMatrix3fv(const WebGLUniformLocation* location, bool transpose, Float32Array* value, ExceptionCode&); - void uniformMatrix3fv(const WebGLUniformLocation* location, bool transpose, float* value, int size, ExceptionCode&); - void uniformMatrix4fv(const WebGLUniformLocation* location, bool transpose, Float32Array* value, ExceptionCode&); - void uniformMatrix4fv(const WebGLUniformLocation* location, bool transpose, float* value, int size, ExceptionCode&); - - void useProgram(WebGLProgram*, ExceptionCode&); - void validateProgram(WebGLProgram*, ExceptionCode&); - - void vertexAttrib1f(unsigned long index, float x); - void vertexAttrib1fv(unsigned long index, Float32Array* values); - void vertexAttrib1fv(unsigned long index, float* values, int size); - void vertexAttrib2f(unsigned long index, float x, float y); - void vertexAttrib2fv(unsigned long index, Float32Array* values); - void vertexAttrib2fv(unsigned long index, float* values, int size); - void vertexAttrib3f(unsigned long index, float x, float y, float z); - void vertexAttrib3fv(unsigned long index, Float32Array* values); - void vertexAttrib3fv(unsigned long index, float* values, int size); - void vertexAttrib4f(unsigned long index, float x, float y, float z, float w); - void vertexAttrib4fv(unsigned long index, Float32Array* values); - void vertexAttrib4fv(unsigned long index, float* values, int size); - void vertexAttribPointer(unsigned long index, long size, unsigned long type, bool normalized, - long stride, long offset, ExceptionCode&); - - void viewport(long x, long y, unsigned long width, unsigned long height); - - GraphicsContext3D* graphicsContext3D() const { return m_context.get(); } - - void reshape(int width, int height); - - // Return value true indicates canvas is updated during the call, - // false indicates no updates. - bool paintRenderingResultsToCanvas(); - - // Helpers for notification about paint events. - void beginPaint(); - void endPaint(); - - void removeObject(CanvasObject*); - - private: - friend class CanvasObject; - - WebGLRenderingContext(HTMLCanvasElement*, PassOwnPtr<GraphicsContext3D>); - - void addObject(CanvasObject*); - void detachAndRemoveAllObjects(); - WebGLTexture* findTexture(Platform3DObject); - WebGLRenderbuffer* findRenderbuffer(Platform3DObject); - WebGLBuffer* findBuffer(Platform3DObject); - WebGLShader* findShader(Platform3DObject); - - void markContextChanged(); - void cleanupAfterGraphicsCall(bool changed) + void activeTexture(unsigned long texture, ExceptionCode& ec); + void attachShader(WebGLProgram*, WebGLShader*, ExceptionCode& ec); + void bindAttribLocation(WebGLProgram*, unsigned long index, const String& name, ExceptionCode& ec); + void bindBuffer(unsigned long target, WebGLBuffer*, ExceptionCode& ec); + void bindFramebuffer(unsigned long target, WebGLFramebuffer*, ExceptionCode& ec); + void bindRenderbuffer(unsigned long target, WebGLRenderbuffer*, ExceptionCode& ec); + void bindTexture(unsigned long target, WebGLTexture*, ExceptionCode& ec); + void blendColor(double red, double green, double blue, double alpha); + void blendEquation(unsigned long mode); + void blendEquationSeparate(unsigned long modeRGB, unsigned long modeAlpha); + void blendFunc(unsigned long sfactor, unsigned long dfactor); + void blendFuncSeparate(unsigned long srcRGB, unsigned long dstRGB, unsigned long srcAlpha, unsigned long dstAlpha); + + void bufferData(unsigned long target, int size, unsigned long usage, ExceptionCode&); + void bufferData(unsigned long target, ArrayBuffer* data, unsigned long usage, ExceptionCode&); + void bufferData(unsigned long target, ArrayBufferView* data, unsigned long usage, ExceptionCode&); + void bufferSubData(unsigned long target, long offset, ArrayBuffer* data, ExceptionCode&); + void bufferSubData(unsigned long target, long offset, ArrayBufferView* data, ExceptionCode&); + + unsigned long checkFramebufferStatus(unsigned long target); + void clear(unsigned long mask); + void clearColor(double red, double green, double blue, double alpha); + void clearDepth(double); + void clearStencil(long); + void colorMask(bool red, bool green, bool blue, bool alpha); + void compileShader(WebGLShader*, ExceptionCode& ec); + + // void compressedTexImage2D(unsigned long target, long level, unsigned long internalformat, unsigned long width, unsigned long height, long border, unsigned long imageSize, const void* data); + // void compressedTexSubImage2D(unsigned long target, long level, long xoffset, long yoffset, unsigned long width, unsigned long height, unsigned long format, unsigned long imageSize, const void* data); + + void copyTexImage2D(unsigned long target, long level, unsigned long internalformat, long x, long y, unsigned long width, unsigned long height, long border); + void copyTexSubImage2D(unsigned long target, long level, long xoffset, long yoffset, long x, long y, unsigned long width, unsigned long height); + + PassRefPtr<WebGLBuffer> createBuffer(); + PassRefPtr<WebGLFramebuffer> createFramebuffer(); + PassRefPtr<WebGLProgram> createProgram(); + PassRefPtr<WebGLRenderbuffer> createRenderbuffer(); + PassRefPtr<WebGLShader> createShader(unsigned long type, ExceptionCode&); + PassRefPtr<WebGLTexture> createTexture(); + + void cullFace(unsigned long mode); + + void deleteBuffer(WebGLBuffer*); + void deleteFramebuffer(WebGLFramebuffer*); + void deleteProgram(WebGLProgram*); + void deleteRenderbuffer(WebGLRenderbuffer*); + void deleteShader(WebGLShader*); + void deleteTexture(WebGLTexture*); + + void depthFunc(unsigned long); + void depthMask(bool); + void depthRange(double zNear, double zFar); + void detachShader(WebGLProgram*, WebGLShader*, ExceptionCode&); + void disable(unsigned long cap); + void disableVertexAttribArray(unsigned long index, ExceptionCode&); + void drawArrays(unsigned long mode, long first, long count, ExceptionCode&); + void drawElements(unsigned long mode, long count, unsigned long type, long offset, ExceptionCode&); + + void enable(unsigned long cap); + void enableVertexAttribArray(unsigned long index, ExceptionCode&); + void finish(); + void flush(); + void framebufferRenderbuffer(unsigned long target, unsigned long attachment, unsigned long renderbuffertarget, WebGLRenderbuffer*, ExceptionCode& ec); + void framebufferTexture2D(unsigned long target, unsigned long attachment, unsigned long textarget, WebGLTexture*, long level, ExceptionCode& ec); + void frontFace(unsigned long mode); + void generateMipmap(unsigned long target); + + PassRefPtr<WebGLActiveInfo> getActiveAttrib(WebGLProgram*, unsigned long index, ExceptionCode&); + PassRefPtr<WebGLActiveInfo> getActiveUniform(WebGLProgram*, unsigned long index, ExceptionCode&); + + bool getAttachedShaders(WebGLProgram*, Vector<WebGLShader*>&, ExceptionCode&); + + int getAttribLocation(WebGLProgram*, const String& name); + + WebGLGetInfo getBufferParameter(unsigned long target, unsigned long pname, ExceptionCode&); + + PassRefPtr<WebGLContextAttributes> getContextAttributes(); + + unsigned long getError(); + + WebGLGetInfo getFramebufferAttachmentParameter(unsigned long target, unsigned long attachment, unsigned long pname, ExceptionCode&); + + WebGLGetInfo getParameter(unsigned long pname, ExceptionCode&); + + WebGLGetInfo getProgramParameter(WebGLProgram*, unsigned long pname, ExceptionCode&); + + String getProgramInfoLog(WebGLProgram*, ExceptionCode& ec); + + WebGLGetInfo getRenderbufferParameter(unsigned long target, unsigned long pname, ExceptionCode&); + + WebGLGetInfo getShaderParameter(WebGLShader*, unsigned long pname, ExceptionCode& ec); + + String getShaderInfoLog(WebGLShader*, ExceptionCode& ec); + + // TBD + // void glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision); + + String getShaderSource(WebGLShader*, ExceptionCode&); + String getString(unsigned long name); + + WebGLGetInfo getTexParameter(unsigned long target, unsigned long pname, ExceptionCode&); + + WebGLGetInfo getUniform(WebGLProgram*, const WebGLUniformLocation*, ExceptionCode&); + + PassRefPtr<WebGLUniformLocation> getUniformLocation(WebGLProgram*, const String&, ExceptionCode&); + + WebGLGetInfo getVertexAttrib(unsigned long index, unsigned long pname, ExceptionCode&); + + long getVertexAttribOffset(unsigned long index, unsigned long pname); + + void hint(unsigned long target, unsigned long mode); + bool isBuffer(WebGLBuffer*); + bool isEnabled(unsigned long cap); + bool isFramebuffer(WebGLFramebuffer*); + bool isProgram(WebGLProgram*); + bool isRenderbuffer(WebGLRenderbuffer*); + bool isShader(WebGLShader*); + bool isTexture(WebGLTexture*); + void lineWidth(double); + void linkProgram(WebGLProgram*, ExceptionCode&); + void pixelStorei(unsigned long pname, long param); + void polygonOffset(double factor, double units); + void readPixels(long x, long y, long width, long height, unsigned long format, unsigned long type, ArrayBufferView* pixels); + void releaseShaderCompiler(); + void renderbufferStorage(unsigned long target, unsigned long internalformat, unsigned long width, unsigned long height); + void sampleCoverage(double value, bool invert); + void scissor(long x, long y, unsigned long width, unsigned long height); + void shaderSource(WebGLShader*, const String&, ExceptionCode&); + void stencilFunc(unsigned long func, long ref, unsigned long mask); + void stencilFuncSeparate(unsigned long face, unsigned long func, long ref, unsigned long mask); + void stencilMask(unsigned long); + void stencilMaskSeparate(unsigned long face, unsigned long mask); + void stencilOp(unsigned long fail, unsigned long zfail, unsigned long zpass); + void stencilOpSeparate(unsigned long face, unsigned long fail, unsigned long zfail, unsigned long zpass); + + void texImage2D(unsigned target, unsigned level, unsigned internalformat, + unsigned width, unsigned height, unsigned border, + unsigned format, unsigned type, ArrayBufferView* pixels, ExceptionCode&); + void texImage2D(unsigned target, unsigned level, unsigned internalformat, + unsigned format, unsigned type, ImageData* pixels, ExceptionCode&); + void texImage2D(unsigned target, unsigned level, unsigned internalformat, + unsigned format, unsigned type, HTMLImageElement* image, ExceptionCode&); + void texImage2D(unsigned target, unsigned level, unsigned internalformat, + unsigned format, unsigned type, HTMLCanvasElement* canvas, ExceptionCode&); + void texImage2D(unsigned target, unsigned level, unsigned internalformat, + unsigned format, unsigned type, HTMLVideoElement* video, ExceptionCode&); + // Obsolete entry points -- to be removed shortly. (FIXME) + void texImage2D(unsigned target, unsigned level, ImageData* pixels, ExceptionCode&); + void texImage2D(unsigned target, unsigned level, ImageData* pixels, bool flipY, ExceptionCode&); + void texImage2D(unsigned target, unsigned level, ImageData* pixels, bool flipY, bool premultiplyAlpha, ExceptionCode&); + void texImage2D(unsigned target, unsigned level, HTMLImageElement* image, ExceptionCode&); + void texImage2D(unsigned target, unsigned level, HTMLImageElement* image, bool flipY, ExceptionCode&); + void texImage2D(unsigned target, unsigned level, HTMLImageElement* image, bool flipY, bool premultiplyAlpha, ExceptionCode&); + void texImage2D(unsigned target, unsigned level, HTMLCanvasElement* canvas, ExceptionCode&); + void texImage2D(unsigned target, unsigned level, HTMLCanvasElement* canvas, bool flipY, ExceptionCode&); + void texImage2D(unsigned target, unsigned level, HTMLCanvasElement* canvas, bool flipY, bool premultiplyAlpha, ExceptionCode&); + void texImage2D(unsigned target, unsigned level, HTMLVideoElement* video, ExceptionCode&); + void texImage2D(unsigned target, unsigned level, HTMLVideoElement* video, bool flipY, ExceptionCode&); + void texImage2D(unsigned target, unsigned level, HTMLVideoElement* video, bool flipY, bool premultiplyAlpha, ExceptionCode&); + + void texParameterf(unsigned target, unsigned pname, float param); + void texParameteri(unsigned target, unsigned pname, int param); + + void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, + unsigned width, unsigned height, + unsigned format, unsigned type, ArrayBufferView* pixels, ExceptionCode&); + void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, + unsigned format, unsigned type, ImageData* pixels, ExceptionCode&); + void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, + unsigned format, unsigned type, HTMLImageElement* image, ExceptionCode&); + void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, + unsigned format, unsigned type, HTMLCanvasElement* canvas, ExceptionCode&); + void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, + unsigned format, unsigned type, HTMLVideoElement* video, ExceptionCode&); + // Obsolete entry points -- to be removed shortly. (FIXME) + void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, ImageData* pixels, ExceptionCode&); + void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, ImageData* pixels, bool flipY, ExceptionCode&); + void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, ImageData* pixels, bool flipY, bool premultiplyAlpha, ExceptionCode&); + void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, HTMLImageElement* image, ExceptionCode&); + void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, HTMLImageElement* image, bool flipY, ExceptionCode&); + void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, HTMLImageElement* image, bool flipY, bool premultiplyAlpha, ExceptionCode&); + void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, HTMLCanvasElement* canvas, ExceptionCode&); + void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, HTMLCanvasElement* canvas, bool flipY, ExceptionCode&); + void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, HTMLCanvasElement* canvas, bool flipY, bool premultiplyAlpha, ExceptionCode&); + void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, HTMLVideoElement* video, ExceptionCode&); + void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, HTMLVideoElement* video, bool flipY, ExceptionCode&); + void texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, HTMLVideoElement* video, bool flipY, bool premultiplyAlpha, ExceptionCode&); + + void uniform1f(const WebGLUniformLocation* location, float x, ExceptionCode&); + void uniform1fv(const WebGLUniformLocation* location, Float32Array* v, ExceptionCode&); + void uniform1fv(const WebGLUniformLocation* location, float* v, int size, ExceptionCode&); + void uniform1i(const WebGLUniformLocation* location, int x, ExceptionCode&); + void uniform1iv(const WebGLUniformLocation* location, Int32Array* v, ExceptionCode&); + void uniform1iv(const WebGLUniformLocation* location, int* v, int size, ExceptionCode&); + void uniform2f(const WebGLUniformLocation* location, float x, float y, ExceptionCode&); + void uniform2fv(const WebGLUniformLocation* location, Float32Array* v, ExceptionCode&); + void uniform2fv(const WebGLUniformLocation* location, float* v, int size, ExceptionCode&); + void uniform2i(const WebGLUniformLocation* location, int x, int y, ExceptionCode&); + void uniform2iv(const WebGLUniformLocation* location, Int32Array* v, ExceptionCode&); + void uniform2iv(const WebGLUniformLocation* location, int* v, int size, ExceptionCode&); + void uniform3f(const WebGLUniformLocation* location, float x, float y, float z, ExceptionCode&); + void uniform3fv(const WebGLUniformLocation* location, Float32Array* v, ExceptionCode&); + void uniform3fv(const WebGLUniformLocation* location, float* v, int size, ExceptionCode&); + void uniform3i(const WebGLUniformLocation* location, int x, int y, int z, ExceptionCode&); + void uniform3iv(const WebGLUniformLocation* location, Int32Array* v, ExceptionCode&); + void uniform3iv(const WebGLUniformLocation* location, int* v, int size, ExceptionCode&); + void uniform4f(const WebGLUniformLocation* location, float x, float y, float z, float w, ExceptionCode&); + void uniform4fv(const WebGLUniformLocation* location, Float32Array* v, ExceptionCode&); + void uniform4fv(const WebGLUniformLocation* location, float* v, int size, ExceptionCode&); + void uniform4i(const WebGLUniformLocation* location, int x, int y, int z, int w, ExceptionCode&); + void uniform4iv(const WebGLUniformLocation* location, Int32Array* v, ExceptionCode&); + void uniform4iv(const WebGLUniformLocation* location, int* v, int size, ExceptionCode&); + void uniformMatrix2fv(const WebGLUniformLocation* location, bool transpose, Float32Array* value, ExceptionCode&); + void uniformMatrix2fv(const WebGLUniformLocation* location, bool transpose, float* value, int size, ExceptionCode&); + void uniformMatrix3fv(const WebGLUniformLocation* location, bool transpose, Float32Array* value, ExceptionCode&); + void uniformMatrix3fv(const WebGLUniformLocation* location, bool transpose, float* value, int size, ExceptionCode&); + void uniformMatrix4fv(const WebGLUniformLocation* location, bool transpose, Float32Array* value, ExceptionCode&); + void uniformMatrix4fv(const WebGLUniformLocation* location, bool transpose, float* value, int size, ExceptionCode&); + + void useProgram(WebGLProgram*, ExceptionCode&); + void validateProgram(WebGLProgram*, ExceptionCode&); + + void vertexAttrib1f(unsigned long index, float x); + void vertexAttrib1fv(unsigned long index, Float32Array* values); + void vertexAttrib1fv(unsigned long index, float* values, int size); + void vertexAttrib2f(unsigned long index, float x, float y); + void vertexAttrib2fv(unsigned long index, Float32Array* values); + void vertexAttrib2fv(unsigned long index, float* values, int size); + void vertexAttrib3f(unsigned long index, float x, float y, float z); + void vertexAttrib3fv(unsigned long index, Float32Array* values); + void vertexAttrib3fv(unsigned long index, float* values, int size); + void vertexAttrib4f(unsigned long index, float x, float y, float z, float w); + void vertexAttrib4fv(unsigned long index, Float32Array* values); + void vertexAttrib4fv(unsigned long index, float* values, int size); + void vertexAttribPointer(unsigned long index, long size, unsigned long type, bool normalized, + long stride, long offset, ExceptionCode&); + + void viewport(long x, long y, unsigned long width, unsigned long height); + + virtual GraphicsContext3D* graphicsContext3D() const { return m_context.get(); } + + void reshape(int width, int height); + + virtual void paintRenderingResultsToCanvas(); + + // Helpers for notification about paint events. + void beginPaint(); + void endPaint(); + + void removeObject(WebGLObject*); + + private: + friend class WebGLObject; + + WebGLRenderingContext(HTMLCanvasElement*, PassOwnPtr<GraphicsContext3D>); + + void addObject(WebGLObject*); + void detachAndRemoveAllObjects(); + WebGLTexture* findTexture(Platform3DObject); + WebGLRenderbuffer* findRenderbuffer(Platform3DObject); + WebGLBuffer* findBuffer(Platform3DObject); + WebGLShader* findShader(Platform3DObject); + + void markContextChanged(); + void cleanupAfterGraphicsCall(bool changed) + { + if (changed) + markContextChanged(); + } + + bool isGLES2Compliant(); + + // Helper to return the size in bytes of OpenGL data types + // like GL_FLOAT, GL_INT, etc. + int sizeInBytes(int type); + + // Basic validation of count and offset against number of elements in element array buffer + bool validateElementArraySize(unsigned long count, unsigned long type, long offset); + + // Conservative but quick index validation + bool validateIndexArrayConservative(unsigned long type, long& numElementsRequired); + + // Precise but slow index validation -- only done if conservative checks fail + bool validateIndexArrayPrecise(unsigned long count, unsigned long type, long offset, long& numElementsRequired); + bool validateRenderingState(long numElements); + + bool validateWebGLObject(WebGLObject* object); + + OwnPtr<GraphicsContext3D> m_context; + bool m_needsUpdate; + bool m_markedCanvasDirty; + // FIXME: I think this is broken -- it does not increment any + // reference counts, so may refer to destroyed objects. + HashSet<RefPtr<WebGLObject> > m_canvasObjects; + + // List of bound VBO's. Used to maintain info about sizes for ARRAY_BUFFER and stored values for ELEMENT_ARRAY_BUFFER + RefPtr<WebGLBuffer> m_boundArrayBuffer; + RefPtr<WebGLBuffer> m_boundElementArrayBuffer; + + // Cached values for vertex attrib range checks + class VertexAttribState { + public: + VertexAttribState() + : enabled(false) + , bytesPerElement(0) + , size(4) + , type(GraphicsContext3D::FLOAT) + , normalized(false) + , stride(16) + , originalStride(0) + , offset(0) { - if (changed) - markContextChanged(); + initValue(); } - bool isGLES2Compliant(); - - // Basic validation of count and offset against number of elements in element array buffer - bool validateElementArraySize(unsigned long count, unsigned long type, long offset); - - // Conservative but quick index validation - bool validateIndexArrayConservative(unsigned long type, long& numElementsRequired); - - // Precise but slow index validation -- only done if conservative checks fail - bool validateIndexArrayPrecise(unsigned long count, unsigned long type, long offset, long& numElementsRequired); - bool validateRenderingState(long numElements); - - bool validateWebGLObject(CanvasObject* object); - - OwnPtr<GraphicsContext3D> m_context; - bool m_needsUpdate; - bool m_markedCanvasDirty; - // FIXME: I think this is broken -- it does not increment any - // reference counts, so may refer to destroyed objects. - HashSet<RefPtr<CanvasObject> > m_canvasObjects; - - // List of bound VBO's. Used to maintain info about sizes for ARRAY_BUFFER and stored values for ELEMENT_ARRAY_BUFFER - RefPtr<WebGLBuffer> m_boundArrayBuffer; - RefPtr<WebGLBuffer> m_boundElementArrayBuffer; - - // Cached values for vertex attrib range checks - class VertexAttribState { - public: - VertexAttribState() - : enabled(false) - , bytesPerElement(0) - , size(4) - , type(GraphicsContext3D::FLOAT) - , normalized(false) - , stride(16) - , originalStride(0) - , offset(0) - { - initValue(); - } - - void initValue() - { - value[0] = 0.0f; - value[1] = 0.0f; - value[2] = 0.0f; - value[3] = 1.0f; - } - - bool enabled; - RefPtr<WebGLBuffer> bufferBinding; - long bytesPerElement; - long size; - unsigned long type; - bool normalized; - long stride; - long originalStride; - long offset; - float value[4]; - }; - - Vector<VertexAttribState> m_vertexAttribState; - unsigned m_maxVertexAttribs; - RefPtr<WebGLBuffer> m_vertexAttrib0Buffer; - long m_vertexAttrib0BufferSize; - float m_vertexAttrib0BufferValue[4]; - - RefPtr<WebGLProgram> m_currentProgram; - RefPtr<WebGLFramebuffer> m_framebufferBinding; - RefPtr<WebGLRenderbuffer> m_renderbufferBinding; - class TextureUnitState { - public: - RefPtr<WebGLTexture> m_texture2DBinding; - RefPtr<WebGLTexture> m_textureCubeMapBinding; - }; - Vector<TextureUnitState> m_textureUnits; - unsigned long m_activeTextureUnit; - - RefPtr<WebGLTexture> m_blackTexture2D; - RefPtr<WebGLTexture> m_blackTextureCubeMap; - - int m_maxTextureSize; - int m_maxCubeMapTextureSize; - int m_maxTextureLevel; - int m_maxCubeMapTextureLevel; - - int m_packAlignment; - int m_unpackAlignment; - unsigned long m_implementationColorReadFormat; - unsigned long m_implementationColorReadType; - bool m_unpackFlipY; - bool m_unpackPremultiplyAlpha; - - // Helpers for getParameter and others - WebGLGetInfo getBooleanParameter(unsigned long pname); - WebGLGetInfo getBooleanArrayParameter(unsigned long pname); - WebGLGetInfo getFloatParameter(unsigned long pname); - WebGLGetInfo getIntParameter(unsigned long pname); - WebGLGetInfo getLongParameter(unsigned long pname); - WebGLGetInfo getUnsignedLongParameter(unsigned long pname); - WebGLGetInfo getWebGLFloatArrayParameter(unsigned long pname); - WebGLGetInfo getWebGLIntArrayParameter(unsigned long pname); - - void texImage2DBase(unsigned target, unsigned level, unsigned internalformat, - unsigned width, unsigned height, unsigned border, - unsigned format, unsigned type, void* pixels, ExceptionCode&); - void texImage2DImpl(unsigned target, unsigned level, unsigned internalformat, - unsigned format, unsigned type, Image* image, - bool flipY, bool premultiplyAlpha, ExceptionCode&); - void texSubImage2DBase(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, - unsigned width, unsigned height, - unsigned format, unsigned type, void* pixels, ExceptionCode&); - void texSubImage2DImpl(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, - unsigned format, unsigned type, - Image* image, bool flipY, bool premultiplyAlpha, ExceptionCode&); - - void handleNPOTTextures(bool prepareToDraw); - - void createFallbackBlackTextures1x1(); - - // Helper function for copyTex{Sub}Image, check whether the internalformat - // and the color buffer format of the current bound framebuffer combination - // is valid. - bool isTexInternalFormatColorBufferCombinationValid(unsigned long texInternalFormat, - unsigned long colorBufferFormat); - - // Helper function to get the current bound texture. - WebGLTexture* getTextureBinding(unsigned long target); - - // Helper function to check input format/type for functions {copy}Tex{Sub}Image. - // Generates GL error and returns false if parameters are invalid. - bool validateTexFuncFormatAndType(unsigned long format, unsigned long type); - - // Helper function to check input parameters for functions {copy}Tex{Sub}Image. - // Generates GL error and returns false if parameters are invalid. - bool validateTexFuncParameters(unsigned long target, long level, - unsigned long internalformat, - long width, long height, long border, - unsigned long format, unsigned long type); - - // Helper function to validate that the given ArrayBufferView - // is of the correct type and contains enough data for the texImage call. - // Generates GL error and returns false if parameters are invalid. - bool validateTexFuncData(long width, long height, - unsigned long format, unsigned long type, - ArrayBufferView* pixels); - - // Helper function to validate mode for draw{Arrays/Elements}. - bool validateDrawMode(unsigned long); - - // Helper function for texParameterf and texParameteri. - void texParameter(unsigned long target, unsigned long pname, float parami, int paramf, bool isFloat); - - // Helper function to print warnings to console. Currently - // used only to warn about use of obsolete functions. - void printWarningToConsole(const String& message); - - // Helper function to validate input parameters for framebuffer functions. - // Generate GL error if parameters are illegal. - bool validateFramebufferFuncParameters(unsigned long target, unsigned long attachment); - - // Helper function to validate blend equation mode. - bool validateBlendEquation(unsigned long); - - // Helper function to validate a GL capability. - bool validateCapability(unsigned long); - - // Helper function to validate input parameters for uniform functions. - bool validateUniformParameters(const WebGLUniformLocation* location, Float32Array* v, int mod); - bool validateUniformParameters(const WebGLUniformLocation* location, Int32Array* v, int mod); - bool validateUniformParameters(const WebGLUniformLocation* location, void* v, int size, int mod); - bool validateUniformMatrixParameters(const WebGLUniformLocation* location, bool transpose, Float32Array* v, int mod); - bool validateUniformMatrixParameters(const WebGLUniformLocation* location, bool transpose, void* v, int size, int mod); - - // Helper function to validate parameters for bufferData. - // Return the current bound buffer to target, or 0 if parameters are invalid. - WebGLBuffer* validateBufferDataParameters(unsigned long target, unsigned long usage); - - // Helper functions for vertexAttribNf{v}. - void vertexAttribfImpl(unsigned long index, int expectedSize, float v0, float v1, float v2, float v3); - void vertexAttribfvImpl(unsigned long index, Float32Array* v, int expectedSize); - void vertexAttribfvImpl(unsigned long index, float* v, int size, int expectedSize); - - // Helpers for simulating vertexAttrib0 - void initVertexAttrib0(); - bool simulateVertexAttrib0(long numVertex); - void restoreStatesAfterVertexAttrib0Simulation(); - - friend class WebGLStateRestorer; + void initValue() + { + value[0] = 0.0f; + value[1] = 0.0f; + value[2] = 0.0f; + value[3] = 1.0f; + } + + bool enabled; + RefPtr<WebGLBuffer> bufferBinding; + long bytesPerElement; + long size; + unsigned long type; + bool normalized; + long stride; + long originalStride; + long offset; + float value[4]; + }; + + Vector<VertexAttribState> m_vertexAttribState; + unsigned m_maxVertexAttribs; + RefPtr<WebGLBuffer> m_vertexAttrib0Buffer; + long m_vertexAttrib0BufferSize; + float m_vertexAttrib0BufferValue[4]; + + RefPtr<WebGLProgram> m_currentProgram; + RefPtr<WebGLFramebuffer> m_framebufferBinding; + RefPtr<WebGLRenderbuffer> m_renderbufferBinding; + class TextureUnitState { + public: + RefPtr<WebGLTexture> m_texture2DBinding; + RefPtr<WebGLTexture> m_textureCubeMapBinding; }; + Vector<TextureUnitState> m_textureUnits; + unsigned long m_activeTextureUnit; + + RefPtr<WebGLTexture> m_blackTexture2D; + RefPtr<WebGLTexture> m_blackTextureCubeMap; + + int m_maxTextureSize; + int m_maxCubeMapTextureSize; + int m_maxTextureLevel; + int m_maxCubeMapTextureLevel; + + int m_packAlignment; + int m_unpackAlignment; + unsigned long m_implementationColorReadFormat; + unsigned long m_implementationColorReadType; + bool m_unpackFlipY; + bool m_unpackPremultiplyAlpha; + + // Helpers for getParameter and others + WebGLGetInfo getBooleanParameter(unsigned long pname); + WebGLGetInfo getBooleanArrayParameter(unsigned long pname); + WebGLGetInfo getFloatParameter(unsigned long pname); + WebGLGetInfo getIntParameter(unsigned long pname); + WebGLGetInfo getLongParameter(unsigned long pname); + WebGLGetInfo getUnsignedLongParameter(unsigned long pname); + WebGLGetInfo getWebGLFloatArrayParameter(unsigned long pname); + WebGLGetInfo getWebGLIntArrayParameter(unsigned long pname); + + void texImage2DBase(unsigned target, unsigned level, unsigned internalformat, + unsigned width, unsigned height, unsigned border, + unsigned format, unsigned type, void* pixels, ExceptionCode&); + void texImage2DImpl(unsigned target, unsigned level, unsigned internalformat, + unsigned format, unsigned type, Image* image, + bool flipY, bool premultiplyAlpha, ExceptionCode&); + void texSubImage2DBase(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, + unsigned width, unsigned height, + unsigned format, unsigned type, void* pixels, ExceptionCode&); + void texSubImage2DImpl(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, + unsigned format, unsigned type, + Image* image, bool flipY, bool premultiplyAlpha, ExceptionCode&); + + void handleNPOTTextures(bool prepareToDraw); + + void createFallbackBlackTextures1x1(); + + // Helper function for copyTex{Sub}Image, check whether the internalformat + // and the color buffer format of the current bound framebuffer combination + // is valid. + bool isTexInternalFormatColorBufferCombinationValid(unsigned long texInternalFormat, + unsigned long colorBufferFormat); + + // Helper function to get the current bound texture. + WebGLTexture* getTextureBinding(unsigned long target); + + // Helper function to check input format/type for functions {copy}Tex{Sub}Image. + // Generates GL error and returns false if parameters are invalid. + bool validateTexFuncFormatAndType(unsigned long format, unsigned long type); + + // Helper function to check input parameters for functions {copy}Tex{Sub}Image. + // Generates GL error and returns false if parameters are invalid. + bool validateTexFuncParameters(unsigned long target, long level, + unsigned long internalformat, + long width, long height, long border, + unsigned long format, unsigned long type); + + // Helper function to validate that the given ArrayBufferView + // is of the correct type and contains enough data for the texImage call. + // Generates GL error and returns false if parameters are invalid. + bool validateTexFuncData(long width, long height, + unsigned long format, unsigned long type, + ArrayBufferView* pixels); + + // Helper function to validate mode for draw{Arrays/Elements}. + bool validateDrawMode(unsigned long); + + // Helper function for texParameterf and texParameteri. + void texParameter(unsigned long target, unsigned long pname, float parami, int paramf, bool isFloat); + + // Helper function to print warnings to console. Currently + // used only to warn about use of obsolete functions. + void printWarningToConsole(const String& message); + + // Helper function to validate input parameters for framebuffer functions. + // Generate GL error if parameters are illegal. + bool validateFramebufferFuncParameters(unsigned long target, unsigned long attachment); + + // Helper function to validate blend equation mode. + bool validateBlendEquation(unsigned long); + + // Helper function to validate a GL capability. + bool validateCapability(unsigned long); + + // Helper function to validate input parameters for uniform functions. + bool validateUniformParameters(const WebGLUniformLocation* location, Float32Array* v, int mod); + bool validateUniformParameters(const WebGLUniformLocation* location, Int32Array* v, int mod); + bool validateUniformParameters(const WebGLUniformLocation* location, void* v, int size, int mod); + bool validateUniformMatrixParameters(const WebGLUniformLocation* location, bool transpose, Float32Array* v, int mod); + bool validateUniformMatrixParameters(const WebGLUniformLocation* location, bool transpose, void* v, int size, int mod); + + // Helper function to validate parameters for bufferData. + // Return the current bound buffer to target, or 0 if parameters are invalid. + WebGLBuffer* validateBufferDataParameters(unsigned long target, unsigned long usage); + + // Helper functions for vertexAttribNf{v}. + void vertexAttribfImpl(unsigned long index, int expectedSize, float v0, float v1, float v2, float v3); + void vertexAttribfvImpl(unsigned long index, Float32Array* v, int expectedSize); + void vertexAttribfvImpl(unsigned long index, float* v, int size, int expectedSize); + + // Helpers for simulating vertexAttrib0 + void initVertexAttrib0(); + bool simulateVertexAttrib0(long numVertex); + void restoreStatesAfterVertexAttrib0Simulation(); + + friend class WebGLStateRestorer; +}; } // namespace WebCore diff --git a/WebCore/html/canvas/WebGLRenderingContext.idl b/WebCore/html/canvas/WebGLRenderingContext.idl index 654c7aa..711aa42 100644 --- a/WebCore/html/canvas/WebGLRenderingContext.idl +++ b/WebCore/html/canvas/WebGLRenderingContext.idl @@ -464,8 +464,6 @@ module html { const unsigned int UNPACK_FLIP_Y_WEBGL = 0x9240; const unsigned int UNPACK_PREMULTIPLY_ALPHA_WEBGL = 0x9241; - long sizeInBytes(in unsigned long type) raises(DOMException); - void activeTexture(in unsigned long texture) raises(DOMException); void attachShader(in WebGLProgram program, in WebGLShader shader) raises(DOMException); void bindAttribLocation(in WebGLProgram program, in unsigned long index, in DOMString name) raises(DOMException); @@ -538,8 +536,7 @@ module html { WebGLActiveInfo getActiveUniform(in WebGLProgram program, in unsigned long index) raises (DOMException); - // Array getAttachedShaders(GLuint program) raises (DOMException); - [Custom] void getAttachedShaders(GLuint program) + [Custom] void getAttachedShaders(in WebGLProgram program) raises (DOMException); int getAttribLocation(in WebGLProgram program, in DOMString name); diff --git a/WebCore/html/canvas/WebGLShader.cpp b/WebCore/html/canvas/WebGLShader.cpp index 664d3cb..4f8bf68 100644 --- a/WebCore/html/canvas/WebGLShader.cpp +++ b/WebCore/html/canvas/WebGLShader.cpp @@ -28,6 +28,7 @@ #if ENABLE(3D_CANVAS) #include "WebGLShader.h" + #include "WebGLRenderingContext.h" namespace WebCore { @@ -38,13 +39,13 @@ PassRefPtr<WebGLShader> WebGLShader::create(WebGLRenderingContext* ctx, Graphics } WebGLShader::WebGLShader(WebGLRenderingContext* ctx, GraphicsContext3D::WebGLEnumType type) - : CanvasObject(ctx) + : WebGLObject(ctx) , m_type(type) { setObject(context()->graphicsContext3D()->createShader(type)); } -void WebGLShader::_deleteObject(Platform3DObject object) +void WebGLShader::deleteObjectImpl(Platform3DObject object) { context()->graphicsContext3D()->deleteShader(object); } diff --git a/WebCore/html/canvas/WebGLShader.h b/WebCore/html/canvas/WebGLShader.h index a0daa59..c0c41df 100644 --- a/WebCore/html/canvas/WebGLShader.h +++ b/WebCore/html/canvas/WebGLShader.h @@ -26,31 +26,31 @@ #ifndef WebGLShader_h #define WebGLShader_h -#include "CanvasObject.h" +#include "WebGLObject.h" #include <wtf/PassRefPtr.h> #include <wtf/RefCounted.h> namespace WebCore { - - class WebGLShader : public CanvasObject { - public: - virtual ~WebGLShader() { deleteObject(); } - - static PassRefPtr<WebGLShader> create(WebGLRenderingContext*, GraphicsContext3D::WebGLEnumType); - GraphicsContext3D::WebGLEnumType getType() const { return m_type; } +class WebGLShader : public WebGLObject { +public: + virtual ~WebGLShader() { deleteObject(); } - private: - WebGLShader(WebGLRenderingContext*, GraphicsContext3D::WebGLEnumType); + static PassRefPtr<WebGLShader> create(WebGLRenderingContext*, GraphicsContext3D::WebGLEnumType); - virtual void _deleteObject(Platform3DObject); + GraphicsContext3D::WebGLEnumType getType() const { return m_type; } - virtual bool isShader() const { return true; } +private: + WebGLShader(WebGLRenderingContext*, GraphicsContext3D::WebGLEnumType); + + virtual void deleteObjectImpl(Platform3DObject); + + virtual bool isShader() const { return true; } + + GraphicsContext3D::WebGLEnumType m_type; +}; - GraphicsContext3D::WebGLEnumType m_type; - }; - } // namespace WebCore #endif // WebGLShader_h diff --git a/WebCore/html/canvas/WebGLTexture.cpp b/WebCore/html/canvas/WebGLTexture.cpp index d832038..2c50bf8 100644 --- a/WebCore/html/canvas/WebGLTexture.cpp +++ b/WebCore/html/canvas/WebGLTexture.cpp @@ -28,6 +28,7 @@ #if ENABLE(3D_CANVAS) #include "WebGLTexture.h" + #include "WebGLRenderingContext.h" namespace WebCore { @@ -38,7 +39,7 @@ PassRefPtr<WebGLTexture> WebGLTexture::create(WebGLRenderingContext* ctx) } WebGLTexture::WebGLTexture(WebGLRenderingContext* ctx) - : CanvasObject(ctx) + : WebGLObject(ctx) , cubeMapRWrapModeInitialized(false) , m_target(0) , m_minFilter(GraphicsContext3D::NEAREST_MIPMAP_LINEAR) @@ -197,7 +198,7 @@ bool WebGLTexture::needToUseBlackTexture() const return m_needToUseBlackTexture; } -void WebGLTexture::_deleteObject(Platform3DObject object) +void WebGLTexture::deleteObjectImpl(Platform3DObject object) { context()->graphicsContext3D()->deleteTexture(object); } diff --git a/WebCore/html/canvas/WebGLTexture.h b/WebCore/html/canvas/WebGLTexture.h index d4a32f0..64bd6e0 100644 --- a/WebCore/html/canvas/WebGLTexture.h +++ b/WebCore/html/canvas/WebGLTexture.h @@ -26,104 +26,106 @@ #ifndef WebGLTexture_h #define WebGLTexture_h -#include "CanvasObject.h" +#include "WebGLObject.h" #include <wtf/PassRefPtr.h> #include <wtf/RefCounted.h> #include <wtf/Vector.h> namespace WebCore { - - class WebGLTexture : public CanvasObject { - public: - virtual ~WebGLTexture() { deleteObject(); } - - static PassRefPtr<WebGLTexture> create(WebGLRenderingContext*); - bool isCubeMapRWrapModeInitialized() { - return cubeMapRWrapModeInitialized; - } +class WebGLTexture : public WebGLObject { +public: + virtual ~WebGLTexture() { deleteObject(); } - void setCubeMapRWrapModeInitialized(bool initialized) { - cubeMapRWrapModeInitialized = initialized; - } + static PassRefPtr<WebGLTexture> create(WebGLRenderingContext*); - void setTarget(unsigned long target, int maxLevel); - void setParameteri(unsigned long pname, int param); - void setParameterf(unsigned long pname, float param); + bool isCubeMapRWrapModeInitialized() + { + return cubeMapRWrapModeInitialized; + } - void setLevelInfo(unsigned long target, int level, unsigned long internalFormat, int width, int height, unsigned long type); + void setCubeMapRWrapModeInitialized(bool initialized) + { + cubeMapRWrapModeInitialized = initialized; + } - bool canGenerateMipmaps(); - // Generate all level information. - void generateMipmapLevelInfo(); + void setTarget(unsigned long target, int maxLevel); + void setParameteri(unsigned long pname, int param); + void setParameterf(unsigned long pname, float param); - unsigned long getInternalFormat() const; + void setLevelInfo(unsigned long target, int level, unsigned long internalFormat, int width, int height, unsigned long type); - // Whether width/height is NotPowerOfTwo. - static bool isNPOT(unsigned, unsigned); + bool canGenerateMipmaps(); + // Generate all level information. + void generateMipmapLevelInfo(); - bool isNPOT() const; - // Determine if texture sampling should always return [0, 0, 0, 1] (OpenGL ES 2.0 Sec 3.8.2). - bool needToUseBlackTexture() const; + unsigned long getInternalFormat() const; - static int computeLevelCount(int width, int height); + // Whether width/height is NotPowerOfTwo. + static bool isNPOT(unsigned, unsigned); - protected: - WebGLTexture(WebGLRenderingContext*); + bool isNPOT() const; + // Determine if texture sampling should always return [0, 0, 0, 1] (OpenGL ES 2.0 Sec 3.8.2). + bool needToUseBlackTexture() const; - virtual void _deleteObject(Platform3DObject); + static int computeLevelCount(int width, int height); - private: - virtual bool isTexture() const { return true; } +protected: + WebGLTexture(WebGLRenderingContext*); - void update(); + virtual void deleteObjectImpl(Platform3DObject); - int mapTargetToIndex(unsigned long); +private: + virtual bool isTexture() const { return true; } - bool cubeMapRWrapModeInitialized; + void update(); - unsigned long m_target; + int mapTargetToIndex(unsigned long); - int m_minFilter; - int m_magFilter; - int m_wrapS; - int m_wrapT; + bool cubeMapRWrapModeInitialized; - class LevelInfo { - public: - LevelInfo() - : valid(false) - , internalFormat(0) - , width(0) - , height(0) - , type(0) - { - } + unsigned long m_target; - void setInfo(unsigned long internalFmt, int w, int h, unsigned long tp) - { - valid = true; - internalFormat = internalFmt; - width = w; - height = h; - type = tp; - } + int m_minFilter; + int m_magFilter; + int m_wrapS; + int m_wrapT; - bool valid; - unsigned long internalFormat; - int width; - int height; - unsigned long type; - }; + class LevelInfo { + public: + LevelInfo() + : valid(false) + , internalFormat(0) + , width(0) + , height(0) + , type(0) + { + } - Vector<Vector<LevelInfo> > m_info; + void setInfo(unsigned long internalFmt, int w, int h, unsigned long tp) + { + valid = true; + internalFormat = internalFmt; + width = w; + height = h; + type = tp; + } - bool m_isNPOT; - bool m_isComplete; - bool m_needToUseBlackTexture; + bool valid; + unsigned long internalFormat; + int width; + int height; + unsigned long type; }; - + + Vector<Vector<LevelInfo> > m_info; + + bool m_isNPOT; + bool m_isComplete; + bool m_needToUseBlackTexture; +}; + } // namespace WebCore #endif // WebGLTexture_h diff --git a/WebCore/html/canvas/WebGLUniformLocation.h b/WebCore/html/canvas/WebGLUniformLocation.h index f9f7a11..66647c5 100644 --- a/WebCore/html/canvas/WebGLUniformLocation.h +++ b/WebCore/html/canvas/WebGLUniformLocation.h @@ -27,7 +27,7 @@ #ifndef WebGLUniformLocation_h #define WebGLUniformLocation_h -#include "CanvasObject.h" +#include "WebGLObject.h" #include "WebGLProgram.h" #include <wtf/PassRefPtr.h> |