blob: 3aae120ef7eec07161c2206cdc72298f9fb75f80 [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_SANITIZER_API_SANITIZER_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_SANITIZER_API_SANITIZER_H_
#include "third_party/blink/renderer/core/dom/node.h"
#include "third_party/blink/renderer/modules/modules_export.h"
#include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
namespace blink {
class Document;
class DocumentFragment;
class ExceptionState;
class ExecutionContext;
class SanitizerConfig;
class ScriptState;
class StringOrDocumentFragmentOrDocument;
class StringOrTrustedHTMLOrDocumentFragmentOrDocument;
enum ElementKind {
kCustom,
kUnknown,
kRegular,
};
class MODULES_EXPORT Sanitizer final : public ScriptWrappable {
DEFINE_WRAPPERTYPEINFO();
public:
static Sanitizer* Create(ExecutionContext*,
const SanitizerConfig*,
ExceptionState&);
explicit Sanitizer(ExecutionContext*, const SanitizerConfig*);
~Sanitizer() override;
String sanitizeToString(ScriptState*,
StringOrDocumentFragmentOrDocument&,
ExceptionState&);
DocumentFragment* sanitize(ScriptState*,
StringOrTrustedHTMLOrDocumentFragmentOrDocument&,
ExceptionState&);
void Trace(Visitor*) const override;
private:
Node* DropElement(Node*, DocumentFragment*);
Node* BlockElement(Node*, DocumentFragment*, ExceptionState&);
Node* KeepElement(Node*, DocumentFragment*, String&, LocalDOMWindow*);
void ElementFormatter(HashSet<String>&, const Vector<String>&);
void AttrFormatter(HashMap<String, Vector<String>>&,
const Vector<std::pair<String, Vector<String>>>&);
DocumentFragment* SanitizeImpl(ScriptState*,
StringOrDocumentFragmentOrDocument&,
ExceptionState&);
HashSet<String> allow_elements_ = {};
HashSet<String> block_elements_ = {};
HashSet<String> drop_elements_ = {};
HashMap<String, Vector<String>> allow_attributes_ = {};
HashMap<String, Vector<String>> drop_attributes_ = {};
bool allow_custom_elements_ = false;
bool has_allow_elements_ = false;
bool has_allow_attributes_ = false;
// TODO(lyf): make it all-ailpan.
const HashSet<String> default_block_elements_ = {};
const HashSet<String> default_drop_elements_ = {};
const HashSet<String> default_allow_elements_ = {
"A", "ABBR", "ACRONYM", "ADDRESS", "AREA", "ARTICLE",
"ASIDE", "AUDIO", "B", "BDI", "BDO", "BIG",
"BLOCKQUOTE", "BODY", "BR", "BUTTON", "CANVAS", "CAPTION",
"CENTER", "CITE", "CODE", "COL", "COLGROUP", "DATALIST",
"DD", "DEL", "DETAILS", "DIALOG", "DFN", "DIR",
"DIV", "DL", "DT", "EM", "FIELDSET", "FIGCAPTION",
"FIGURE", "FONT", "FOOTER", "FORM", "H1", "H2",
"H3", "H4", "H5", "H6", "HEAD", "HEADER",
"HGROUP", "HR", "HTML", "I", "IMG", "INPUT",
"INS", "KBD", "KEYGEN", "LABEL", "LEGEND", "LI",
"LINK", "LISTING", "MAP", "MARK", "MENU", "META",
"METER", "NAV", "NOBR", "NOSCRIPT", "OL", "OPTGROUP",
"OPTION", "OUTPUT", "P", "PICTURE", "PRE", "PROGRESS",
"Q", "RB", "RP", "RT", "RTC", "RUBY",
"S", "SAMP", "SECTION", "SELECT", "SLOT", "SMALL",
"SOURCE", "SPAN", "STRIKE", "STRONG", "SUB", "SUMMARY",
"SUP", "STYLE", "TABLE", "TBODY", "TD", "TEXTAREA",
"TFOOT", "TH", "THEAD", "TIME", "TR", "TRACK",
"TT", "U", "UL", "VAR", "VIDEO", "WBR"};
const Vector<String> kVectorStar = Vector<String>({"*"});
const HashMap<String, Vector<String>> default_drop_attributes_ = {
{"onabort", kVectorStar},
{"onafterprint", kVectorStar},
{"onanimationstart", kVectorStar},
{"onanimationiteration", kVectorStar},
{"onanimationend", kVectorStar},
{"onauxclick", kVectorStar},
{"onbeforecopy", kVectorStar},
{"onbeforecut", kVectorStar},
{"onbeforepaste", kVectorStar},
{"onbeforeprint", kVectorStar},
{"onbeforeunload", kVectorStar},
{"onblur", kVectorStar},
{"oncancel", kVectorStar},
{"oncanplay", kVectorStar},
{"oncanplaythrough", kVectorStar},
{"onchange", kVectorStar},
{"onclick", kVectorStar},
{"onclose", kVectorStar},
{"oncontextmenu", kVectorStar},
{"oncopy", kVectorStar},
{"oncuechange", kVectorStar},
{"oncut", kVectorStar},
{"ondblclick", kVectorStar},
{"ondrag", kVectorStar},
{"ondragend", kVectorStar},
{"ondragenter", kVectorStar},
{"ondragleave", kVectorStar},
{"ondragover", kVectorStar},
{"ondragstart", kVectorStar},
{"ondrop", kVectorStar},
{"ondurationchange", kVectorStar},
{"onemptied", kVectorStar},
{"onended", kVectorStar},
{"onerror", kVectorStar},
{"onfocus", kVectorStar},
{"onfocusin", kVectorStar},
{"onfocusout", kVectorStar},
{"onformdata", kVectorStar},
{"ongotpointercapture", kVectorStar},
{"onhashchange", kVectorStar},
{"oninput", kVectorStar},
{"oninvalid", kVectorStar},
{"onkeydown", kVectorStar},
{"onkeypress", kVectorStar},
{"onkeyup", kVectorStar},
{"onlanguagechange", kVectorStar},
{"onload", kVectorStar},
{"onloadeddata", kVectorStar},
{"onloadedmetadata", kVectorStar},
{"onloadstart", kVectorStar},
{"onlostpointercapture", kVectorStar},
{"onmessage", kVectorStar},
{"onmessageerror", kVectorStar},
{"onmousedown", kVectorStar},
{"onmouseenter", kVectorStar},
{"onmouseleave", kVectorStar},
{"onmousemove", kVectorStar},
{"onmouseout", kVectorStar},
{"onmouseover", kVectorStar},
{"onmouseup", kVectorStar},
{"onmousewheel", kVectorStar},
{"ononline", kVectorStar},
{"onoffline", kVectorStar},
{"onorientationchange", kVectorStar},
{"onoverscroll", kVectorStar},
{"onpagehide", kVectorStar},
{"onpageshow", kVectorStar},
{"onpaste", kVectorStar},
{"onpause", kVectorStar},
{"onplay", kVectorStar},
{"onplaying", kVectorStar},
{"onpointercancel", kVectorStar},
{"onpointerdown", kVectorStar},
{"onpointerenter", kVectorStar},
{"onpointerleave", kVectorStar},
{"onpointermove", kVectorStar},
{"onpointerout", kVectorStar},
{"onpointerover", kVectorStar},
{"onpointerrawupdate", kVectorStar},
{"onpointerup", kVectorStar},
{"onpopstate", kVectorStar},
{"onportalactivate", kVectorStar},
{"onprogress", kVectorStar},
{"onratechange", kVectorStar},
{"onreset", kVectorStar},
{"onresize", kVectorStar},
{"onscroll", kVectorStar},
{"onscrollend", kVectorStar},
{"onsearch", kVectorStar},
{"onseeked", kVectorStar},
{"onseeking", kVectorStar},
{"onselect", kVectorStar},
{"onselectstart", kVectorStar},
{"onselectionchange", kVectorStar},
{"onshow", kVectorStar},
{"onstalled", kVectorStar},
{"onstorage", kVectorStar},
{"onsuspend", kVectorStar},
{"onsubmit", kVectorStar},
{"ontimeupdate", kVectorStar},
{"ontimezonechange", kVectorStar},
{"ontoggle", kVectorStar},
{"ontouchstart", kVectorStar},
{"ontouchmove", kVectorStar},
{"ontouchend", kVectorStar},
{"ontouchcancel", kVectorStar},
{"ontransitionend", kVectorStar},
{"onunload", kVectorStar},
{"onvolumechange", kVectorStar},
{"onwaiting", kVectorStar},
{"onwebkitanimationstart", kVectorStar},
{"onwebkitanimationiteration", kVectorStar},
{"onwebkitanimationend", kVectorStar},
{"onwebkitfullscreenchange", kVectorStar},
{"onwebkitfullscreenerror", kVectorStar},
{"onwebkittransitionend", kVectorStar},
{"onwheel", kVectorStar}};
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_SANITIZER_API_SANITIZER_H_