gecko-dev/layout/style/ServoSpecifiedValues.cpp
J. Ryan Stinnett 8766fcbe53 Bug 1409277 - Ignore non-URLs for background pres attr. r=manishearth
Check background attribute values for the same types (URL, image) in Stylo mode
as we do in Gecko mode.

In particular, this ignores the edge case of the empty attribute, which comes
through as a string value type, and leads Stylo to trigger a load of the page
itself as the background image (since the empty URL is interpreted as relative
to the page).

MozReview-Commit-ID: CUhq5nS8kVw

--HG--
extra : rebase_source : 8a04a3175cb1a873ee7e597ad881ae64720c01ef
2017-10-20 15:24:51 -05:00

133 lines
3.4 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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 "mozilla/ServoBindings.h"
#include "mozilla/ServoSpecifiedValues.h"
namespace {
#define STYLE_STRUCT(name, checkdata_cb) | NS_STYLE_INHERIT_BIT(name)
const uint64_t ALL_SIDS = 0
#include "nsStyleStructList.h"
;
#undef STYLE_STRUCT
} // anonymous namespace
using namespace mozilla;
ServoSpecifiedValues::ServoSpecifiedValues(nsPresContext* aContext,
RawServoDeclarationBlock* aDecl)
: GenericSpecifiedValues(StyleBackendType::Servo, aContext, ALL_SIDS)
, mDecl(aDecl)
{}
bool
ServoSpecifiedValues::PropertyIsSet(nsCSSPropertyID aId)
{
return Servo_DeclarationBlock_PropertyIsSet(mDecl, aId);
}
void
ServoSpecifiedValues::SetIdentStringValue(nsCSSPropertyID aId,
const nsString& aValue)
{
RefPtr<nsAtom> atom = NS_Atomize(aValue);
SetIdentAtomValue(aId, atom);
}
void
ServoSpecifiedValues::SetIdentAtomValue(nsCSSPropertyID aId, nsAtom* aValue)
{
Servo_DeclarationBlock_SetIdentStringValue(mDecl, aId, aValue);
if (aId == eCSSProperty__x_lang) {
// This forces the lang prefs result to be cached
// so that we can access them off main thread during traversal
mPresContext->ForceCacheLang(aValue);
}
}
void
ServoSpecifiedValues::SetKeywordValue(nsCSSPropertyID aId, int32_t aValue)
{
Servo_DeclarationBlock_SetKeywordValue(mDecl, aId, aValue);
}
void
ServoSpecifiedValues::SetIntValue(nsCSSPropertyID aId, int32_t aValue)
{
Servo_DeclarationBlock_SetIntValue(mDecl, aId, aValue);
}
void
ServoSpecifiedValues::SetPixelValue(nsCSSPropertyID aId, float aValue)
{
Servo_DeclarationBlock_SetPixelValue(mDecl, aId, aValue);
}
void
ServoSpecifiedValues::SetLengthValue(nsCSSPropertyID aId, nsCSSValue aValue)
{
MOZ_ASSERT(aValue.IsLengthUnit());
Servo_DeclarationBlock_SetLengthValue(
mDecl, aId, aValue.GetFloatValue(), aValue.GetUnit());
}
void
ServoSpecifiedValues::SetNumberValue(nsCSSPropertyID aId, float aValue)
{
Servo_DeclarationBlock_SetNumberValue(mDecl, aId, aValue);
}
void
ServoSpecifiedValues::SetPercentValue(nsCSSPropertyID aId, float aValue)
{
Servo_DeclarationBlock_SetPercentValue(mDecl, aId, aValue);
}
void
ServoSpecifiedValues::SetAutoValue(nsCSSPropertyID aId)
{
Servo_DeclarationBlock_SetAutoValue(mDecl, aId);
}
void
ServoSpecifiedValues::SetCurrentColor(nsCSSPropertyID aId)
{
Servo_DeclarationBlock_SetCurrentColor(mDecl, aId);
}
void
ServoSpecifiedValues::SetColorValue(nsCSSPropertyID aId, nscolor aColor)
{
Servo_DeclarationBlock_SetColorValue(mDecl, aId, aColor);
}
void
ServoSpecifiedValues::SetFontFamily(const nsString& aValue)
{
Servo_DeclarationBlock_SetFontFamily(mDecl, aValue);
}
void
ServoSpecifiedValues::SetTextDecorationColorOverride()
{
Servo_DeclarationBlock_SetTextDecorationColorOverride(mDecl);
}
void
ServoSpecifiedValues::SetBackgroundImage(nsAttrValue& aValue)
{
if (aValue.Type() != nsAttrValue::eURL &&
aValue.Type() != nsAttrValue::eImage) {
return;
}
nsAutoString str;
aValue.ToString(str);
Servo_DeclarationBlock_SetBackgroundImage(
mDecl, str, mPresContext->Document()->DefaultStyleAttrURLData());
}