Bug 759124 - Implement useCurrentView. r=dholbert

This commit is contained in:
Robert Longson 2012-05-31 11:39:12 +01:00
Родитель 1e7add0d43
Коммит 51ba38af37
7 изменённых файлов: 92 добавлений и 26 удалений

Просмотреть файл

@ -70,8 +70,8 @@ SVGFragmentIdentifier::RestoreOldViewBox(nsSVGSVGElement *root)
void
SVGFragmentIdentifier::SaveOldZoomAndPan(nsSVGSVGElement *root)
{
const PRUint16 *oldZoomAndPanPtr = root->GetZoomAndPanProperty();
if (!oldZoomAndPanPtr) {
PRUint16 oldZoomAndPan = root->GetZoomAndPanProperty();
if (oldZoomAndPan == nsIDOMSVGZoomAndPan::SVG_ZOOMANDPAN_UNKNOWN) {
root->SetZoomAndPanProperty(root->mEnumAttributes[nsSVGSVGElement::ZOOMANDPAN].GetBaseValue());
}
}
@ -79,9 +79,9 @@ SVGFragmentIdentifier::SaveOldZoomAndPan(nsSVGSVGElement *root)
void
SVGFragmentIdentifier::RestoreOldZoomAndPan(nsSVGSVGElement *root)
{
const PRUint16 *oldZoomAndPanPtr = root->GetZoomAndPanProperty();
if (oldZoomAndPanPtr) {
root->mEnumAttributes[nsSVGSVGElement::ZOOMANDPAN].SetBaseValue(*oldZoomAndPanPtr, root);
PRUint16 oldZoomAndPan = root->GetZoomAndPanProperty();
if (oldZoomAndPan != nsIDOMSVGZoomAndPan::SVG_ZOOMANDPAN_UNKNOWN) {
root->mEnumAttributes[nsSVGSVGElement::ZOOMANDPAN].SetBaseValue(oldZoomAndPan, root);
root->ClearZoomAndPanProperty();
}
}
@ -108,7 +108,10 @@ SVGFragmentIdentifier::ProcessSVGViewSpec(const nsAString &aViewSpec,
CharTokenizer<';'>tokenizer(
Substring(aViewSpec, bracketPos + 1, aViewSpec.Length() - bracketPos - 2));
while (tokenizer.hasMoreTokens()) {
if (!tokenizer.hasMoreTokens()) {
return false;
}
do {
nsAutoString token(tokenizer.nextToken());
@ -140,7 +143,7 @@ SVGFragmentIdentifier::ProcessSVGViewSpec(const nsAString &aViewSpec,
// We don't support transform or viewTarget currently
return false;
}
}
} while (tokenizer.hasMoreTokens());
if (viewBoxParams) {
SaveOldViewBox(root);
@ -208,10 +211,12 @@ SVGFragmentIdentifier::ProcessFragmentIdentifier(nsIDocument *aDocument,
} else {
RestoreOldZoomAndPan(rootElement);
}
rootElement->mUseCurrentView = true;
return true;
}
if (ProcessSVGViewSpec(aAnchorName, rootElement)) {
rootElement->mUseCurrentView = ProcessSVGViewSpec(aAnchorName, rootElement);
if (rootElement->mUseCurrentView) {
return true;
}
RestoreOldViewBox(rootElement);

Просмотреть файл

@ -3,6 +3,7 @@
* 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/StandardInteger.h"
#include "mozilla/Util.h"
#include "nsGkAtoms.h"
@ -171,7 +172,8 @@ nsSVGSVGElement::nsSVGSVGElement(already_AddRefed<nsINodeInfo> aNodeInfo,
mStartAnimationOnBindToTree(!aFromParser),
mImageNeedsTransformInvalidation(false),
mIsPaintingSVGImageElement(false),
mHasChildrenOnlyTransform(false)
mHasChildrenOnlyTransform(false),
mUseCurrentView(false)
{
}
@ -298,14 +300,8 @@ nsSVGSVGElement::GetScreenPixelToMillimeterY(float *aScreenPixelToMillimeterY)
NS_IMETHODIMP
nsSVGSVGElement::GetUseCurrentView(bool *aUseCurrentView)
{
NS_NOTYETIMPLEMENTED("nsSVGSVGElement::GetUseCurrentView");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsSVGSVGElement::SetUseCurrentView(bool aUseCurrentView)
{
NS_NOTYETIMPLEMENTED("nsSVGSVGElement::SetUseCurrentView");
return NS_ERROR_NOT_IMPLEMENTED;
*aUseCurrentView = mUseCurrentView;
return NS_OK;
}
/* readonly attribute nsIDOMSVGViewSpec currentView; */
@ -1431,19 +1427,19 @@ nsSVGSVGElement::SetZoomAndPanProperty(PRUint16 aValue)
return NS_SUCCEEDED(rv);
}
const PRUint16*
PRUint16
nsSVGSVGElement::GetZoomAndPanProperty() const
{
void* valPtr = GetProperty(nsGkAtoms::zoomAndPan);
if (valPtr) {
return reinterpret_cast<PRUint16*>(valPtr);
return reinterpret_cast<uintptr_t>(valPtr);
}
return nsnull;
return nsIDOMSVGZoomAndPan::SVG_ZOOMANDPAN_UNKNOWN;
}
bool
nsSVGSVGElement::ClearZoomAndPanProperty()
{
return UnsetProperty(nsGkAtoms::viewBox);
return UnsetProperty(nsGkAtoms::zoomAndPan);
}

Просмотреть файл

@ -268,7 +268,7 @@ private:
const nsSVGViewBoxRect* GetViewBoxProperty() const;
bool ClearViewBoxProperty();
bool SetZoomAndPanProperty(PRUint16 aValue);
const PRUint16* GetZoomAndPanProperty() const;
PRUint16 GetZoomAndPanProperty() const;
bool ClearZoomAndPanProperty();
bool IsRoot() const {
@ -363,7 +363,6 @@ private:
float mCurrentScale;
nsSVGTranslatePoint mPreviousTranslate;
float mPreviousScale;
PRInt32 mRedrawSuspendCount;
// For outermost <svg> elements created from parsing, animation is started by
// the onload event in accordance with the SVG spec, but for <svg> elements
@ -373,6 +372,7 @@ private:
bool mImageNeedsTransformInvalidation;
bool mIsPaintingSVGImageElement;
bool mHasChildrenOnlyTransform;
bool mUseCurrentView;
};
#endif

Просмотреть файл

@ -36,6 +36,8 @@ _TEST_FILES = \
test_dataTypes.html \
test_dataTypesModEvents.html \
dataTypes-helper.svg \
test_fragments.html \
fragments-helper.svg \
getCTM-helper.svg \
test_getCTM.html \
test_getElementById.xhtml \

Просмотреть файл

@ -0,0 +1,4 @@
<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg">
<view id="view" viewBox="0 200 100 100" preserveAspectRatio="none"/>
</svg>

После

Ширина:  |  Высота:  |  Размер: 141 B

Просмотреть файл

@ -0,0 +1,60 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=759124
-->
<head>
<title>Test for Bug 759124</title>
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=759124">Mozilla Bug 759124</a>
<p id="display"></p>
<div id="content" style="display: none"></div>
<iframe id="svg" src="fragments-helper.svg"></iframe>
<pre id="test">
<script class="testbody" type="application/javascript">
SimpleTest.waitForExplicitFinish();
function Test(svgFragmentIdentifier, valid) {
this.svgFragmentIdentifier = svgFragmentIdentifier;
this.valid = valid;
}
function runTests()
{
var svg = $("svg");
var doc = svg.contentWindow.document;
var tests = [
new Test("view", true),
new Test("unknown", false),
new Test("svgView(viewBox(0,0,200,200)))", true),
new Test("svgView(preserveAspectRatio(xMaxYMin slice))", true),
new Test("svgView(viewBox(1,2,3,4);preserveAspectRatio(xMaxYMin))", true),
new Test("svgView(zoomAndPan(disable))", true),
new Test("svgView", false),
new Test("svgView(", false),
new Test("svgView()", false)
];
var src = svg.getAttribute("src");
for (var i = 0; i < tests.length; i++) {
var test = tests[i];
svg.setAttribute("src", src + "#" + test.svgFragmentIdentifier);
is(doc.rootElement.useCurrentView, test.valid,
"Expected " + test.svgFragmentIdentifier + " to be " +
(test.valid ? "valid" : "invalid"));
}
SimpleTest.finish();
}
window.addEventListener("load", runTests, false);
</script>
</pre>
</body>
</html>

Просмотреть файл

@ -22,7 +22,7 @@ interface nsIDOMSVGTransform;
#endif
%}
[scriptable, uuid(EF862DDA-DE4E-4F1C-9A70-4D3BEBDE5E6E)]
[scriptable, uuid(BEC06C4F-3EF7-486E-A8F5-F375EE5CB5A8)]
interface nsIDOMSVGSVGElement
: nsIDOMSVGElement
/*
@ -56,8 +56,7 @@ interface nsIDOMSVGSVGElement
readonly attribute float pixelUnitToMillimeterY;
readonly attribute float screenPixelToMillimeterX;
readonly attribute float screenPixelToMillimeterY;
attribute boolean useCurrentView;
// raises DOMException on setting
readonly attribute boolean useCurrentView;
readonly attribute nsIDOMSVGViewSpec currentView;
attribute float currentScale;
// raises DOMException on setting