blob: 375225e2929df2cc352a878d227db7ccc9cda2aa [file] [log] [blame]
// Copyright 2017 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.
#include "third_party/blink/renderer/bindings/core/v8/use_counter_callback.h"
#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
#include "third_party/blink/renderer/core/execution_context/execution_context.h"
#include "third_party/blink/renderer/core/frame/deprecation.h"
#include "third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h"
#include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
namespace blink {
void UseCounterCallback(v8::Isolate* isolate,
v8::Isolate::UseCounterFeature feature) {
if (V8PerIsolateData::From(isolate)->IsUseCounterDisabled())
return;
WebFeature blink_feature;
bool deprecated = false;
switch (feature) {
case v8::Isolate::kUseAsm:
blink_feature = WebFeature::kUseAsm;
break;
case v8::Isolate::kWebAssemblyInstantiation:
blink_feature = WebFeature::kWebAssemblyInstantiation;
break;
case v8::Isolate::kBreakIterator:
blink_feature = WebFeature::kBreakIterator;
break;
case v8::Isolate::kLegacyConst:
blink_feature = WebFeature::kLegacyConst;
break;
case v8::Isolate::kSloppyMode:
blink_feature = WebFeature::kV8SloppyMode;
break;
case v8::Isolate::kStrictMode:
blink_feature = WebFeature::kV8StrictMode;
break;
case v8::Isolate::kStrongMode:
blink_feature = WebFeature::kV8StrongMode;
break;
case v8::Isolate::kRegExpPrototypeStickyGetter:
blink_feature = WebFeature::kV8RegExpPrototypeStickyGetter;
break;
case v8::Isolate::kRegExpPrototypeToString:
blink_feature = WebFeature::kV8RegExpPrototypeToString;
break;
case v8::Isolate::kRegExpPrototypeUnicodeGetter:
blink_feature = WebFeature::kV8RegExpPrototypeUnicodeGetter;
break;
case v8::Isolate::kIntlV8Parse:
blink_feature = WebFeature::kV8IntlV8Parse;
break;
case v8::Isolate::kIntlPattern:
blink_feature = WebFeature::kV8IntlPattern;
break;
case v8::Isolate::kIntlResolved:
blink_feature = WebFeature::kV8IntlResolved;
break;
case v8::Isolate::kPromiseChain:
blink_feature = WebFeature::kV8PromiseChain;
break;
case v8::Isolate::kPromiseAccept:
blink_feature = WebFeature::kV8PromiseAccept;
break;
case v8::Isolate::kPromiseDefer:
blink_feature = WebFeature::kV8PromiseDefer;
break;
case v8::Isolate::kHtmlCommentInExternalScript:
blink_feature = WebFeature::kV8HTMLCommentInExternalScript;
break;
case v8::Isolate::kHtmlComment:
blink_feature = WebFeature::kV8HTMLComment;
break;
case v8::Isolate::kSloppyModeBlockScopedFunctionRedefinition:
blink_feature = WebFeature::kV8SloppyModeBlockScopedFunctionRedefinition;
break;
case v8::Isolate::kForInInitializer:
blink_feature = WebFeature::kV8ForInInitializer;
break;
case v8::Isolate::kArrayProtectorDirtied:
blink_feature = WebFeature::kV8ArrayProtectorDirtied;
break;
case v8::Isolate::kArraySpeciesModified:
blink_feature = WebFeature::kV8ArraySpeciesModified;
break;
case v8::Isolate::kArrayPrototypeConstructorModified:
blink_feature = WebFeature::kV8ArrayPrototypeConstructorModified;
break;
case v8::Isolate::kArrayInstanceProtoModified:
blink_feature = WebFeature::kV8ArrayInstanceProtoModified;
break;
case v8::Isolate::kArrayInstanceConstructorModified:
blink_feature = WebFeature::kV8ArrayInstanceConstructorModified;
break;
case v8::Isolate::kLegacyFunctionDeclaration:
blink_feature = WebFeature::kV8LegacyFunctionDeclaration;
break;
case v8::Isolate::kRegExpPrototypeSourceGetter:
blink_feature = WebFeature::kV8RegExpPrototypeSourceGetter;
break;
case v8::Isolate::kRegExpPrototypeOldFlagGetter:
blink_feature = WebFeature::kV8RegExpPrototypeOldFlagGetter;
break;
case v8::Isolate::kDecimalWithLeadingZeroInStrictMode:
blink_feature = WebFeature::kV8DecimalWithLeadingZeroInStrictMode;
break;
case v8::Isolate::kLegacyDateParser:
blink_feature = WebFeature::kV8LegacyDateParser;
break;
case v8::Isolate::kDefineGetterOrSetterWouldThrow:
blink_feature = WebFeature::kV8DefineGetterOrSetterWouldThrow;
break;
case v8::Isolate::kFunctionConstructorReturnedUndefined:
blink_feature = WebFeature::kV8FunctionConstructorReturnedUndefined;
break;
case v8::Isolate::kAssigmentExpressionLHSIsCallInSloppy:
blink_feature = WebFeature::kV8AssigmentExpressionLHSIsCallInSloppy;
break;
case v8::Isolate::kAssigmentExpressionLHSIsCallInStrict:
blink_feature = WebFeature::kV8AssigmentExpressionLHSIsCallInStrict;
break;
case v8::Isolate::kPromiseConstructorReturnedUndefined:
blink_feature = WebFeature::kV8PromiseConstructorReturnedUndefined;
break;
case v8::Isolate::kConstructorNonUndefinedPrimitiveReturn:
blink_feature = WebFeature::kV8ConstructorNonUndefinedPrimitiveReturn;
break;
case v8::Isolate::kLabeledExpressionStatement:
blink_feature = WebFeature::kV8LabeledExpressionStatement;
break;
case v8::Isolate::kErrorCaptureStackTrace:
blink_feature = WebFeature::kV8ErrorCaptureStackTrace;
break;
case v8::Isolate::kErrorPrepareStackTrace:
blink_feature = WebFeature::kV8ErrorPrepareStackTrace;
break;
case v8::Isolate::kErrorStackTraceLimit:
blink_feature = WebFeature::kV8ErrorStackTraceLimit;
break;
case v8::Isolate::kIndexAccessor:
blink_feature = WebFeature::kV8IndexAccessor;
break;
case v8::Isolate::kDeoptimizerDisableSpeculation:
blink_feature = WebFeature::kV8DeoptimizerDisableSpeculation;
break;
case v8::Isolate::kArrayPrototypeSortJSArrayModifiedPrototype:
blink_feature = WebFeature::kV8ArrayPrototypeSortJSArrayModifiedPrototype;
break;
case v8::Isolate::kFunctionTokenOffsetTooLongForToString:
blink_feature = WebFeature::kV8FunctionTokenOffsetTooLongForToString;
break;
case v8::Isolate::kWasmSharedMemory:
blink_feature = WebFeature::kV8WasmSharedMemory;
break;
case v8::Isolate::kWasmThreadOpcodes:
blink_feature = WebFeature::kV8WasmThreadOpcodes;
break;
case v8::Isolate::kWasmSimdOpcodes:
blink_feature = WebFeature::kV8WasmSimdOpcodes;
break;
case v8::Isolate::kCollator:
blink_feature = WebFeature::kCollator;
break;
case v8::Isolate::kNumberFormat:
blink_feature = WebFeature::kNumberFormat;
break;
case v8::Isolate::kDateTimeFormat:
blink_feature = WebFeature::kDateTimeFormat;
break;
case v8::Isolate::kPluralRules:
blink_feature = WebFeature::kPluralRules;
break;
case v8::Isolate::kRelativeTimeFormat:
blink_feature = WebFeature::kRelativeTimeFormat;
break;
case v8::Isolate::kLocale:
blink_feature = WebFeature::kLocale;
break;
case v8::Isolate::kListFormat:
blink_feature = WebFeature::kListFormat;
break;
case v8::Isolate::kSegmenter:
blink_feature = WebFeature::kSegmenter;
break;
case v8::Isolate::kStringLocaleCompare:
blink_feature = WebFeature::kStringLocaleCompare;
break;
case v8::Isolate::kStringToLocaleUpperCase:
blink_feature = WebFeature::kStringToLocaleUpperCase;
break;
case v8::Isolate::kStringToLocaleLowerCase:
blink_feature = WebFeature::kStringToLocaleLowerCase;
break;
case v8::Isolate::kNumberToLocaleString:
blink_feature = WebFeature::kNumberToLocaleString;
break;
case v8::Isolate::kDateToLocaleString:
blink_feature = WebFeature::kDateToLocaleString;
break;
case v8::Isolate::kDateToLocaleDateString:
blink_feature = WebFeature::kDateToLocaleDateString;
break;
case v8::Isolate::kDateToLocaleTimeString:
blink_feature = WebFeature::kDateToLocaleTimeString;
break;
case v8::Isolate::kAttemptOverrideReadOnlyOnPrototypeSloppy:
blink_feature = WebFeature::kV8AttemptOverrideReadOnlyOnPrototypeSloppy;
break;
case v8::Isolate::kAttemptOverrideReadOnlyOnPrototypeStrict:
blink_feature = WebFeature::kV8AttemptOverrideReadOnlyOnPrototypeStrict;
break;
case v8::Isolate::kOptimizedFunctionWithOneShotBytecode:
blink_feature = WebFeature::kV8OptimizedFunctionWithOneShotBytecode;
break;
case v8::Isolate::kRegExpMatchIsTrueishOnNonJSRegExp:
blink_feature = WebFeature::kV8RegExpMatchIsTrueishOnNonJSRegExp;
break;
case v8::Isolate::kRegExpMatchIsFalseishOnJSRegExp:
blink_feature = WebFeature::kV8RegExpMatchIsFalseishOnJSRegExp;
break;
case v8::Isolate::kStringNormalize:
blink_feature = WebFeature::kV8StringNormalize;
break;
case v8::Isolate::kCallSiteAPIGetFunctionSloppyCall:
blink_feature = WebFeature::kV8CallSiteAPIGetFunctionSloppyCall;
break;
case v8::Isolate::kCallSiteAPIGetThisSloppyCall:
blink_feature = WebFeature::kV8CallSiteAPIGetThisSloppyCall;
break;
case v8::Isolate::kRegExpExecCalledOnSlowRegExp:
blink_feature = WebFeature::kV8RegExpExecCalledOnSlowRegExp;
break;
case v8::Isolate::kRegExpReplaceCalledOnSlowRegExp:
blink_feature = WebFeature::kV8RegExpReplaceCalledOnSlowRegExp;
break;
case v8::Isolate::kSharedArrayBufferConstructed: {
ExecutionContext* current_execution_context =
CurrentExecutionContext(isolate);
if (!current_execution_context->CrossOriginIsolatedCapability()) {
// It is performance critical to only file the issue once per context.
if (!current_execution_context
->has_filed_shared_array_buffer_creation_issue()) {
current_execution_context->FileSharedArrayBufferCreationIssue();
}
blink_feature =
WebFeature::kV8SharedArrayBufferConstructedWithoutIsolation;
deprecated = true;
} else {
blink_feature = WebFeature::kV8SharedArrayBufferConstructed;
}
break;
}
case v8::Isolate::kArrayPrototypeHasElements:
blink_feature = WebFeature::kV8ArrayPrototypeHasElements;
break;
case v8::Isolate::kObjectPrototypeHasElements:
blink_feature = WebFeature::kV8ObjectPrototypeHasElements;
break;
case v8::Isolate::kDisplayNames:
blink_feature = WebFeature::kDisplayNames;
break;
case v8::Isolate::kNumberFormatStyleUnit:
blink_feature = WebFeature::kNumberFormatStyleUnit;
break;
case v8::Isolate::kDateTimeFormatRange:
blink_feature = WebFeature::kDateTimeFormatRange;
break;
case v8::Isolate::kDateTimeFormatDateTimeStyle:
blink_feature = WebFeature::kDateTimeFormatDateTimeStyle;
break;
case v8::Isolate::kBreakIteratorTypeWord:
blink_feature = WebFeature::kBreakIteratorTypeWord;
break;
case v8::Isolate::kBreakIteratorTypeLine:
blink_feature = WebFeature::kBreakIteratorTypeLine;
break;
case v8::Isolate::kInvalidatedArrayBufferDetachingProtector:
blink_feature = WebFeature::kV8InvalidatedArrayBufferDetachingProtector;
break;
case v8::Isolate::kInvalidatedArrayConstructorProtector:
blink_feature = WebFeature::kV8InvalidatedArrayConstructorProtector;
break;
case v8::Isolate::kInvalidatedArrayIteratorLookupChainProtector:
blink_feature =
WebFeature::kV8InvalidatedArrayIteratorLookupChainProtector;
break;
case v8::Isolate::kInvalidatedArraySpeciesLookupChainProtector:
blink_feature =
WebFeature::kV8InvalidatedArraySpeciesLookupChainProtector;
break;
case v8::Isolate::kInvalidatedIsConcatSpreadableLookupChainProtector:
blink_feature =
WebFeature::kV8InvalidatedIsConcatSpreadableLookupChainProtector;
break;
case v8::Isolate::kInvalidatedMapIteratorLookupChainProtector:
blink_feature = WebFeature::kV8InvalidatedMapIteratorLookupChainProtector;
break;
case v8::Isolate::kInvalidatedNoElementsProtector:
blink_feature = WebFeature::kV8InvalidatedNoElementsProtector;
break;
case v8::Isolate::kInvalidatedPromiseHookProtector:
blink_feature = WebFeature::kV8InvalidatedPromiseHookProtector;
break;
case v8::Isolate::kInvalidatedPromiseResolveLookupChainProtector:
blink_feature =
WebFeature::kV8InvalidatedPromiseResolveLookupChainProtector;
break;
case v8::Isolate::kInvalidatedPromiseSpeciesLookupChainProtector:
blink_feature =
WebFeature::kV8InvalidatedPromiseSpeciesLookupChainProtector;
break;
case v8::Isolate::kInvalidatedPromiseThenLookupChainProtector:
blink_feature = WebFeature::kV8InvalidatedPromiseThenLookupChainProtector;
break;
case v8::Isolate::kInvalidatedRegExpSpeciesLookupChainProtector:
blink_feature =
WebFeature::kV8InvalidatedRegExpSpeciesLookupChainProtector;
break;
case v8::Isolate::kInvalidatedSetIteratorLookupChainProtector:
blink_feature = WebFeature::kV8InvalidatedSetIteratorLookupChainProtector;
break;
case v8::Isolate::kInvalidatedStringIteratorLookupChainProtector:
blink_feature =
WebFeature::kV8InvalidatedStringIteratorLookupChainProtector;
break;
case v8::Isolate::kInvalidatedStringLengthOverflowLookupChainProtector:
blink_feature =
WebFeature::kV8InvalidatedStringLengthOverflowLookupChainProtector;
break;
case v8::Isolate::kInvalidatedTypedArraySpeciesLookupChainProtector:
blink_feature =
WebFeature::kV8InvalidatedTypedArraySpeciesLookupChainProtector;
break;
case v8::Isolate::kVarRedeclaredCatchBinding:
blink_feature = WebFeature::kV8VarRedeclaredCatchBinding;
break;
case v8::Isolate::kWasmRefTypes:
blink_feature = WebFeature::kV8WasmRefTypes;
break;
case v8::Isolate::kWasmBulkMemory:
blink_feature = WebFeature::kV8WasmBulkMemory;
break;
case v8::Isolate::kWasmMultiValue:
blink_feature = WebFeature::kV8WasmMultiValue;
break;
case v8::Isolate::kWasmExceptionHandling:
blink_feature = WebFeature::kV8WasmExceptionHandling;
break;
default:
// This can happen if V8 has added counters that this version of Blink
// does not know about. It's harmless.
return;
}
if (deprecated) {
Deprecation::CountDeprecation(CurrentExecutionContext(isolate),
blink_feature);
} else {
UseCounter::Count(CurrentExecutionContext(isolate), blink_feature);
}
}
} // namespace blink