Bug 1324700 - Add a function which is equivalent to CreateDeclaration() for servo. r?heycam
MozReview-Commit-ID: 8zgpqLzftbV
--- a/dom/canvas/CanvasRenderingContext2D.cpp
+++ b/dom/canvas/CanvasRenderingContext2D.cpp
@@ -90,16 +90,17 @@
#include "mozilla/gfx/DataSurfaceHelpers.h"
#include "mozilla/gfx/PatternHelpers.h"
#include "mozilla/gfx/Swizzle.h"
#include "mozilla/ipc/DocumentRendererParent.h"
#include "mozilla/ipc/PDocumentRendererParent.h"
#include "mozilla/layers/PersistentBufferProvider.h"
#include "mozilla/MathAlgorithms.h"
#include "mozilla/Preferences.h"
+#include "mozilla/ServoBindings.h"
#include "mozilla/Telemetry.h"
#include "mozilla/TimeStamp.h"
#include "mozilla/UniquePtr.h"
#include "mozilla/Unused.h"
#include "nsCCUncollectableMarker.h"
#include "nsWrapperCacheInlines.h"
#include "mozilla/dom/CanvasRenderingContext2DBinding.h"
#include "mozilla/dom/CanvasPath.h"
@@ -2799,16 +2800,51 @@ GetFontStyleContext(Element* aElement, c
// parsed (including having line-height removed). (Older drafts of
// the spec required font sizes be converted to pixels, but that no
// longer seems to be required.)
decl->GetPropertyValueByID(eCSSProperty_font, aOutUsedFont);
return sc.forget();
}
+static already_AddRefed<RawServoDeclarationBlock>
+CreateDeclarationForServo(nsCSSPropertyID aProperty,
+ const nsAString& aPropertyValue,
+ nsIDocument* aDocument)
+{
+ RefPtr<URLExtraData> data =
+ new URLExtraData(aDocument->GetDocBaseURI(),
+ aDocument->GetDocumentURI(),
+ aDocument->NodePrincipal());
+
+ NS_ConvertUTF16toUTF8 value(aPropertyValue);
+
+ RefPtr<RawServoDeclarationBlock> servoDeclarations =
+ Servo_ParseProperty(aProperty, &value, data).Consume();
+
+ if (!servoDeclarations) {
+ // We got a syntax error. The spec says this value must be ignored.
+ return nullptr;
+ }
+
+ // From canvas spec, force to set line-height property to 'normal' font
+ // property.
+ if (aProperty == eCSSProperty_font) {
+ const nsCString normalString = NS_LITERAL_CSTRING("normal");
+ Servo_DeclarationBlock_SetPropertyById(servoDeclarations,
+ eCSSProperty_line_height,
+ &normalString,
+ false,
+ data,
+ LengthParsingMode::Default);
+ }
+
+ return servoDeclarations.forget();
+}
+
static already_AddRefed<Declaration>
CreateFilterDeclaration(const nsAString& aFilter,
nsINode* aNode,
bool* aOutFilterChanged)
{
bool dummy;
return CreateDeclaration(aNode,
eCSSProperty_filter, aFilter, aOutFilterChanged,