source: webkit/trunk/Source/WebCore/css/parser/CSSTokenizer.cpp

Last change on this file was 293484, checked in by Chris Dumez, 3 years ago

Update equalLettersIgnoringASCIICase() / startsWithLettersIgnoringASCIICase() to take in an ASCIILiteral
https://bugs.webkit.org/show_bug.cgi?id=239775

Reviewed by Geoff Garen.

Update equalLettersIgnoringASCIICase() / startsWithLettersIgnoringASCIICase() to take in an ASCIILiteral,
as we are encouraging developers to use _s suffix for string literals.

  • Tools/TestWebKitAPI/Tests/WTF/StringImpl.cpp:

(TestWebKitAPI::TEST):

  • Tools/WebKitTestRunner/InjectedBundle/atspi/AccessibilityUIElementAtspi.cpp:

(WTR::xmlRoleValueString):

  • Tools/WebKitTestRunner/cocoa/CrashReporterInfo.mm:

(WTR::testPathFromURL):

  • Source/JavaScriptCore/runtime/Options.cpp:

(JSC::parse):

  • Source/WebCore/PAL/pal/text/TextEncodingRegistry.cpp:

(PAL::defaultTextEncodingNameForSystemLanguage):

  • Source/WebDriver/WebDriverService.cpp:

(WebDriver::WebDriverService::matchCapabilities const):

  • Source/WebKit/NetworkProcess/NetworkDataTaskBlob.cpp:

(WebKit::NetworkDataTaskBlob::resume):

  • Source/WebKit/NetworkProcess/NetworkProcess.cpp:

(WebKit::NetworkProcess::preconnectTo):

  • Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp:

(WebKit::NetworkResourceLoader::didReceiveResponse):

  • Source/WebKit/NetworkProcess/cache/NetworkCache.cpp:

(WebKit::NetworkCache::isMediaMIMEType):

  • Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm:

(WebKit::NetworkDataTaskCocoa::willPerformHTTPRedirection):

  • Source/WebKit/NetworkProcess/curl/NetworkDataTaskCurl.cpp:

(WebKit::NetworkDataTaskCurl::willPerformHTTPRedirection):

  • Source/WebKit/NetworkProcess/soup/NetworkDataTaskSoup.cpp:

(WebKit::NetworkDataTaskSoup::continueHTTPRedirection):

  • Source/WebKit/UIProcess/API/C/WKWebsitePolicies.cpp:

(WKWebsitePoliciesSetCustomHeaderFields):

  • Source/WebKit/UIProcess/API/Cocoa/_WKCustomHeaderFields.mm:

(-[_WKCustomHeaderFields setFields:]):

  • Source/WebKit/UIProcess/Cocoa/MediaPermissionUtilities.mm:

(WebKit::visibleDomain):

  • Source/WebKit/UIProcess/Cocoa/WebViewImpl.mm:

(WebKit::matchesExtensionOrEquivalent):

  • Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm:

(WebKit::desktopClassBrowsingRecommendedForRequest):

  • Source/WebKit/WebProcess/WebPage/IPCTestingAPI.cpp:

(WebKit::IPCTestingAPI::encodeSharedMemory):

  • Source/WTF/wtf/Assertions.cpp:
  • Source/WTF/wtf/DateMath.cpp:

(WTF::parseDateFromNullTerminatedCharacters):

  • Source/WTF/wtf/SortedArrayMap.h:

(WTF::operator==):

  • Source/WTF/wtf/text/AtomString.h:

(WTF::equalLettersIgnoringASCIICase):

  • Source/WTF/wtf/text/StringCommon.h:

(WTF::equalLettersIgnoringASCIICase):
(WTF::equalLettersIgnoringASCIICaseCommon):
(WTF::startsWithLettersIgnoringASCIICaseCommon):
(WTF::equalLettersIgnoringASCIICaseCommonWithoutLength): Deleted.
(WTF::startsWithLettersIgnoringASCIICaseCommonWithoutLength): Deleted.

  • Source/WTF/wtf/text/StringImpl.h:

(WTF::startsWithLettersIgnoringASCIICase):
(WTF::equalLettersIgnoringASCIICase):

  • Source/WTF/wtf/text/StringView.h:

(WTF::equalLettersIgnoringASCIICase):
(WTF::startsWithLettersIgnoringASCIICase):

  • Source/WTF/wtf/text/WTFString.h:

(WTF::equalLettersIgnoringASCIICase):
(WTF::startsWithLettersIgnoringASCIICase):

  • Source/WebCore/Modules/applepay/PaymentCoordinator.cpp:

(WebCore::PaymentCoordinator::validatedPaymentNetwork const):

  • Source/WebCore/Modules/applicationmanifest/ApplicationManifestParser.cpp:

(WebCore::ApplicationManifestParser::parseIcons):

  • Source/WebCore/Modules/encryptedmedia/legacy/LegacyCDMPrivateClearKey.cpp:

(WebCore::LegacyCDMPrivateClearKey::supportsKeySystem):
(WebCore::LegacyCDMPrivateClearKey::supportsKeySystemAndMimeType):

  • Source/WebCore/Modules/encryptedmedia/legacy/LegacyCDMSessionClearKey.cpp:

(WebCore::CDMSessionClearKey::update):

  • Source/WebCore/Modules/fetch/FetchBodyConsumer.cpp:

(WebCore::FetchBodyConsumer::packageFormData):

  • Source/WebCore/Modules/mediacapabilities/MediaCapabilities.cpp:

(WebCore::isValidVideoMIMEType):
(WebCore::isValidAudioMIMEType):

  • Source/WebCore/Modules/mediarecorder/MediaRecorderProvider.cpp:

(WebCore::MediaRecorderProvider::isSupported):

  • Source/WebCore/Modules/plugins/YouTubePluginReplacement.cpp:

(WebCore::YouTubePluginReplacement::supportsMIMEType):
(WebCore::YouTubePluginReplacement::supportsFileExtension):
(WebCore::isYouTubeURL):
(WebCore::processAndCreateYouTubeURL):
(WebCore::YouTubePluginReplacement::youTubeURLFromAbsoluteURL):

  • Source/WebCore/Modules/webauthn/AuthenticatorCoordinator.cpp:

(WebCore::AuthenticatorCoordinatorInternal::needsAppIdQuirks):

  • Source/WebCore/Modules/websockets/WebSocketHandshake.cpp:

(WebCore::WebSocketHandshake::checkResponseHeaders):

  • Source/WebCore/accessibility/AXObjectCache.cpp:

(WebCore::AXObjectCache::isModalElement const):
(WebCore::AXObjectCache::handleMenuItemSelected):
(WebCore::isNodeAriaVisible):

  • Source/WebCore/accessibility/AccessibilityARIAGrid.cpp:

(WebCore::AccessibilityARIAGrid::isMultiSelectable const):

  • Source/WebCore/accessibility/AccessibilityListBoxOption.cpp:

(WebCore::AccessibilityListBoxOption::isEnabled const):

  • Source/WebCore/accessibility/AccessibilityNodeObject.cpp:

(WebCore::AccessibilityNodeObject::determineAccessibilityRoleFromNode const):
(WebCore::AccessibilityNodeObject::isEnabled const):
(WebCore::AccessibilityNodeObject::isIndeterminate const):
(WebCore::AccessibilityNodeObject::isPressed const):
(WebCore::AccessibilityNodeObject::isChecked const):
(WebCore::AccessibilityNodeObject::isMultiSelectable const):
(WebCore::AccessibilityNodeObject::isRequired const):
(WebCore::AccessibilityNodeObject::elementAttributeValue const):
(WebCore::shouldUseAccessibilityObjectInnerText):
(WebCore::AccessibilityNodeObject::textUnderElement const):

  • Source/WebCore/accessibility/AccessibilityObject.cpp:

(WebCore::AccessibilityObject::autoCompleteValue const):
(WebCore::AccessibilityObject::contentEditableAttributeIsEnabled):
(WebCore::AccessibilityObject::ariaIsMultiline const):
(WebCore::AccessibilityObject::liveRegionStatusIsEnabled):
(WebCore::AccessibilityObject::sortDirection const):
(WebCore::AccessibilityObject::popupValue const):
(WebCore::AccessibilityObject::supportsPressed const):
(WebCore::AccessibilityObject::supportsExpanded const):
(WebCore::AccessibilityObject::isExpanded const):
(WebCore::AccessibilityObject::checkboxOrRadioValue const):
(WebCore::AccessibilityObject::isAXHidden const):
(WebCore::AccessibilityObject::setIsIgnoredFromParentDataForChild):

  • Source/WebCore/accessibility/AccessibilityRenderObject.cpp:

(WebCore::AccessibilityRenderObject::hasPopup const):
(WebCore::AccessibilityRenderObject::supportsDragging const):
(WebCore::AccessibilityRenderObject::defaultObjectInclusion const):
(WebCore::AccessibilityRenderObject::isSelected const):
(WebCore::AccessibilityRenderObject::orientation const):
(WebCore::AccessibilityRenderObject::liveRegionAtomic const):

  • Source/WebCore/accessibility/AccessibilitySlider.cpp:

(WebCore::AccessibilitySlider::orientation const):

  • Source/WebCore/accessibility/mac/AccessibilityObjectMac.mm:

(WebCore::AccessibilityObject::rolePlatformDescription const):

  • Source/WebCore/animation/KeyframeEffect.cpp:

(WebCore::KeyframeEffect::processKeyframes):

  • Source/WebCore/contentextensions/ContentExtensionsBackend.cpp:

(WebCore::ContentExtensions::ContentExtensionsBackend::processContentRuleListsForLoad):

  • Source/WebCore/css/CSSFontFaceSrcValue.cpp:

(WebCore::CSSFontFaceSrcValue::isSVGFontFaceSrc const):

  • Source/WebCore/css/MediaList.cpp:

(WebCore::reportMediaQueryWarningIfNeeded):

  • Source/WebCore/css/MediaQueryEvaluator.cpp:

(WebCore::MediaQueryEvaluator::mediaTypeMatch const):
(WebCore::MediaQueryEvaluator::mediaTypeMatchSpecific const):
(WebCore::evaluateResolution):

  • Source/WebCore/css/PropertySetCSSStyleDeclaration.cpp:

(WebCore::PropertySetCSSStyleDeclaration::setProperty):

  • Source/WebCore/css/parser/CSSParserFastPaths.cpp:

(WebCore::isUniversalKeyword):

  • Source/WebCore/css/parser/CSSParserImpl.cpp:

(WebCore::consumeStringOrURI):
(WebCore::CSSParserImpl::consumeImportRule):
(WebCore::CSSParserImpl::consumeDeclaration):
(WebCore::CSSParserImpl::consumeKeyframeKeyList):

  • Source/WebCore/css/parser/CSSParserSelector.cpp:

(WebCore::CSSParserSelector::parsePagePseudoSelector):
(WebCore::CSSParserSelector::parsePseudoElementSelector):

  • Source/WebCore/css/parser/CSSParserTokenRange.cpp:

(WebCore::CSSParserTokenRange::consumeBlockCheckingForEditability):

  • Source/WebCore/css/parser/CSSPropertyParser.cpp:

(WebCore::consumeAnimationName):

  • Source/WebCore/css/parser/CSSPropertyParserWorkerSafe.cpp:

(WebCore::CSSPropertyParserHelpersWorkerSafe::consumeUnicodeRangeString):

  • Source/WebCore/css/parser/CSSSelectorParser.cpp:

(WebCore::CSSSelectorParser::consumePseudo):
(WebCore::CSSSelectorParser::consumeAttributeFlags):
(WebCore::consumeANPlusB):

  • Source/WebCore/css/parser/CSSSupportsParser.cpp:

(WebCore::CSSSupportsParser::consumeCondition):

  • Source/WebCore/css/parser/CSSTokenizer.cpp:

(WebCore::CSSTokenizer::consumeIdentLikeToken):

  • Source/WebCore/css/parser/MediaQueryParser.cpp:

(WebCore::MediaQueryParser::readMediaNot):
(WebCore::isRestrictorOrLogicalOperator):
(WebCore::MediaQueryParser::readMediaType):
(WebCore::MediaQueryParser::readAnd):
(WebCore::MediaQueryParser::handleBlocks):

  • Source/WebCore/css/parser/SizesCalcParser.cpp:

(WebCore::SizesCalcParser::calcToReversePolishNotation):

  • Source/WebCore/css/typedom/transform/CSSPerspective.cpp:

(WebCore::checkLength):

  • Source/WebCore/dom/DOMImplementation.cpp:

(WebCore::DOMImplementation::createDocument):

  • Source/WebCore/dom/Document.cpp:

(WebCore::Document::determineActiveThemeColorMetaElement):
(WebCore::Document::processColorScheme):
(WebCore::Document::processFormatDetection):
(WebCore::Document::createEvent):
(WebCore::Document::setDesignMode):
(WebCore::Document::parseDNSPrefetchControlHeader):

  • Source/WebCore/dom/Element.cpp:

(WebCore::isStyleAttribute):
(WebCore::Element::isSpellCheckingEnabled const):
(WebCore::Element::canContainRangeEndPoint const):

  • Source/WebCore/dom/InlineStyleSheetOwner.cpp:

(WebCore::isValidCSSContentType):

  • Source/WebCore/dom/ScriptElement.cpp:

(WebCore::ScriptElement::determineScriptType const):
(WebCore::ScriptElement::isScriptForEventSupported const):

  • Source/WebCore/dom/SecurityContext.cpp:

(WebCore::SecurityContext::parseSandboxPolicy):

  • Source/WebCore/dom/ViewportArguments.cpp:

(WebCore::findSizeValue):
(WebCore::findScaleValue):
(WebCore::findBooleanValue):
(WebCore::parseViewportFitValue):
(WebCore::setViewportFeature):

  • Source/WebCore/editing/EditorCommand.cpp:

(WebCore::executeDefaultParagraphSeparator):
(WebCore::executeStyleWithCSS):
(WebCore::executeUseCSS):

  • Source/WebCore/editing/TextIterator.cpp:

(WebCore::isRendererReplacedElement):

  • Source/WebCore/editing/cocoa/DataDetection.mm:

(WebCore::DataDetection::requiresExtendedContext):
(WebCore::removeResultLinksFromAnchor):
(WebCore::searchForLinkRemovingExistingDDLinks):
(WebCore::DataDetection::isDataDetectorElement):

  • Source/WebCore/history/HistoryItem.cpp:

(WebCore::HistoryItem::setFormInfoFromRequest):

  • Source/WebCore/html/Autocapitalize.cpp:

(WebCore::autocapitalizeTypeForAttributeValue):

  • Source/WebCore/html/Autofill.cpp:

(WebCore::AutofillData::createFromHTMLFormControlElement):

  • Source/WebCore/html/HTMLAnchorElement.cpp:

(WebCore::HTMLAnchorElement::draggable const):
(WebCore::HTMLAnchorElement::relList):

  • Source/WebCore/html/HTMLAreaElement.cpp:

(WebCore::HTMLAreaElement::parseAttribute):

  • Source/WebCore/html/HTMLBRElement.cpp:

(WebCore::HTMLBRElement::collectPresentationalHintsForAttribute):

  • Source/WebCore/html/HTMLBodyElement.cpp:

(WebCore::HTMLBodyElement::collectPresentationalHintsForAttribute):

  • Source/WebCore/html/HTMLButtonElement.cpp:

(WebCore::HTMLButtonElement::parseAttribute):

  • Source/WebCore/html/HTMLDivElement.cpp:

(WebCore::HTMLDivElement::collectPresentationalHintsForAttribute):

  • Source/WebCore/html/HTMLElement.cpp:

(WebCore::isLTROrRTLIgnoringCase):
(WebCore::contentEditableType):
(WebCore::HTMLElement::collectPresentationalHintsForAttribute):
(WebCore::toValidDirValue):
(WebCore::HTMLElement::applyAlignmentAttributeToStyle):
(WebCore::HTMLElement::setContentEditable):
(WebCore::HTMLElement::draggable const):
(WebCore::HTMLElement::translate const):
(WebCore::HTMLElement::hasDirectionAuto const):
(WebCore::HTMLElement::directionality const):
(WebCore::HTMLElement::dirAttributeChanged):
(WebCore::parseLegacyColorValue):
(WebCore::HTMLElement::shouldAutocorrect const):

  • Source/WebCore/html/HTMLEmbedElement.cpp:

(WebCore::HTMLEmbedElement::collectPresentationalHintsForAttribute):

  • Source/WebCore/html/HTMLFormControlElement.cpp:

(WebCore::HTMLFormControlElement::shouldAutocorrect const):

  • Source/WebCore/html/HTMLFormElement.cpp:

(WebCore::parseFormRelAttributes):
(WebCore::HTMLFormElement::shouldAutocorrect const):
(WebCore::HTMLFormElement::relList):
(WebCore::HTMLFormElement::shouldAutocomplete const):
(WebCore::HTMLFormElement::autocomplete const):

  • Source/WebCore/html/HTMLFrameElementBase.cpp:

(WebCore::HTMLFrameElementBase::scrollingMode const):

  • Source/WebCore/html/HTMLFrameSetElement.cpp:

(WebCore::HTMLFrameSetElement::parseAttribute):

  • Source/WebCore/html/HTMLHRElement.cpp:

(WebCore::HTMLHRElement::collectPresentationalHintsForAttribute):

  • Source/WebCore/html/HTMLIFrameElement.cpp:

(WebCore::HTMLIFrameElement::parseAttribute):
(WebCore::HTMLIFrameElement::loadingForBindings const):
(WebCore::isFrameLazyLoadable):

  • Source/WebCore/html/HTMLImageElement.cpp:

(WebCore::HTMLImageElement::hasLazyLoadableAttributeValue):
(WebCore::parseCrossoriginState):
(WebCore::HTMLImageElement::decodingMode const):

  • Source/WebCore/html/HTMLInputElement.cpp:

(WebCore::HTMLInputElement::parseAttribute):
(WebCore::HTMLInputElement::mediaCaptureType const):

  • Source/WebCore/html/HTMLLinkElement.cpp:

(WebCore::HTMLLinkElement::as const):
(WebCore::HTMLLinkElement::process):

  • Source/WebCore/html/HTMLMarqueeElement.cpp:

(WebCore::HTMLMarqueeElement::collectPresentationalHintsForAttribute):

  • Source/WebCore/html/HTMLMediaElement.cpp:

(WebCore::HTMLMediaElement::parseAttribute):

  • Source/WebCore/html/HTMLMenuElement.cpp:

(WebCore::HTMLMenuElement::parseAttribute):

  • Source/WebCore/html/HTMLMetaElement.cpp:

(WebCore::HTMLMetaElement::attributeChanged):
(WebCore::HTMLMetaElement::removedFromAncestor):
(WebCore::HTMLMetaElement::process):

  • Source/WebCore/html/HTMLObjectElement.cpp:

(WebCore::mapDataParamToSrc):
(WebCore::HTMLObjectElement::parametersForPlugin):
(WebCore::HTMLObjectElement::containsJavaApplet const):

  • Source/WebCore/html/HTMLParagraphElement.cpp:

(WebCore::HTMLParagraphElement::collectPresentationalHintsForAttribute):

  • Source/WebCore/html/HTMLParamElement.cpp:

(WebCore::HTMLParamElement::isURLParameter):

  • Source/WebCore/html/HTMLTableElement.cpp:

(WebCore::getBordersFromFrameAttributeValue):
(WebCore::HTMLTableElement::collectPresentationalHintsForAttribute):
(WebCore::HTMLTableElement::parseAttribute):

  • Source/WebCore/html/HTMLTablePartElement.cpp:

(WebCore::HTMLTablePartElement::collectPresentationalHintsForAttribute):

  • Source/WebCore/html/HTMLTextAreaElement.cpp:

(WebCore::HTMLTextAreaElement::parseAttribute):

  • Source/WebCore/html/HTMLTextFormControlElement.cpp:

(WebCore::HTMLTextFormControlElement::setRangeText):
(WebCore::HTMLTextFormControlElement::directionForFormData const):

  • Source/WebCore/html/HTMLVideoElement.cpp:

(WebCore::HTMLVideoElement::parseAttribute):

  • Source/WebCore/html/InputType.cpp:

(WebCore::InputType::applyStep):

  • Source/WebCore/html/LinkRelAttribute.cpp:

(WebCore::LinkRelAttribute::LinkRelAttribute):
(WebCore::LinkRelAttribute::isSupported):

  • Source/WebCore/html/MediaElementSession.cpp:

(WebCore::MediaElementSession::wirelessVideoPlaybackDisabled const):

  • Source/WebCore/html/NumberInputType.cpp:

(WebCore::NumberInputType::sizeShouldIncludeDecoration const):

  • Source/WebCore/html/RangeInputType.cpp:

(WebCore::RangeInputType::createStepRange const):
(WebCore::RangeInputType::handleKeydownEvent):

  • Source/WebCore/html/StepRange.cpp:

(WebCore::StepRange::parseStep):

  • Source/WebCore/html/canvas/CanvasStyle.cpp:

(WebCore::isCurrentColorString):

  • Source/WebCore/html/parser/CSSPreloadScanner.cpp:

(WebCore::CSSPreloadScanner::emitRule):

  • Source/WebCore/html/parser/HTMLConstructionSite.cpp:

(WebCore::HTMLConstructionSite::setCompatibilityModeFromDoctype):

  • Source/WebCore/html/parser/HTMLElementStack.cpp:

(WebCore::HTMLElementStack::isHTMLIntegrationPoint):

  • Source/WebCore/html/parser/HTMLMetaCharsetParser.cpp:

(WebCore::HTMLMetaCharsetParser::encodingFromMetaAttributes):

  • Source/WebCore/html/parser/HTMLParserIdioms.cpp:

(WebCore::parseCORSSettingsAttribute):

  • Source/WebCore/html/parser/HTMLPreloadScanner.cpp:

(WebCore::TokenPreloadScanner::StartTagScanner::processAttribute):

  • Source/WebCore/html/parser/HTMLTreeBuilder.cpp:

(WebCore::HTMLTreeBuilder::processStartTagForInBody):
(WebCore::HTMLTreeBuilder::processStartTagForInTable):

  • Source/WebCore/html/parser/ParsingUtilities.h:

(WebCore::skipExactlyIgnoringASCIICase):

  • Source/WebCore/html/track/TextTrack.cpp:

(WebCore::TextTrack::setKindKeywordIgnoringASCIICase):

  • Source/WebCore/inspector/agents/InspectorNetworkAgent.cpp:

(WebCore::InspectorNetworkAgent::shouldTreatAsText):

  • Source/WebCore/loader/CrossOriginAccessControl.cpp:

(WebCore::createPotentialAccessControlRequest):

  • Source/WebCore/loader/DocumentLoader.cpp:

(WebCore::DocumentLoader::loadApplicationManifest):

  • Source/WebCore/loader/FetchIdioms.cpp:

(WebCore::shouldBlockResponseDueToMIMEType):

  • Source/WebCore/loader/FormSubmission.cpp:

(WebCore::appendMailtoPostFormDataToURL):
(WebCore::FormSubmission::Attributes::parseEncodingType):
(WebCore::FormSubmission::Attributes::parseMethodType):

  • Source/WebCore/loader/FrameLoader.cpp:

(WebCore::FrameLoader::shouldPerformFragmentNavigation):

  • Source/WebCore/loader/LinkHeader.cpp:

(WebCore::paramterNameFromString):

  • Source/WebCore/loader/LinkLoader.cpp:

(WebCore::LinkLoader::resourceTypeFromAsAttribute):
(WebCore::LinkLoader::preconnectIfNeeded):

  • Source/WebCore/loader/ResourceCryptographicDigest.cpp:

(WebCore::parseHashAlgorithmAdvancingPosition):

  • Source/WebCore/loader/ServerTiming.cpp:

(WebCore::ServerTiming::setParameter):

  • Source/WebCore/loader/TextResourceDecoder.cpp:

(WebCore::TextResourceDecoder::determineContentType):
(WebCore::TextResourceDecoder::setEncoding):

  • Source/WebCore/loader/appcache/ApplicationCache.cpp:

(WebCore::ApplicationCache::requestIsHTTPOrHTTPSGet):

  • Source/WebCore/loader/appcache/ApplicationCacheManifestParser.cpp:

(WebCore::parseApplicationCacheManifest):

  • Source/WebCore/loader/appcache/ApplicationCacheStorage.cpp:

(WebCore::ApplicationCacheStorage::shouldStoreResourceAsFlatFile):

  • Source/WebCore/loader/cache/CachedCSSStyleSheet.cpp:

(WebCore::CachedCSSStyleSheet::mimeTypeAllowedByNosniff const):
(WebCore::CachedCSSStyleSheet::canUseSheet const):

  • Source/WebCore/loader/cache/CachedResource.cpp:

(WebCore::shouldCacheSchemeIndefinitely):

  • Source/WebCore/mathml/MathMLElement.cpp:

(WebCore::MathMLElement::collectPresentationalHintsForAttribute):

  • Source/WebCore/mathml/MathMLFractionElement.cpp:

(WebCore::MathMLFractionElement::lineThickness):
(WebCore::MathMLFractionElement::cachedFractionAlignment):

  • Source/WebCore/page/DOMSelection.cpp:

(WebCore::DOMSelection::modify):

  • Source/WebCore/page/EventSource.cpp:

(WebCore::EventSource::responseIsValid const):

  • Source/WebCore/page/FrameView.cpp:

(WebCore::FrameView::scrollToFragmentInternal):

  • Source/WebCore/page/Page.cpp:

(WebCore::Page::useDarkAppearance const):

  • Source/WebCore/page/PageConsoleClient.cpp:

(WebCore::PageConsoleClient::screenshot):

  • Source/WebCore/page/Quirks.cpp:

(WebCore::isYahooMail):
(WebCore::Quirks::needsFormControlToBeMouseFocusable const):
(WebCore::Quirks::needsSeekingSupportDisabled const):
(WebCore::Quirks::needsPerDocumentAutoplayBehavior const):
(WebCore::Quirks::shouldAutoplayWebAudioForArbitraryUserGesture const):
(WebCore::Quirks::shouldTooltipPreventFromProceedingWithClick const):
(WebCore::Quirks::needsMillisecondResolutionForHighResTimeStamp const):
(WebCore::Quirks::shouldStripQuotationMarkInFontFaceSetFamily const):
(WebCore::Quirks::isTouchBarUpdateSupressedForHiddenContentEditable const):
(WebCore::Quirks::isNeverRichlyEditableForTouchBar const):
(WebCore::shouldSuppressAutocorrectionAndAutocaptializationInHiddenEditableAreasForHost):
(WebCore::Quirks::shouldDispatchSyntheticMouseEventsWhenModifyingSelection const):
(WebCore::Quirks::needsYouTubeMouseOutQuirk const):
(WebCore::Quirks::shouldAvoidUsingIOS13ForGmail const):
(WebCore::Quirks::isGoogleMaps const):
(WebCore::Quirks::shouldDispatchSimulatedMouseEvents const):
(WebCore::Quirks::shouldDispatchedSimulatedMouseEventsAssumeDefaultPrevented const):
(WebCore::Quirks::simulatedMouseEventTypeForTarget const):
(WebCore::Quirks::shouldMakeTouchEventNonCancelableForTarget const):
(WebCore::Quirks::shouldPreventPointerMediaQueryFromEvaluatingToCoarse const):
(WebCore::Quirks::shouldPreventDispatchOfTouchEvent const):
(WebCore::Quirks::shouldAvoidResizingWhenInputViewBoundsChange const):
(WebCore::Quirks::shouldDisablePointerEventsQuirk const):
(WebCore::Quirks::needsDeferKeyDownAndKeyPressTimersUntilNextEditingCommand const):
(WebCore::Quirks::needsInputModeNoneImplicitly const):
(WebCore::Quirks::needsGMailOverflowScrollQuirk const):
(WebCore::Quirks::needsYouTubeOverflowScrollQuirk const):
(WebCore::Quirks::needsFullscreenDisplayNoneQuirk const):
(WebCore::Quirks::shouldSilenceWindowResizeEvents const):
(WebCore::Quirks::shouldSilenceMediaQueryListChangeEvents const):
(WebCore::Quirks::shouldAvoidScrollingWhenFocusedContentIsVisible const):
(WebCore::Quirks::shouldUseLegacySelectPopoverDismissalBehaviorInDataActivation const):
(WebCore::Quirks::shouldIgnoreAriaForFastPathContentObservationCheck const):
(WebCore::Quirks::shouldOpenAsAboutBlank const):
(WebCore::Quirks::shouldBypassBackForwardCache const):
(WebCore::Quirks::shouldIgnoreContentObservationForSyntheticClick const):
(WebCore::Quirks::needsVP9FullRangeFlagQuirk const):
(WebCore::Quirks::needsHDRPixelDepthQuirk const):
(WebCore::Quirks::needsBlackFullscreenBackgroundQuirk const):
(WebCore::Quirks::shouldDisableEndFullscreenEventWhenEnteringPictureInPictureFromFullscreenQuirk const):
(WebCore::Quirks::needsToForceUserSelectAndUserDragWhenInstallingImageOverlay const):

  • Source/WebCore/page/SecurityOrigin.cpp:

(WebCore::isFeedWithNestedProtocolInHTTPFamily):
(WebCore::SecurityOrigin::isLocalHostOrLoopbackIPAddress):

  • Source/WebCore/page/SecurityOriginData.cpp:

(WebCore::SecurityOriginData::databaseIdentifier const):

  • Source/WebCore/page/UserContentURLPattern.cpp:

(WebCore::UserContentURLPattern::parse):
(WebCore::UserContentURLPattern::matches const):

  • Source/WebCore/page/WindowFeatures.cpp:

(WebCore::setWindowFeature):
(WebCore::boolFeature):

  • Source/WebCore/page/csp/ContentSecurityPolicy.cpp:

(WebCore::ContentSecurityPolicy::reportUnsupportedDirective const):
(WebCore::ContentSecurityPolicy::reportInvalidSourceExpression const):

  • Source/WebCore/page/csp/ContentSecurityPolicySourceList.cpp:

(WebCore::isSourceListNone):
(WebCore::schemeIsInHttpFamily):
(WebCore::ContentSecurityPolicySourceList::isValidSourceForExtensionMode):
(WebCore::ContentSecurityPolicySourceList::parseSource):
(WebCore::ContentSecurityPolicySourceList::parseNonceSource):

  • Source/WebCore/platform/MIMETypeRegistry.cpp:

(WebCore::MIMETypeRegistry::isSupportedImageVideoOrSVGMIMEType):
(WebCore::MIMETypeRegistry::isSupportedWebAssemblyMIMEType):
(WebCore::MIMETypeRegistry::isSupportedStyleSheetMIMEType):
(WebCore::MIMETypeRegistry::isSupportedFontMIMEType):
(WebCore::MIMETypeRegistry::isTextMediaPlaylistMIMEType):
(WebCore::MIMETypeRegistry::isSupportedJSONMIMEType):
(WebCore::MIMETypeRegistry::isSupportedTextTrackMIMEType):
(WebCore::MIMETypeRegistry::isTextMIMEType):
(WebCore::MIMETypeRegistry::isXMLMIMEType):
(WebCore::MIMETypeRegistry::isXMLEntityMIMEType):
(WebCore::MIMETypeRegistry::isJavaAppletMIMEType):
(WebCore::MIMETypeRegistry::isPostScriptMIMEType):
(WebCore::MIMETypeRegistry::canShowMIMEType):

  • Source/WebCore/platform/PreviewConverter.cpp:

(WebCore::PreviewConverter::supportsMIMEType):

  • Source/WebCore/platform/ReferrerPolicy.cpp:

(WebCore::parseReferrerPolicyToken):

  • Source/WebCore/platform/encryptedmedia/clearkey/CDMClearKey.cpp:

(WebCore::parseLicenseFormat):
(WebCore::CDMFactoryClearKey::supportsKeySystem):
(WebCore::CDMPrivateClearKey::supportsInitData const):
(WebCore::CDMInstanceSessionClearKey::requestLicense):

  • Source/WebCore/platform/graphics/FontCache.cpp:

(WebCore::FontCache::alternateFamilyName):

  • Source/WebCore/platform/graphics/FontDescription.cpp:

(WebCore::computeSpecializedChineseLocale):

  • Source/WebCore/platform/graphics/FontGenericFamilies.cpp:

(WebCore::computeUserPrefersSimplified):

  • Source/WebCore/platform/graphics/MIMETypeCache.cpp:

(WebCore::MIMETypeCache::shouldOverrideExtendedType):

  • Source/WebCore/platform/graphics/MediaPlayer.cpp:

(WebCore::MediaPlayer::supportsType):

  • Source/WebCore/platform/graphics/avfoundation/CDMPrivateMediaSourceAVFObjC.mm:

(WebCore::CDMPrivateMediaSourceAVFObjC::supportsKeySystemAndMimeType):

  • Source/WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp:

(WebCore::keySystemIsSupported):

  • Source/WebCore/platform/graphics/avfoundation/objc/CDMSessionAVContentKeySession.mm:

(WebCore::CDMSessionAVContentKeySession::generateKeyRequest):

  • Source/WebCore/platform/graphics/avfoundation/objc/CDMSessionAVStreamSession.mm:

(WebCore::CDMSessionAVStreamSession::generateKeyRequest):

  • Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:

(WebCore::willUseWebMFormatReaderForType):
(WebCore::keySystemIsSupported):
(WebCore::MediaPlayerPrivateAVFoundationObjC::supportsKeySystem):

  • Source/WebCore/platform/graphics/cg/ImageBufferUtilitiesCG.cpp:

(WebCore::utiFromImageBufferMIMEType):

  • Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp:

(WebCore::FontCache::similarFont):
(WebCore::isDotPrefixedForbiddenFont):
(WebCore::fontWithFamilySpecialCase):
(WebCore::FontCache::platformAlternateFamilyName):

  • Source/WebCore/platform/graphics/cocoa/FontDescriptionCocoa.cpp:

(WebCore::matchSystemFontUse):

  • Source/WebCore/platform/graphics/cocoa/SourceBufferParserWebM.cpp:

(WebCore::SourceBufferParserWebM::isContentTypeSupported):

  • Source/WebCore/platform/graphics/cocoa/SystemFontDatabaseCoreText.cpp:

(WebCore::SystemFontDatabaseCoreText::monospaceFamily):

  • Source/WebCore/platform/graphics/freetype/FontCacheFreeType.cpp:

(WebCore::isCommonlyUsedGenericFamily):

  • Source/WebCore/platform/graphics/freetype/FontCustomPlatformDataFreeType.cpp:

(WebCore::FontCustomPlatformData::supportsFormat):

  • Source/WebCore/platform/graphics/gstreamer/DMABufVideoSinkGStreamer.cpp:

(webKitDMABufVideoSinkIsEnabled):

  • Source/WebCore/platform/graphics/gstreamer/eme/CDMThunder.cpp:

(WebCore::CDMPrivateThunder::supportsInitData const):

  • Source/WebCore/platform/graphics/mac/FontCustomPlatformData.cpp:

(WebCore::FontCustomPlatformData::supportsFormat):

  • Source/WebCore/platform/graphics/win/FontCacheWin.cpp:

(WebCore::adjustedGDIFontWeight):
(WebCore::FontCache::createFontPlatformData):
(WebCore::FontCache::platformAlternateFamilyName):

  • Source/WebCore/platform/graphics/win/FontCustomPlatformData.cpp:

(WebCore::FontCustomPlatformData::supportsFormat):

  • Source/WebCore/platform/graphics/win/FontCustomPlatformDataCairo.cpp:

(WebCore::FontCustomPlatformData::supportsFormat):

  • Source/WebCore/platform/mediarecorder/cocoa/VideoSampleBufferCompressor.mm:

(WebCore::VideoSampleBufferCompressor::create):

  • Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.cpp:

(WebCore::LibWebRTCProvider::createDecodingConfiguration):
(WebCore::LibWebRTCProvider::createEncodingConfiguration):

  • Source/WebCore/platform/network/BlobResourceHandle.cpp:

(WebCore::BlobResourceHandle::loadResourceSynchronously):
(WebCore::BlobResourceHandle::doStart):

  • Source/WebCore/platform/network/CacheValidation.cpp:

(WebCore::parseCacheControlDirectives):

  • Source/WebCore/platform/network/DataURLDecoder.cpp:

(WebCore::DataURLDecoder::shouldRemoveFragmentIdentifier):
(WebCore::DataURLDecoder::DecodeTask::process):

  • Source/WebCore/platform/network/FormData.h:

(WebCore::FormData::parseEncodingType):

  • Source/WebCore/platform/network/HTTPParsers.cpp:

(WebCore::parseContentTypeOptionsHeader):
(WebCore::parseXFrameOptionsHeader):
(WebCore::parseRange):
(WebCore::isForbiddenHeaderName):
(WebCore::isPriviledgedNoCORSRequestHeaderName):
(WebCore::isForbiddenResponseHeaderName):
(WebCore::isForbiddenMethod):
(WebCore::isCrossOriginSafeRequestHeader):

  • Source/WebCore/platform/network/MIMEHeader.cpp:

(WebCore::MIMEHeader::parseContentTransferEncoding):

  • Source/WebCore/platform/network/ResourceRequestBase.cpp:

(WebCore::shouldUseGet):

  • Source/WebCore/platform/network/ResourceResponseBase.cpp:

(WebCore::ResourceResponseBase::isAttachment const):
(WebCore::ResourceResponseBase::isAttachmentWithFilename const):

  • Source/WebCore/platform/network/cf/ResourceHandleCFURLConnectionDelegate.cpp:

(WebCore::ResourceHandleCFURLConnectionDelegate::createResourceRequest):

  • Source/WebCore/platform/network/curl/CookieUtil.cpp:

(WebCore::CookieUtil::parseCookieAttributes):

  • Source/WebCore/platform/network/curl/CurlMultipartHandle.cpp:

(WebCore::CurlMultipartHandle::extractBoundary):

  • Source/WebCore/platform/network/curl/ResourceResponseCurl.cpp:

(WebCore::ResourceResponse::isAppendableHeader):
(WebCore::ResourceResponse::appendHTTPHeaderField):

  • Source/WebCore/platform/network/mac/ResourceHandleMac.mm:

(WebCore::ResourceHandle::willSendRequest):

  • Source/WebCore/platform/sql/SQLiteDatabase.cpp:

(WebCore::SQLiteDatabase::useWALJournalMode):

  • Source/WebCore/platform/sql/SQLiteStatement.cpp:

(WebCore::SQLiteStatement::isColumnDeclaredAsBlob):

  • Source/WebCore/platform/win/PasteboardWin.cpp:

(WebCore::clipboardTypeFromMIMEType):

  • Source/WebCore/plugins/PluginData.cpp:

(WebCore::isBuiltInPDFPlugIn):

  • Source/WebCore/rendering/RenderThemeMac.mm:

(WebCore::iconForAttachment):

  • Source/WebCore/style/StyleBuilderConverter.h:

(WebCore::Style::BuilderConverter::convertTouchCallout):

  • Source/WebCore/svg/SVGAElement.cpp:

(WebCore::SVGAElement::relList):

  • Source/WebCore/svg/SVGTests.cpp:

(WebCore::SVGTests::hasFeatureForLegacyBindings):

  • Source/WebCore/svg/SVGToOTFFontConversion.cpp:

(WebCore::SVGToOTFFontConverter::compareCodepointsLexicographically):
(WebCore::SVGToOTFFontConverter::SVGToOTFFontConverter):

  • Source/WebCore/testing/Internals.cpp:

(WebCore::markerTypeFrom):
(WebCore::markerTypesFrom):
(WebCore::Internals::mediaElementHasCharacteristic):
(WebCore::Internals::setCaptionDisplayMode):
(WebCore::Internals::beginMediaSessionInterruption):
(WebCore::Internals::endMediaSessionInterruption):
(WebCore::mediaTypeFromString):
(WebCore::Internals::setMediaSessionRestrictions):
(WebCore::Internals::setMediaElementRestrictions):
(WebCore::Internals::postRemoteControlCommand):
(WebCore::Internals::setAudioContextRestrictions):
(WebCore::Internals::setMockMediaPlaybackTargetPickerState):
(WebCore::Internals::setPageMuted):
(WebCore::Internals::addPrefetchLoadEventListener):

  • Source/WebCore/testing/LegacyMockCDM.cpp:

(WebCore::LegacyMockCDM::supportsKeySystem):
(WebCore::LegacyMockCDM::supportsKeySystemAndMimeType):
(WebCore::LegacyMockCDM::supportsMIMEType):

  • Source/WebCore/testing/MockCDMFactory.cpp:

(WebCore::MockCDMFactory::supportsKeySystem):
(WebCore::MockCDM::sanitizeSessionId const):
(WebCore::MockCDMInstance::setServerCertificate):

  • Source/WebCore/workers/service/server/SWServer.cpp:

(WebCore::SWServer::canHandleScheme const):

  • Source/WebCore/xml/XMLHttpRequest.cpp:

(WebCore::XMLHttpRequest::createDecoder const):

  • Source/WebCore/xml/parser/XMLDocumentParserLibxml2.cpp:

(WebCore::shouldAllowExternalLoad):

Canonical link: https://commits.webkit.org/250018@main

File size: 25.2 KB
Line 
1// Copyright 2015 The Chromium Authors. All rights reserved.
2// Copyright (C) 2016-2021 Apple Inc. All rights reserved.
3//
4// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions are
6// met:
7//
8// * Redistributions of source code must retain the above copyright
9// notice, this list of conditions and the following disclaimer.
10// * Redistributions in binary form must reproduce the above
11// copyright notice, this list of conditions and the following disclaimer
12// in the documentation and/or other materials provided with the
13// distribution.
14// * Neither the name of Google Inc. nor the names of its
15// contributors may be used to endorse or promote products derived from
16// this software without specific prior written permission.
17//
18// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30#include "config.h"
31#include "CSSTokenizer.h"
32
33#include "CSSParserIdioms.h"
34#include "CSSParserObserverWrapper.h"
35#include "CSSParserTokenRange.h"
36#include "CSSTokenizerInputStream.h"
37#include "HTMLParserIdioms.h"
38#include "JSDOMConvertStrings.h"
39#include <wtf/text/StringBuilder.h>
40#include <wtf/text/StringToIntegerConversion.h>
41#include <wtf/unicode/CharacterNames.h>
42
43namespace WebCore {
44
45// https://drafts.csswg.org/css-syntax/#input-preprocessing
46String CSSTokenizer::preprocessString(const String& string)
47{
48 // We don't replace '\r' and '\f' with '\n' as the specification suggests, instead
49 // we treat them all the same in the isNewLine function below.
50 StringImpl* oldImpl = string.impl();
51 String replaced = makeStringByReplacingAll(string, '\0', replacementCharacter);
52 replaced = replaceUnpairedSurrogatesWithReplacementCharacter(WTFMove(replaced));
53 if (replaced.impl() != oldImpl)
54 registerString(replaced);
55 return replaced;
56}
57
58std::unique_ptr<CSSTokenizer> CSSTokenizer::tryCreate(const String& string)
59{
60 bool success = true;
61 // We can't use makeUnique here because it does not have access to this private constructor.
62 auto tokenizer = std::unique_ptr<CSSTokenizer>(new CSSTokenizer(string, nullptr, &success));
63 if (UNLIKELY(!success))
64 return nullptr;
65 return tokenizer;
66}
67
68std::unique_ptr<CSSTokenizer> CSSTokenizer::tryCreate(const String& string, CSSParserObserverWrapper& wrapper)
69{
70 bool success = true;
71 // We can't use makeUnique here because it does not have access to this private constructor.
72 auto tokenizer = std::unique_ptr<CSSTokenizer>(new CSSTokenizer(string, &wrapper, &success));
73 if (UNLIKELY(!success))
74 return nullptr;
75 return tokenizer;
76}
77
78CSSTokenizer::CSSTokenizer(const String& string)
79 : CSSTokenizer(string, nullptr, nullptr)
80{
81}
82
83CSSTokenizer::CSSTokenizer(const String& string, CSSParserObserverWrapper& wrapper)
84 : CSSTokenizer(string, &wrapper, nullptr)
85{
86}
87
88CSSTokenizer::CSSTokenizer(const String& string, CSSParserObserverWrapper* wrapper, bool* constructionSuccessPtr)
89 : m_input(preprocessString(string))
90{
91 if (constructionSuccessPtr)
92 *constructionSuccessPtr = true;
93
94 if (string.isEmpty())
95 return;
96
97 // To avoid resizing we err on the side of reserving too much space.
98 // Most strings we tokenize have about 3.5 to 5 characters per token.
99 if (UNLIKELY(!m_tokens.tryReserveInitialCapacity(string.length() / 3))) {
100 // When constructionSuccessPtr is null, our policy is to crash on failure.
101 RELEASE_ASSERT(constructionSuccessPtr);
102 *constructionSuccessPtr = false;
103 return;
104 }
105
106 unsigned offset = 0;
107 while (true) {
108 CSSParserToken token = nextToken();
109 if (token.type() == EOFToken)
110 break;
111 if (token.type() == CommentToken) {
112 if (wrapper)
113 wrapper->addComment(offset, m_input.offset(), m_tokens.size());
114 } else {
115 if (UNLIKELY(!m_tokens.tryAppend(token))) {
116 // When constructionSuccessPtr is null, our policy is to crash on failure.
117 RELEASE_ASSERT(constructionSuccessPtr);
118 *constructionSuccessPtr = false;
119 return;
120 }
121 if (wrapper)
122 wrapper->addToken(offset);
123 }
124 offset = m_input.offset();
125 }
126
127 if (wrapper) {
128 wrapper->addToken(offset);
129 wrapper->finalizeConstruction(m_tokens.begin());
130 }
131}
132
133CSSParserTokenRange CSSTokenizer::tokenRange() const
134{
135 return m_tokens;
136}
137
138unsigned CSSTokenizer::tokenCount()
139{
140 return m_tokens.size();
141}
142
143static bool isNewLine(UChar cc)
144{
145 // We check \r and \f here, since we have no preprocessing stage
146 return (cc == '\r' || cc == '\n' || cc == '\f');
147}
148
149// http://dev.w3.org/csswg/css-syntax/#check-if-two-code-points-are-a-valid-escape
150static bool twoCharsAreValidEscape(UChar first, UChar second)
151{
152 return first == '\\' && !isNewLine(second);
153}
154
155void CSSTokenizer::reconsume(UChar c)
156{
157 m_input.pushBack(c);
158}
159
160UChar CSSTokenizer::consume()
161{
162 UChar current = m_input.nextInputChar();
163 m_input.advance();
164 return current;
165}
166
167CSSParserToken CSSTokenizer::whiteSpace(UChar /*cc*/)
168{
169 m_input.advanceUntilNonWhitespace();
170 return CSSParserToken(WhitespaceToken);
171}
172
173CSSParserToken CSSTokenizer::blockStart(CSSParserTokenType type)
174{
175 m_blockStack.append(type);
176 return CSSParserToken(type, CSSParserToken::BlockStart);
177}
178
179CSSParserToken CSSTokenizer::blockStart(CSSParserTokenType blockType, CSSParserTokenType type, StringView name)
180{
181 m_blockStack.append(blockType);
182 return CSSParserToken(type, name, CSSParserToken::BlockStart);
183}
184
185CSSParserToken CSSTokenizer::blockEnd(CSSParserTokenType type, CSSParserTokenType startType)
186{
187 if (!m_blockStack.isEmpty() && m_blockStack.last() == startType) {
188 m_blockStack.removeLast();
189 return CSSParserToken(type, CSSParserToken::BlockEnd);
190 }
191 return CSSParserToken(type);
192}
193
194CSSParserToken CSSTokenizer::leftParenthesis(UChar /*cc*/)
195{
196 return blockStart(LeftParenthesisToken);
197}
198
199CSSParserToken CSSTokenizer::rightParenthesis(UChar /*cc*/)
200{
201 return blockEnd(RightParenthesisToken, LeftParenthesisToken);
202}
203
204CSSParserToken CSSTokenizer::leftBracket(UChar /*cc*/)
205{
206 return blockStart(LeftBracketToken);
207}
208
209CSSParserToken CSSTokenizer::rightBracket(UChar /*cc*/)
210{
211 return blockEnd(RightBracketToken, LeftBracketToken);
212}
213
214CSSParserToken CSSTokenizer::leftBrace(UChar /*cc*/)
215{
216 return blockStart(LeftBraceToken);
217}
218
219CSSParserToken CSSTokenizer::rightBrace(UChar /*cc*/)
220{
221 return blockEnd(RightBraceToken, LeftBraceToken);
222}
223
224CSSParserToken CSSTokenizer::plusOrFullStop(UChar cc)
225{
226 if (nextCharsAreNumber(cc)) {
227 reconsume(cc);
228 return consumeNumericToken();
229 }
230 return CSSParserToken(DelimiterToken, cc);
231}
232
233CSSParserToken CSSTokenizer::asterisk(UChar cc)
234{
235 ASSERT_UNUSED(cc, cc == '*');
236 if (consumeIfNext('='))
237 return CSSParserToken(SubstringMatchToken);
238 return CSSParserToken(DelimiterToken, '*');
239}
240
241CSSParserToken CSSTokenizer::lessThan(UChar cc)
242{
243 ASSERT_UNUSED(cc, cc == '<');
244 if (m_input.peek(0) == '!' && m_input.peek(1) == '-' && m_input.peek(2) == '-') {
245 m_input.advance(3);
246 return CSSParserToken(CDOToken);
247 }
248 return CSSParserToken(DelimiterToken, '<');
249}
250
251CSSParserToken CSSTokenizer::comma(UChar /*cc*/)
252{
253 return CSSParserToken(CommaToken);
254}
255
256CSSParserToken CSSTokenizer::hyphenMinus(UChar cc)
257{
258 if (nextCharsAreNumber(cc)) {
259 reconsume(cc);
260 return consumeNumericToken();
261 }
262 if (m_input.peek(0) == '-' && m_input.peek(1) == '>') {
263 m_input.advance(2);
264 return CSSParserToken(CDCToken);
265 }
266 if (nextCharsAreIdentifier(cc)) {
267 reconsume(cc);
268 return consumeIdentLikeToken();
269 }
270 return CSSParserToken(DelimiterToken, cc);
271}
272
273CSSParserToken CSSTokenizer::solidus(UChar cc)
274{
275 if (consumeIfNext('*')) {
276 // These get ignored, but we need a value to return.
277 consumeUntilCommentEndFound();
278 return CSSParserToken(CommentToken);
279 }
280
281 return CSSParserToken(DelimiterToken, cc);
282}
283
284CSSParserToken CSSTokenizer::colon(UChar /*cc*/)
285{
286 return CSSParserToken(ColonToken);
287}
288
289CSSParserToken CSSTokenizer::semiColon(UChar /*cc*/)
290{
291 return CSSParserToken(SemicolonToken);
292}
293
294CSSParserToken CSSTokenizer::hash(UChar cc)
295{
296 UChar nextChar = m_input.peek(0);
297 if (isNameCodePoint(nextChar) || twoCharsAreValidEscape(nextChar, m_input.peek(1))) {
298 HashTokenType type = nextCharsAreIdentifier() ? HashTokenId : HashTokenUnrestricted;
299 return CSSParserToken(type, consumeName());
300 }
301
302 return CSSParserToken(DelimiterToken, cc);
303}
304
305CSSParserToken CSSTokenizer::circumflexAccent(UChar cc)
306{
307 ASSERT_UNUSED(cc, cc == '^');
308 if (consumeIfNext('='))
309 return CSSParserToken(PrefixMatchToken);
310 return CSSParserToken(DelimiterToken, '^');
311}
312
313CSSParserToken CSSTokenizer::dollarSign(UChar cc)
314{
315 ASSERT_UNUSED(cc, cc == '$');
316 if (consumeIfNext('='))
317 return CSSParserToken(SuffixMatchToken);
318 return CSSParserToken(DelimiterToken, '$');
319}
320
321CSSParserToken CSSTokenizer::verticalLine(UChar cc)
322{
323 ASSERT_UNUSED(cc, cc == '|');
324 if (consumeIfNext('='))
325 return CSSParserToken(DashMatchToken);
326 if (consumeIfNext('|'))
327 return CSSParserToken(ColumnToken);
328 return CSSParserToken(DelimiterToken, '|');
329}
330
331CSSParserToken CSSTokenizer::tilde(UChar cc)
332{
333 ASSERT_UNUSED(cc, cc == '~');
334 if (consumeIfNext('='))
335 return CSSParserToken(IncludeMatchToken);
336 return CSSParserToken(DelimiterToken, '~');
337}
338
339CSSParserToken CSSTokenizer::commercialAt(UChar cc)
340{
341 ASSERT_UNUSED(cc, cc == '@');
342 if (nextCharsAreIdentifier())
343 return CSSParserToken(AtKeywordToken, consumeName());
344 return CSSParserToken(DelimiterToken, '@');
345}
346
347CSSParserToken CSSTokenizer::reverseSolidus(UChar cc)
348{
349 if (twoCharsAreValidEscape(cc, m_input.peek(0))) {
350 reconsume(cc);
351 return consumeIdentLikeToken();
352 }
353 return CSSParserToken(DelimiterToken, cc);
354}
355
356CSSParserToken CSSTokenizer::asciiDigit(UChar cc)
357{
358 reconsume(cc);
359 return consumeNumericToken();
360}
361
362CSSParserToken CSSTokenizer::nameStart(UChar cc)
363{
364 reconsume(cc);
365 return consumeIdentLikeToken();
366}
367
368CSSParserToken CSSTokenizer::stringStart(UChar cc)
369{
370 return consumeStringTokenUntil(cc);
371}
372
373CSSParserToken CSSTokenizer::endOfFile(UChar /*cc*/)
374{
375 return CSSParserToken(EOFToken);
376}
377
378const CSSTokenizer::CodePoint CSSTokenizer::codePoints[128] = {
379 &CSSTokenizer::endOfFile,
380 0,
381 0,
382 0,
383 0,
384 0,
385 0,
386 0,
387 0,
388 &CSSTokenizer::whiteSpace,
389 &CSSTokenizer::whiteSpace,
390 0,
391 &CSSTokenizer::whiteSpace,
392 &CSSTokenizer::whiteSpace,
393 0,
394 0,
395 0,
396 0,
397 0,
398 0,
399 0,
400 0,
401 0,
402 0,
403 0,
404 0,
405 0,
406 0,
407 0,
408 0,
409 0,
410 0,
411 &CSSTokenizer::whiteSpace,
412 0,
413 &CSSTokenizer::stringStart,
414 &CSSTokenizer::hash,
415 &CSSTokenizer::dollarSign,
416 0,
417 0,
418 &CSSTokenizer::stringStart,
419 &CSSTokenizer::leftParenthesis,
420 &CSSTokenizer::rightParenthesis,
421 &CSSTokenizer::asterisk,
422 &CSSTokenizer::plusOrFullStop,
423 &CSSTokenizer::comma,
424 &CSSTokenizer::hyphenMinus,
425 &CSSTokenizer::plusOrFullStop,
426 &CSSTokenizer::solidus,
427 &CSSTokenizer::asciiDigit,
428 &CSSTokenizer::asciiDigit,
429 &CSSTokenizer::asciiDigit,
430 &CSSTokenizer::asciiDigit,
431 &CSSTokenizer::asciiDigit,
432 &CSSTokenizer::asciiDigit,
433 &CSSTokenizer::asciiDigit,
434 &CSSTokenizer::asciiDigit,
435 &CSSTokenizer::asciiDigit,
436 &CSSTokenizer::asciiDigit,
437 &CSSTokenizer::colon,
438 &CSSTokenizer::semiColon,
439 &CSSTokenizer::lessThan,
440 0,
441 0,
442 0,
443 &CSSTokenizer::commercialAt,
444 &CSSTokenizer::nameStart,
445 &CSSTokenizer::nameStart,
446 &CSSTokenizer::nameStart,
447 &CSSTokenizer::nameStart,
448 &CSSTokenizer::nameStart,
449 &CSSTokenizer::nameStart,
450 &CSSTokenizer::nameStart,
451 &CSSTokenizer::nameStart,
452 &CSSTokenizer::nameStart,
453 &CSSTokenizer::nameStart,
454 &CSSTokenizer::nameStart,
455 &CSSTokenizer::nameStart,
456 &CSSTokenizer::nameStart,
457 &CSSTokenizer::nameStart,
458 &CSSTokenizer::nameStart,
459 &CSSTokenizer::nameStart,
460 &CSSTokenizer::nameStart,
461 &CSSTokenizer::nameStart,
462 &CSSTokenizer::nameStart,
463 &CSSTokenizer::nameStart,
464 &CSSTokenizer::nameStart,
465 &CSSTokenizer::nameStart,
466 &CSSTokenizer::nameStart,
467 &CSSTokenizer::nameStart,
468 &CSSTokenizer::nameStart,
469 &CSSTokenizer::nameStart,
470 &CSSTokenizer::leftBracket,
471 &CSSTokenizer::reverseSolidus,
472 &CSSTokenizer::rightBracket,
473 &CSSTokenizer::circumflexAccent,
474 &CSSTokenizer::nameStart,
475 0,
476 &CSSTokenizer::nameStart,
477 &CSSTokenizer::nameStart,
478 &CSSTokenizer::nameStart,
479 &CSSTokenizer::nameStart,
480 &CSSTokenizer::nameStart,
481 &CSSTokenizer::nameStart,
482 &CSSTokenizer::nameStart,
483 &CSSTokenizer::nameStart,
484 &CSSTokenizer::nameStart,
485 &CSSTokenizer::nameStart,
486 &CSSTokenizer::nameStart,
487 &CSSTokenizer::nameStart,
488 &CSSTokenizer::nameStart,
489 &CSSTokenizer::nameStart,
490 &CSSTokenizer::nameStart,
491 &CSSTokenizer::nameStart,
492 &CSSTokenizer::nameStart,
493 &CSSTokenizer::nameStart,
494 &CSSTokenizer::nameStart,
495 &CSSTokenizer::nameStart,
496 &CSSTokenizer::nameStart,
497 &CSSTokenizer::nameStart,
498 &CSSTokenizer::nameStart,
499 &CSSTokenizer::nameStart,
500 &CSSTokenizer::nameStart,
501 &CSSTokenizer::nameStart,
502 &CSSTokenizer::leftBrace,
503 &CSSTokenizer::verticalLine,
504 &CSSTokenizer::rightBrace,
505 &CSSTokenizer::tilde,
506 0,
507};
508#if !ASSERT_WITH_SECURITY_IMPLICATION_DISABLED
509const unsigned codePointsNumber = 128;
510#endif
511
512CSSParserToken CSSTokenizer::nextToken()
513{
514 // Unlike the HTMLTokenizer, the CSS Syntax spec is written
515 // as a stateless, (fixed-size) look-ahead tokenizer.
516 // We could move to the stateful model and instead create
517 // states for all the "next 3 codepoints are X" cases.
518 // State-machine tokenizers are easier to write to handle
519 // incremental tokenization of partial sources.
520 // However, for now we follow the spec exactly.
521 UChar cc = consume();
522 CodePoint codePointFunc = 0;
523
524 if (isASCII(cc)) {
525 ASSERT_WITH_SECURITY_IMPLICATION(cc < codePointsNumber);
526 codePointFunc = codePoints[cc];
527 } else
528 codePointFunc = &CSSTokenizer::nameStart;
529
530 if (codePointFunc)
531 return ((this)->*(codePointFunc))(cc);
532 return CSSParserToken(DelimiterToken, cc);
533}
534
535// This method merges the following spec sections for efficiency
536// http://www.w3.org/TR/css3-syntax/#consume-a-number
537// http://www.w3.org/TR/css3-syntax/#convert-a-string-to-a-number
538CSSParserToken CSSTokenizer::consumeNumber()
539{
540 ASSERT(nextCharsAreNumber());
541
542 auto startOffset = m_input.offset();
543
544 NumericValueType type = IntegerValueType;
545 NumericSign sign = NoSign;
546 unsigned numberLength = 0;
547
548 UChar next = m_input.peek(0);
549 if (next == '+') {
550 ++numberLength;
551 sign = PlusSign;
552 } else if (next == '-') {
553 ++numberLength;
554 sign = MinusSign;
555 }
556
557 numberLength = m_input.skipWhilePredicate<isASCIIDigit>(numberLength);
558 next = m_input.peek(numberLength);
559 if (next == '.' && isASCIIDigit(m_input.peek(numberLength + 1))) {
560 type = NumberValueType;
561 numberLength = m_input.skipWhilePredicate<isASCIIDigit>(numberLength + 2);
562 next = m_input.peek(numberLength);
563 }
564
565 if (next == 'E' || next == 'e') {
566 next = m_input.peek(numberLength + 1);
567 if (isASCIIDigit(next)) {
568 type = NumberValueType;
569 numberLength = m_input.skipWhilePredicate<isASCIIDigit>(numberLength + 1);
570 } else if ((next == '+' || next == '-') && isASCIIDigit(m_input.peek(numberLength + 2))) {
571 type = NumberValueType;
572 numberLength = m_input.skipWhilePredicate<isASCIIDigit>(numberLength + 3);
573 }
574 }
575
576 double value = m_input.getDouble(0, numberLength);
577 m_input.advance(numberLength);
578
579 return CSSParserToken(value, type, sign, m_input.rangeAt(startOffset, m_input.offset() - startOffset));
580}
581
582// http://www.w3.org/TR/css3-syntax/#consume-a-numeric-token
583CSSParserToken CSSTokenizer::consumeNumericToken()
584{
585 CSSParserToken token = consumeNumber();
586 if (nextCharsAreIdentifier())
587 token.convertToDimensionWithUnit(consumeName());
588 else if (consumeIfNext('%'))
589 token.convertToPercentage();
590 return token;
591}
592
593// http://dev.w3.org/csswg/css-syntax/#consume-ident-like-token
594CSSParserToken CSSTokenizer::consumeIdentLikeToken()
595{
596 StringView name = consumeName();
597 if (consumeIfNext('(')) {
598 if (equalLettersIgnoringASCIICase(name, "url"_s)) {
599 // The spec is slightly different so as to avoid dropping whitespace
600 // tokens, but they wouldn't be used and this is easier.
601 m_input.advanceUntilNonWhitespace();
602 UChar next = m_input.peek(0);
603 if (next != '"' && next != '\'')
604 return consumeUrlToken();
605 }
606 return blockStart(LeftParenthesisToken, FunctionToken, name);
607 }
608 return CSSParserToken(IdentToken, name);
609}
610
611// http://dev.w3.org/csswg/css-syntax/#consume-a-string-token
612CSSParserToken CSSTokenizer::consumeStringTokenUntil(UChar endingCodePoint)
613{
614 // Strings without escapes get handled without allocations
615 for (unsigned size = 0; ; size++) {
616 UChar cc = m_input.peek(size);
617 if (cc == endingCodePoint) {
618 unsigned startOffset = m_input.offset();
619 m_input.advance(size + 1);
620 return CSSParserToken(StringToken, m_input.rangeAt(startOffset, size));
621 }
622 if (isNewLine(cc)) {
623 m_input.advance(size);
624 return CSSParserToken(BadStringToken);
625 }
626 if (cc == kEndOfFileMarker || cc == '\\')
627 break;
628 }
629
630 StringBuilder output;
631 while (true) {
632 UChar cc = consume();
633 if (cc == endingCodePoint || cc == kEndOfFileMarker)
634 return CSSParserToken(StringToken, registerString(output.toString()));
635 if (isNewLine(cc)) {
636 reconsume(cc);
637 return CSSParserToken(BadStringToken);
638 }
639 if (cc == '\\') {
640 if (m_input.nextInputChar() == kEndOfFileMarker)
641 continue;
642 if (isNewLine(m_input.peek(0)))
643 consumeSingleWhitespaceIfNext(); // This handles \r\n for us
644 else
645 output.appendCharacter(consumeEscape());
646 } else
647 output.append(cc);
648 }
649}
650
651// http://dev.w3.org/csswg/css-syntax/#non-printable-code-point
652static bool isNonPrintableCodePoint(UChar cc)
653{
654 return cc <= '\x8' || cc == '\xb' || (cc >= '\xe' && cc <= '\x1f') || cc == '\x7f';
655}
656
657// http://dev.w3.org/csswg/css-syntax/#consume-url-token
658CSSParserToken CSSTokenizer::consumeUrlToken()
659{
660 m_input.advanceUntilNonWhitespace();
661
662 // URL tokens without escapes get handled without allocations
663 for (unsigned size = 0; ; size++) {
664 UChar cc = m_input.peek(size);
665 if (cc == ')') {
666 unsigned startOffset = m_input.offset();
667 m_input.advance(size + 1);
668 return CSSParserToken(UrlToken, m_input.rangeAt(startOffset, size));
669 }
670 if (cc <= ' ' || cc == '\\' || cc == '"' || cc == '\'' || cc == '(' || cc == '\x7f')
671 break;
672 }
673
674 StringBuilder result;
675 while (true) {
676 UChar cc = consume();
677 if (cc == ')' || cc == kEndOfFileMarker)
678 return CSSParserToken(UrlToken, registerString(result.toString()));
679
680 if (isHTMLSpace(cc)) {
681 m_input.advanceUntilNonWhitespace();
682 if (consumeIfNext(')') || m_input.nextInputChar() == kEndOfFileMarker)
683 return CSSParserToken(UrlToken, registerString(result.toString()));
684 break;
685 }
686
687 if (cc == '"' || cc == '\'' || cc == '(' || isNonPrintableCodePoint(cc))
688 break;
689
690 if (cc == '\\') {
691 if (twoCharsAreValidEscape(cc, m_input.peek(0))) {
692 result.appendCharacter(consumeEscape());
693 continue;
694 }
695 break;
696 }
697
698 result.append(cc);
699 }
700
701 consumeBadUrlRemnants();
702 return CSSParserToken(BadUrlToken);
703}
704
705// http://dev.w3.org/csswg/css-syntax/#consume-the-remnants-of-a-bad-url
706void CSSTokenizer::consumeBadUrlRemnants()
707{
708 while (true) {
709 UChar cc = consume();
710 if (cc == ')' || cc == kEndOfFileMarker)
711 return;
712 if (twoCharsAreValidEscape(cc, m_input.peek(0)))
713 consumeEscape();
714 }
715}
716
717void CSSTokenizer::consumeSingleWhitespaceIfNext()
718{
719 // We check for \r\n and HTML spaces since we don't do preprocessing
720 UChar next = m_input.peek(0);
721 if (next == '\r' && m_input.peek(1) == '\n')
722 m_input.advance(2);
723 else if (isHTMLSpace(next))
724 m_input.advance();
725}
726
727void CSSTokenizer::consumeUntilCommentEndFound()
728{
729 UChar c = consume();
730 while (true) {
731 if (c == kEndOfFileMarker)
732 return;
733 if (c != '*') {
734 c = consume();
735 continue;
736 }
737 c = consume();
738 if (c == '/')
739 return;
740 }
741}
742
743bool CSSTokenizer::consumeIfNext(UChar character)
744{
745 // Since we're not doing replacement we can't tell the difference from
746 // a NUL in the middle and the kEndOfFileMarker, so character must not be
747 // NUL.
748 ASSERT(character);
749 if (m_input.peek(0) == character) {
750 m_input.advance();
751 return true;
752 }
753 return false;
754}
755
756// http://www.w3.org/TR/css3-syntax/#consume-a-name
757StringView CSSTokenizer::consumeName()
758{
759 // Names without escapes get handled without allocations
760 for (unsigned size = 0; ; ++size) {
761 UChar cc = m_input.peek(size);
762 if (isNameCodePoint(cc))
763 continue;
764 // peek will return NUL when we hit the end of the
765 // input. In that case we want to still use the rangeAt() fast path
766 // below.
767 if (cc == kEndOfFileMarker && m_input.offset() + size < m_input.length())
768 break;
769 if (cc == '\\')
770 break;
771 unsigned startOffset = m_input.offset();
772 m_input.advance(size);
773 return m_input.rangeAt(startOffset, size);
774 }
775
776 StringBuilder result;
777 while (true) {
778 UChar cc = consume();
779 if (isNameCodePoint(cc)) {
780 result.append(cc);
781 continue;
782 }
783 if (twoCharsAreValidEscape(cc, m_input.peek(0))) {
784 result.appendCharacter(consumeEscape());
785 continue;
786 }
787 reconsume(cc);
788 return registerString(result.toString());
789 }
790}
791
792// http://dev.w3.org/csswg/css-syntax/#consume-an-escaped-code-point
793UChar32 CSSTokenizer::consumeEscape()
794{
795 UChar cc = consume();
796 ASSERT(!isNewLine(cc));
797 if (isASCIIHexDigit(cc)) {
798 unsigned consumedHexDigits = 1;
799 StringBuilder hexChars;
800 hexChars.append(cc);
801 while (consumedHexDigits < 6 && isASCIIHexDigit(m_input.peek(0))) {
802 cc = consume();
803 hexChars.append(cc);
804 consumedHexDigits++;
805 };
806 consumeSingleWhitespaceIfNext();
807 auto codePoint = parseInteger<uint32_t>(hexChars, 16).value();
808 if (!codePoint || (0xD800 <= codePoint && codePoint <= 0xDFFF) || codePoint > 0x10FFFF)
809 return replacementCharacter;
810 return codePoint;
811 }
812
813 if (cc == kEndOfFileMarker)
814 return replacementCharacter;
815 return cc;
816}
817
818bool CSSTokenizer::nextTwoCharsAreValidEscape()
819{
820 return twoCharsAreValidEscape(m_input.peek(0), m_input.peek(1));
821}
822
823// http://www.w3.org/TR/css3-syntax/#starts-with-a-number
824bool CSSTokenizer::nextCharsAreNumber(UChar first)
825{
826 UChar second = m_input.peek(0);
827 if (isASCIIDigit(first))
828 return true;
829 if (first == '+' || first == '-')
830 return ((isASCIIDigit(second)) || (second == '.' && isASCIIDigit(m_input.peek(1))));
831 if (first =='.')
832 return (isASCIIDigit(second));
833 return false;
834}
835
836bool CSSTokenizer::nextCharsAreNumber()
837{
838 UChar first = consume();
839 bool areNumber = nextCharsAreNumber(first);
840 reconsume(first);
841 return areNumber;
842}
843
844// http://dev.w3.org/csswg/css-syntax/#would-start-an-identifier
845bool CSSTokenizer::nextCharsAreIdentifier(UChar first)
846{
847 UChar second = m_input.peek(0);
848 if (isNameStartCodePoint(first) || twoCharsAreValidEscape(first, second))
849 return true;
850
851 if (first == '-')
852 return isNameStartCodePoint(second) || second == '-' || nextTwoCharsAreValidEscape();
853
854 return false;
855}
856
857bool CSSTokenizer::nextCharsAreIdentifier()
858{
859 UChar first = consume();
860 bool areIdentifier = nextCharsAreIdentifier(first);
861 reconsume(first);
862 return areIdentifier;
863}
864
865StringView CSSTokenizer::registerString(const String& string)
866{
867 m_stringPool.append(string);
868 return string;
869}
870
871} // namespace WebCore
Note: See TracBrowser for help on using the repository browser.