/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "ExampleStylesheet.h" #include "ReferrerInfo.h" #include "ServoBindings.h" #include "gtest/MozGTestBench.h" #include "gtest/gtest.h" #include "mozilla/Encoding.h" #include "mozilla/NullPrincipal.h" #include "mozilla/Utf8.h" #include "mozilla/css/SheetParsingMode.h" #include "nsCSSValue.h" #include "nsString.h" using namespace mozilla; using namespace mozilla::css; using namespace mozilla::dom; using namespace mozilla::net; // Bug 1436018 - Disable Stylo microbenchmark on Windows #if !defined(_WIN32) && !defined(_WIN64) # define PARSING_REPETITIONS 20 # define SETPROPERTY_REPETITIONS (1000 * 1000) # define GETPROPERTY_REPETITIONS (1000 * 1000) static void ServoParsingBench() { auto css = AsBytes(MakeStringSpan(EXAMPLE_STYLESHEET)); nsCString cssStr; cssStr.Append(css); ASSERT_EQ(Encoding::UTF8ValidUpTo(css), css.Length()); RefPtr uri = NullPrincipal::CreateURI(); nsCOMPtr referrerInfo = new ReferrerInfo(nullptr); RefPtr data = new URLExtraData(uri.forget(), referrerInfo.forget(), NullPrincipal::CreateWithoutOriginAttributes()); for (int i = 0; i < PARSING_REPETITIONS; i++) { RefPtr stylesheet = Servo_StyleSheet_FromUTF8Bytes( nullptr, nullptr, nullptr, &cssStr, eAuthorSheetFeatures, data, eCompatibility_FullStandards, nullptr, StyleAllowImportRules::Yes, StyleSanitizationKind::None, nullptr) .Consume(); } } static constexpr auto STYLE_RULE = StyleCssRuleType::Style; static void ServoSetPropertyByIdBench(const nsACString& css) { RefPtr block = Servo_DeclarationBlock_CreateEmpty().Consume(); RefPtr uri = NullPrincipal::CreateURI(); nsCOMPtr referrerInfo = new ReferrerInfo(nullptr); RefPtr data = new URLExtraData(uri.forget(), referrerInfo.forget(), NullPrincipal::CreateWithoutOriginAttributes()); ASSERT_TRUE(IsUtf8(css)); for (int i = 0; i < SETPROPERTY_REPETITIONS; i++) { Servo_DeclarationBlock_SetPropertyById( block, eCSSProperty_width, &css, /* is_important = */ false, data, StyleParsingMode::DEFAULT, eCompatibility_FullStandards, nullptr, STYLE_RULE, {}); } } static void ServoGetPropertyValueByNonCustomId() { RefPtr block = Servo_DeclarationBlock_CreateEmpty().Consume(); RefPtr uri = NullPrincipal::CreateURI(); nsCOMPtr referrerInfo = new ReferrerInfo(nullptr); RefPtr data = new URLExtraData(uri.forget(), referrerInfo.forget(), NullPrincipal::CreateWithoutOriginAttributes()); constexpr auto css_ = "10px"_ns; const nsACString& css = css_; Servo_DeclarationBlock_SetPropertyById( block, eCSSProperty_width, &css, /* is_important = */ false, data, StyleParsingMode::DEFAULT, eCompatibility_FullStandards, nullptr, STYLE_RULE, {}); for (int i = 0; i < GETPROPERTY_REPETITIONS; i++) { nsAutoCString value; Servo_DeclarationBlock_GetPropertyValueByNonCustomId( block, eCSSProperty_width, &value); ASSERT_TRUE(value.EqualsLiteral("10px")); } } MOZ_GTEST_BENCH(Stylo, Servo_StyleSheet_FromUTF8Bytes_Bench, [] { ServoParsingBench(); }); MOZ_GTEST_BENCH(Stylo, Servo_DeclarationBlock_SetPropertyById_Bench, [] { ServoSetPropertyByIdBench("10px"_ns); }); MOZ_GTEST_BENCH(Stylo, Servo_DeclarationBlock_SetPropertyById_WithInitialSpace_Bench, [] { ServoSetPropertyByIdBench(" 10px"_ns); }); MOZ_GTEST_BENCH(Stylo, Servo_DeclarationBlock_GetPropertyById_Bench, ServoGetPropertyValueByNonCustomId); #endif