/* 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 "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<nsIURI> uri = NullPrincipal::CreateURI();
nsCOMPtr<nsIReferrerInfo> referrerInfo =
new ReferrerInfo(nullptr);
auto data =
MakeRefPtr<URLExtraData>(uri.forget(), referrerInfo.forget(),
NullPrincipal::CreateWithoutOriginAttributes());
for (
int i =
0; i < PARSING_REPETITIONS; i++) {
RefPtr<StyleStylesheetContents> stylesheet =
Servo_StyleSheet_FromUTF8Bytes(
nullptr, nullptr, nullptr, &cssStr, StyleOrigin::Author, data,
eCompatibility_FullStandards, nullptr, StyleAllowImportRules::Yes,
StyleSanitizationKind::None, nullptr)
.Consume();
}
}
static constexpr
auto STYLE_RULE = StyleCssRuleType::Style;
static void ServoSetPropertyByIdBench(
const nsACString& css) {
RefPtr<StyleLockedDeclarationBlock> block =
Servo_DeclarationBlock_CreateEmpty().Consume();
RefPtr<nsIURI> uri = NullPrincipal::CreateURI();
nsCOMPtr<nsIReferrerInfo> referrerInfo =
new ReferrerInfo(nullptr);
auto data =
MakeRefPtr<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<StyleLockedDeclarationBlock> block =
Servo_DeclarationBlock_CreateEmpty().Consume();
RefPtr<nsIURI> uri = NullPrincipal::CreateURI();
nsCOMPtr<nsIReferrerInfo> referrerInfo =
new ReferrerInfo(nullptr);
auto data =
MakeRefPtr<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