SVGViewSpec DOM bindings aka SVGSVGElement.currentView is unimplemented
https://bugs.webkit.org/show_bug.cgi?id=15495

Reviewed by Rob Buis.

Source/WebCore:

Finish SVGViewSpec implementation and expose it to the Web. Numerous smaller bugs are fixed:
- SVGViewSpec and all of its contents should be read-only. Enforce that and test it.
  Add a new enum to SVGPropertyInfo so that each SVGAnimatedProperty knows if its content is supposed to be read-write or read-only.
- Make the 'transform' attribute of SVGViewSpec exposable by switching to a SVGTransformListProperty - it can now be accessed from JS.
- Assure that following XXXString methods are in sync with the corresponding SVG DOM interfaces
    readonly attribute DOMString viewBoxString;
    readonly attribute DOMString preserveAspectRatioString;
    readonly attribute DOMString transformString;
    readonly attribute DOMString viewTargetString;
- Cleanup code in svg/properties that was intended to handle SVGViewSpec. Turns out lot of the complexity was unncessary, and can be removed.
- Move SVGFitToViewBox to the same pattern SVGZoomAndPan uses since two days, that avoids any virtual function calls for attribute parsing.
- Create/expose ObjectiveC/JS bindings for SVGViewSpec.
- Enable SVGViewSpec constructor.

Tests: svg/custom/linking-a-03-b-all-expected.svg
       svg/dom/SVGViewSpec-defaults.html
       svg/dom/SVGViewSpec.html
       svg/dom/complex-svgView-specification.html
       svg/dom/viewspec-parser.html

* CMakeLists.txt:
* DerivedSources.cpp:
* DerivedSources.make:
* DerivedSources.pri:
* GNUmakefile.list.am:
* Target.pri:
* WebCore.gyp/WebCore.gyp:
* WebCore.gypi:
* WebCore.order:
* WebCore.vcproj/WebCore.vcproj:
* WebCore.xcodeproj/project.pbxproj:
* bindings/js/JSSVGLengthCustom.cpp:
(WebCore::JSSVGLength::setValue):
(WebCore::JSSVGLength::convertToSpecifiedUnits):
* bindings/objc/DOMSVG.h:
* bindings/scripts/CodeGeneratorJS.pm:
(GenerateImplementation):
(NativeToJSValue):
* bindings/scripts/CodeGeneratorObjC.pm:
(GenerateImplementation):
* bindings/scripts/CodeGeneratorV8.pm:
(GenerateNormalAttrGetter):
(GenerateNormalAttrSetter):
(GenerateFunctionCallback):
* bindings/v8/custom/V8SVGLengthCustom.cpp:
(WebCore::V8SVGLength::valueAccessorSetter):
(WebCore::V8SVGLength::convertToSpecifiedUnitsCallback):
* page/DOMWindow.idl:
* rendering/svg/RenderSVGResourcePattern.cpp:
(WebCore::RenderSVGResourcePattern::buildTileImageTransform):
* svg/SVGFitToViewBox.cpp:
* svg/SVGFitToViewBox.h:
(SVGFitToViewBox):
(WebCore::SVGFitToViewBox::parseAttribute):
* svg/SVGMarkerElement.cpp:
(WebCore::SVGMarkerElement::orientTypePropertyInfo):
(WebCore::SVGMarkerElement::parseAttribute):
(WebCore::SVGMarkerElement::synchronizeOrientType):
(WebCore::SVGMarkerElement::lookupOrCreateOrientTypeWrapper):
* svg/SVGPathElement.cpp:
(WebCore::SVGPathElement::dPropertyInfo):
(WebCore::SVGPathElement::svgAttributeChanged):
(WebCore::SVGPathElement::pathByteStream):
(WebCore::SVGPathElement::lookupOrCreateDWrapper):
(WebCore::SVGPathElement::synchronizeD):
* svg/SVGPathSegWithContext.h:
(WebCore::SVGPathSegWithContext::animatedProperty):
* svg/SVGPatternElement.cpp:
(WebCore::SVGPatternElement::parseAttribute):
* svg/SVGPolyElement.cpp:
(WebCore::SVGPolyElement::pointsPropertyInfo):
(WebCore::SVGPolyElement::parseAttribute):
(WebCore::SVGPolyElement::synchronizePoints):
(WebCore::SVGPolyElement::lookupOrCreatePointsWrapper):
* svg/SVGRect.h:
* svg/SVGSVGElement.cpp:
(WebCore::SVGSVGElement::~SVGSVGElement):
(WebCore::SVGSVGElement::currentView):
(WebCore::SVGSVGElement::parseAttribute):
(WebCore::SVGSVGElement::currentViewBoxRect):
(WebCore::SVGSVGElement::viewBoxToViewTransform):
(WebCore::SVGSVGElement::setupInitialView):
(WebCore::SVGSVGElement::inheritViewAttributes):
* svg/SVGSVGElement.h:
(SVGSVGElement):
* svg/SVGSVGElement.idl:
* svg/SVGSymbolElement.cpp:
(WebCore::SVGSymbolElement::parseAttribute):
* svg/SVGTests.cpp:
(WebCore::SVGTests::requiredFeaturesPropertyInfo):
(WebCore::SVGTests::requiredExtensionsPropertyInfo):
(WebCore::SVGTests::systemLanguagePropertyInfo):
(WebCore::SVGTests::synchronizeRequiredFeatures):
(WebCore::SVGTests::synchronizeRequiredExtensions):
(WebCore::SVGTests::synchronizeSystemLanguage):
* svg/SVGTextContentElement.cpp:
(WebCore::SVGTextContentElement::textLengthPropertyInfo):
(WebCore::SVGTextContentElement::synchronizeTextLength):
(WebCore::SVGTextContentElement::lookupOrCreateTextLengthWrapper):
* svg/SVGViewElement.cpp:
(WebCore::SVGViewElement::parseAttribute):
* svg/SVGViewElement.h:
* svg/SVGViewSpec.cpp:
(WebCore::SVGViewSpec::viewBoxPropertyInfo):
(WebCore::SVGViewSpec::preserveAspectRatioPropertyInfo):
(WebCore::SVGViewSpec::transformPropertyInfo):
(WebCore::SVGViewSpec::SVGViewSpec):
(WebCore::SVGViewSpec::viewBoxIdentifier):
(WebCore::SVGViewSpec::preserveAspectRatioIdentifier):
(WebCore::SVGViewSpec::transformIdentifier):
(WebCore::SVGViewSpec::setZoomAndPan):
(WebCore::SVGViewSpec::setTransformString):
(WebCore::SVGViewSpec::transformString):
(WebCore::SVGViewSpec::viewBoxString):
(WebCore::SVGViewSpec::preserveAspectRatioString):
(WebCore::SVGViewSpec::viewTarget):
(WebCore::SVGViewSpec::transform):
(WebCore::SVGViewSpec::lookupOrCreateViewBoxWrapper):
(WebCore::SVGViewSpec::lookupOrCreatePreserveAspectRatioWrapper):
(WebCore::SVGViewSpec::lookupOrCreateTransformWrapper):
(WebCore::SVGViewSpec::reset):
(WebCore::SVGViewSpec::parseViewSpec):
* svg/SVGViewSpec.h:
(WebCore::SVGViewSpec::~SVGViewSpec):
(SVGViewSpec):
(WebCore::SVGViewSpec::create):
(WebCore::SVGViewSpec::setViewTargetString):
(WebCore::SVGViewSpec::setZoomAndPan):
(WebCore::SVGViewSpec::contextElement):
(WebCore::SVGViewSpec::resetContextElement):
(WebCore::SVGViewSpec::transformBaseValue):
(WebCore::SVGViewSpec::viewBoxAnimated):
(WebCore::SVGViewSpec::viewBox):
(WebCore::SVGViewSpec::viewBoxBaseValue):
(WebCore::SVGViewSpec::setViewBoxBaseValue):
(WebCore::SVGViewSpec::preserveAspectRatioAnimated):
(WebCore::SVGViewSpec::preserveAspectRatio):
(WebCore::SVGViewSpec::preserveAspectRatioBaseValue):
(WebCore::SVGViewSpec::setPreserveAspectRatioBaseValue):
* svg/SVGViewSpec.idl:
* svg/properties/SVGAnimatedProperty.h:
(WebCore::SVGAnimatedProperty::isReadOnly):
(WebCore::SVGAnimatedProperty::setIsReadOnly):
(SVGAnimatedProperty):
(WebCore::SVGAnimatedProperty::lookupOrCreateWrapper):
(WebCore::SVGAnimatedProperty::lookupWrapper):
(WebCore::SVGAnimatedProperty::SVGAnimatedProperty):
* svg/properties/SVGAnimatedPropertyMacros.h:
(WebCore::SVGSynchronizableAnimatedProperty::synchronize):
(SVGSynchronizableAnimatedProperty):
* svg/properties/SVGAnimatedPropertySynchronizer.h: Removed.
* svg/properties/SVGAttributeToPropertyMap.h:
* svg/properties/SVGListProperty.h:
* svg/properties/SVGListPropertyTearOff.h:
(SVGListPropertyTearOff):
(WebCore::SVGListPropertyTearOff::isReadOnly):
* svg/properties/SVGPathSegListPropertyTearOff.h:
(SVGPathSegListPropertyTearOff):
(WebCore::SVGPathSegListPropertyTearOff::isReadOnly):
* svg/properties/SVGProperty.h:
(SVGProperty):
* svg/properties/SVGPropertyInfo.h:
(WebCore::SVGPropertyInfo::SVGPropertyInfo):
(SVGPropertyInfo):
* svg/properties/SVGPropertyTearOff.h:
(WebCore::SVGPropertyTearOff::isReadOnly):
* svg/properties/SVGStaticListPropertyTearOff.h:
(SVGStaticListPropertyTearOff):
(WebCore::SVGStaticListPropertyTearOff::isReadOnly):

Source/WebKit/mac:

* MigrateHeaders.make: Copy DOMSVGViewSpec*.h headers.

LayoutTests:

Re-enable a long disabled test for SVGViewSpec, and make it actually work.
Extend SVGViewSpec test coverage, and rebaseline results that changed due the SVGViewSpec constructor addition.

Make linking-a-03-b-all.svg a reftest, to avoid rebaselines on all platforms.

* platform/chromium-linux/svg/custom/linking-a-03-b-all-expected.png: Removed.
* platform/chromium-mac/svg/custom/linking-a-03-b-all-expected.png: Removed.
* platform/chromium-win/fast/js/global-constructors-expected.txt:
* platform/chromium-win/svg/custom/linking-a-03-b-all-expected.png: Removed.
* platform/chromium-win/svg/custom/linking-a-03-b-all-expected.txt: Removed.
* platform/gtk/fast/js/global-constructors-expected.txt:
* platform/gtk/svg/custom/linking-a-03-b-all-expected.png: Removed.
* platform/gtk/svg/custom/linking-a-03-b-all-expected.txt: Removed.
* platform/mac/fast/js/global-constructors-expected.txt:
* platform/mac/svg/custom/linking-a-03-b-all-expected.png: Removed.
* platform/mac/svg/custom/linking-a-03-b-all-expected.txt: Removed.
* platform/qt/fast/js/global-constructors-expected.txt:
* platform/qt/svg/custom/linking-a-03-b-all-expected.png: Removed.
* platform/qt/svg/custom/linking-a-03-b-all-expected.txt: Removed.
* platform/win/fast/js/global-constructors-expected.txt:
* svg/custom/global-constructors-expected.txt:
* svg/custom/linking-a-03-b-all-expected.svg: Added.
* svg/dom/SVGViewSpec-defaults-expected.txt: Added.
* svg/dom/SVGViewSpec-defaults.html: Added.
* svg/dom/SVGViewSpec-expected.txt: Added.
* svg/dom/SVGViewSpec.html: Added.
* svg/dom/complex-svgView-specification-expected.html: Added.
* svg/dom/complex-svgView-specification.html: Added.
* svg/dom/resources/viewspec-target.svg: Added.
* svg/dom/script-tests/SVGViewSpec-defaults.js: Added.
* svg/dom/script-tests/SVGViewSpec.js: Added.
(completeTest.script.onload):
(completeTest):
(testFragment):
(matrixToString):
(continueTesting):
* svg/dom/viewspec-parser-expected.txt: Added.
* svg/dom/viewspec-parser.html: Renamed from LayoutTests/svg/dom/viewspec-parser.html-disabled.

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@118735 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index 59d5135..8dd0e4c 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,49 @@
+2012-05-29  Nikolas Zimmermann  <nzimmermann@rim.com>
+
+        SVGViewSpec DOM bindings aka SVGSVGElement.currentView is unimplemented
+        https://bugs.webkit.org/show_bug.cgi?id=15495
+
+        Reviewed by Rob Buis.
+
+        Re-enable a long disabled test for SVGViewSpec, and make it actually work.
+        Extend SVGViewSpec test coverage, and rebaseline results that changed due the SVGViewSpec constructor addition.
+
+        Make linking-a-03-b-all.svg a reftest, to avoid rebaselines on all platforms.
+
+        * platform/chromium-linux/svg/custom/linking-a-03-b-all-expected.png: Removed.
+        * platform/chromium-mac/svg/custom/linking-a-03-b-all-expected.png: Removed.
+        * platform/chromium-win/fast/js/global-constructors-expected.txt:
+        * platform/chromium-win/svg/custom/linking-a-03-b-all-expected.png: Removed.
+        * platform/chromium-win/svg/custom/linking-a-03-b-all-expected.txt: Removed.
+        * platform/gtk/fast/js/global-constructors-expected.txt:
+        * platform/gtk/svg/custom/linking-a-03-b-all-expected.png: Removed.
+        * platform/gtk/svg/custom/linking-a-03-b-all-expected.txt: Removed.
+        * platform/mac/fast/js/global-constructors-expected.txt:
+        * platform/mac/svg/custom/linking-a-03-b-all-expected.png: Removed.
+        * platform/mac/svg/custom/linking-a-03-b-all-expected.txt: Removed.
+        * platform/qt/fast/js/global-constructors-expected.txt:
+        * platform/qt/svg/custom/linking-a-03-b-all-expected.png: Removed.
+        * platform/qt/svg/custom/linking-a-03-b-all-expected.txt: Removed.
+        * platform/win/fast/js/global-constructors-expected.txt:
+        * svg/custom/global-constructors-expected.txt:
+        * svg/custom/linking-a-03-b-all-expected.svg: Added.
+        * svg/dom/SVGViewSpec-defaults-expected.txt: Added.
+        * svg/dom/SVGViewSpec-defaults.html: Added.
+        * svg/dom/SVGViewSpec-expected.txt: Added.
+        * svg/dom/SVGViewSpec.html: Added.
+        * svg/dom/complex-svgView-specification-expected.html: Added.
+        * svg/dom/complex-svgView-specification.html: Added.
+        * svg/dom/resources/viewspec-target.svg: Added.
+        * svg/dom/script-tests/SVGViewSpec-defaults.js: Added.
+        * svg/dom/script-tests/SVGViewSpec.js: Added.
+        (completeTest.script.onload):
+        (completeTest):
+        (testFragment):
+        (matrixToString):
+        (continueTesting):
+        * svg/dom/viewspec-parser-expected.txt: Added.
+        * svg/dom/viewspec-parser.html: Renamed from LayoutTests/svg/dom/viewspec-parser.html-disabled.
+
 2012-05-29  Marcus Bulach  <bulach@chromium.org>
 
         [chromium] Adjust expectations for fast/layers/clip-rects-assertion-expected.txt
diff --git a/LayoutTests/platform/chromium-linux/svg/custom/linking-a-03-b-all-expected.png b/LayoutTests/platform/chromium-linux/svg/custom/linking-a-03-b-all-expected.png
deleted file mode 100644
index 9e45d1f..0000000
--- a/LayoutTests/platform/chromium-linux/svg/custom/linking-a-03-b-all-expected.png
+++ /dev/null
Binary files differ
diff --git a/LayoutTests/platform/chromium-mac/svg/custom/linking-a-03-b-all-expected.png b/LayoutTests/platform/chromium-mac/svg/custom/linking-a-03-b-all-expected.png
deleted file mode 100644
index d9ad3cb..0000000
--- a/LayoutTests/platform/chromium-mac/svg/custom/linking-a-03-b-all-expected.png
+++ /dev/null
Binary files differ
diff --git a/LayoutTests/platform/chromium-win/fast/js/global-constructors-expected.txt b/LayoutTests/platform/chromium-win/fast/js/global-constructors-expected.txt
index af44696..85e5988 100644
--- a/LayoutTests/platform/chromium-win/fast/js/global-constructors-expected.txt
+++ b/LayoutTests/platform/chromium-win/fast/js/global-constructors-expected.txt
@@ -291,6 +291,8 @@
 PASS SVGUseElement.toString() is '[object SVGUseElementConstructor]'
 PASS SVGVKernElement.toString() is '[object SVGVKernElementConstructor]'
 PASS SVGViewElement.toString() is '[object SVGViewElementConstructor]'
+PASS SVGViewSpec.toString() is '[object SVGViewSpecConstructor]'
+PASS SVGZoomAndPan.toString() is '[object SVGZoomAndPanConstructor]'
 PASS SVGZoomEvent.toString() is '[object SVGZoomEventConstructor]'
 PASS SharedWorker.toString() is '[object SharedWorkerConstructor]'
 PASS Storage.toString() is '[object StorageConstructor]'
diff --git a/LayoutTests/platform/chromium-win/svg/custom/linking-a-03-b-all-expected.png b/LayoutTests/platform/chromium-win/svg/custom/linking-a-03-b-all-expected.png
deleted file mode 100644
index 6dccc5f..0000000
--- a/LayoutTests/platform/chromium-win/svg/custom/linking-a-03-b-all-expected.png
+++ /dev/null
Binary files differ
diff --git a/LayoutTests/platform/chromium-win/svg/custom/linking-a-03-b-all-expected.txt b/LayoutTests/platform/chromium-win/svg/custom/linking-a-03-b-all-expected.txt
deleted file mode 100644
index 76e5b30..0000000
--- a/LayoutTests/platform/chromium-win/svg/custom/linking-a-03-b-all-expected.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-layer at (0,0) size 800x600
-  RenderView at (0,0) size 800x600
-layer at (0,0) size 480x360
-  RenderSVGRoot {svg} at (0,0) size 480x360
-    RenderSVGContainer {g} at (0,0) size 480x360
-      RenderSVGText {text} at (100,9) size 188x14 contains 1 chunk(s)
-        RenderSVGInlineText {#text} at (0,0) size 188x14
-          chunk 1 text run 1 at (100.00,20.00) startOffset 0 endOffset 41 width 187.80: "Some circles with ids, for linking tests."
-      RenderSVGEllipse {circle} at (0,0) size 0x0 [stroke={[type=SOLID] [color=#000000]}] [fill={[type=SOLID] [color=#FF0000]}] [cx=220.00] [cy=140.00] [r=35.00]
-      RenderSVGText {text} at (203,88) size 39x14 contains 1 chunk(s)
-        RenderSVGInlineText {#text} at (0,0) size 39x14
-          chunk 1 text run 1 at (203.00,99.00) startOffset 0 endOffset 8 width 38.40: "circle-1"
-      RenderSVGEllipse {circle} at (5,84) size 239x239 [stroke={[type=SOLID] [color=#00FF00] [stroke width=4.00]}] [fill={[type=SOLID] [color=#FFFF00]}] [cx=100.00] [cy=260.00] [r=20.00]
-      RenderSVGText {text} at (80,284) size 39x14 contains 1 chunk(s)
-        RenderSVGInlineText {#text} at (0,0) size 39x14
-          chunk 1 text run 1 at (80.00,295.00) startOffset 0 endOffset 8 width 38.40: "circle-2"
-      RenderSVGRect {rect} at (0,20) size 322x340 [stroke={[type=SOLID] [color=#000000]}] [x=64.00] [y=227.00] [width=72.00] [height=72.00]
-      RenderSVGEllipse {circle} at (0,0) size 0x0 [stroke={[type=SOLID] [color=#0000FF] [stroke width=10.00]}] [cx=340.00] [cy=260.00] [r=50.00]
-      RenderSVGText {text} at (320,321) size 39x14 contains 1 chunk(s)
-        RenderSVGInlineText {#text} at (0,0) size 39x14
-          chunk 1 text run 1 at (320.00,332.00) startOffset 0 endOffset 8 width 38.40: "circle-3"
-    RenderSVGContainer {g} at (0,0) size 480x360
-      RenderSVGRect {rect} at (0,0) size 480x360 [stroke={[type=SOLID] [color=#000000]}] [x=1.00] [y=1.00] [width=478.00] [height=358.00]
diff --git a/LayoutTests/platform/gtk/fast/js/global-constructors-expected.txt b/LayoutTests/platform/gtk/fast/js/global-constructors-expected.txt
index 8a6c33d..55088a9 100644
--- a/LayoutTests/platform/gtk/fast/js/global-constructors-expected.txt
+++ b/LayoutTests/platform/gtk/fast/js/global-constructors-expected.txt
@@ -295,6 +295,7 @@
 PASS SVGUseElement.toString() is '[object SVGUseElementConstructor]'
 PASS SVGVKernElement.toString() is '[object SVGVKernElementConstructor]'
 PASS SVGViewElement.toString() is '[object SVGViewElementConstructor]'
+PASS SVGViewSpec.toString() is '[object SVGViewSpecConstructor]'
 PASS SVGZoomAndPan.toString() is '[object SVGZoomAndPanConstructor]'
 PASS SVGZoomEvent.toString() is '[object SVGZoomEventConstructor]'
 PASS Selection.toString() is '[object SelectionConstructor]'
diff --git a/LayoutTests/platform/gtk/svg/custom/linking-a-03-b-all-expected.png b/LayoutTests/platform/gtk/svg/custom/linking-a-03-b-all-expected.png
deleted file mode 100644
index caf5bbd..0000000
--- a/LayoutTests/platform/gtk/svg/custom/linking-a-03-b-all-expected.png
+++ /dev/null
Binary files differ
diff --git a/LayoutTests/platform/gtk/svg/custom/linking-a-03-b-all-expected.txt b/LayoutTests/platform/gtk/svg/custom/linking-a-03-b-all-expected.txt
deleted file mode 100644
index f3c1da4..0000000
--- a/LayoutTests/platform/gtk/svg/custom/linking-a-03-b-all-expected.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-layer at (0,0) size 800x600
-  RenderView at (0,0) size 800x600
-layer at (0,0) size 480x360
-  RenderSVGRoot {svg} at (0,0) size 480x360
-    RenderSVGContainer {g} at (0,0) size 480x360
-      RenderSVGText {text} at (100,9) size 188x14 contains 1 chunk(s)
-        RenderSVGInlineText {#text} at (0,0) size 188x14
-          chunk 1 text run 1 at (100.00,20.00) startOffset 0 endOffset 41 width 188.00: "Some circles with ids, for linking tests."
-      RenderSVGEllipse {circle} at (0,0) size 0x0 [stroke={[type=SOLID] [color=#000000]}] [fill={[type=SOLID] [color=#FF0000]}] [cx=220.00] [cy=140.00] [r=35.00]
-      RenderSVGText {text} at (203,88) size 39x14 contains 1 chunk(s)
-        RenderSVGInlineText {#text} at (0,0) size 39x14
-          chunk 1 text run 1 at (203.00,99.00) startOffset 0 endOffset 8 width 38.40: "circle-1"
-      RenderSVGEllipse {circle} at (5,84) size 239x239 [stroke={[type=SOLID] [color=#00FF00] [stroke width=4.00]}] [fill={[type=SOLID] [color=#FFFF00]}] [cx=100.00] [cy=260.00] [r=20.00]
-      RenderSVGText {text} at (80,284) size 39x14 contains 1 chunk(s)
-        RenderSVGInlineText {#text} at (0,0) size 39x14
-          chunk 1 text run 1 at (80.00,295.00) startOffset 0 endOffset 8 width 38.40: "circle-2"
-      RenderSVGRect {rect} at (0,20) size 322x340 [stroke={[type=SOLID] [color=#000000]}] [x=64.00] [y=227.00] [width=72.00] [height=72.00]
-      RenderSVGEllipse {circle} at (0,0) size 0x0 [stroke={[type=SOLID] [color=#0000FF] [stroke width=10.00]}] [cx=340.00] [cy=260.00] [r=50.00]
-      RenderSVGText {text} at (320,321) size 39x14 contains 1 chunk(s)
-        RenderSVGInlineText {#text} at (0,0) size 39x14
-          chunk 1 text run 1 at (320.00,332.00) startOffset 0 endOffset 8 width 38.40: "circle-3"
-    RenderSVGContainer {g} at (0,0) size 480x360
-      RenderSVGRect {rect} at (0,0) size 480x360 [stroke={[type=SOLID] [color=#000000]}] [x=1.00] [y=1.00] [width=478.00] [height=358.00]
diff --git a/LayoutTests/platform/mac/fast/js/global-constructors-expected.txt b/LayoutTests/platform/mac/fast/js/global-constructors-expected.txt
index 84e6c15..be67f6d 100644
--- a/LayoutTests/platform/mac/fast/js/global-constructors-expected.txt
+++ b/LayoutTests/platform/mac/fast/js/global-constructors-expected.txt
@@ -295,6 +295,7 @@
 PASS SVGUseElement.toString() is '[object SVGUseElementConstructor]'
 PASS SVGVKernElement.toString() is '[object SVGVKernElementConstructor]'
 PASS SVGViewElement.toString() is '[object SVGViewElementConstructor]'
+PASS SVGViewSpec.toString() is '[object SVGViewSpecConstructor]'
 PASS SVGZoomAndPan.toString() is '[object SVGZoomAndPanConstructor]'
 PASS SVGZoomEvent.toString() is '[object SVGZoomEventConstructor]'
 PASS Selection.toString() is '[object SelectionConstructor]'
diff --git a/LayoutTests/platform/mac/svg/custom/linking-a-03-b-all-expected.png b/LayoutTests/platform/mac/svg/custom/linking-a-03-b-all-expected.png
deleted file mode 100644
index 10f7e20..0000000
--- a/LayoutTests/platform/mac/svg/custom/linking-a-03-b-all-expected.png
+++ /dev/null
Binary files differ
diff --git a/LayoutTests/platform/mac/svg/custom/linking-a-03-b-all-expected.txt b/LayoutTests/platform/mac/svg/custom/linking-a-03-b-all-expected.txt
deleted file mode 100644
index 7aae6f3..0000000
--- a/LayoutTests/platform/mac/svg/custom/linking-a-03-b-all-expected.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-layer at (0,0) size 800x600
-  RenderView at (0,0) size 800x600
-layer at (0,0) size 480x360
-  RenderSVGRoot {svg} at (0,0) size 480x360
-    RenderSVGContainer {g} at (0,0) size 480x360
-      RenderSVGText {text} at (100,9) size 188x14 contains 1 chunk(s)
-        RenderSVGInlineText {#text} at (0,0) size 188x14
-          chunk 1 text run 1 at (100.00,20.00) startOffset 0 endOffset 41 width 188.00: "Some circles with ids, for linking tests."
-      RenderSVGEllipse {circle} at (0,0) size 0x0 [stroke={[type=SOLID] [color=#000000]}] [fill={[type=SOLID] [color=#FF0000]}] [cx=220.00] [cy=140.00] [r=35.00]
-      RenderSVGText {text} at (203,87) size 39x14 contains 1 chunk(s)
-        RenderSVGInlineText {#text} at (0,0) size 39x14
-          chunk 1 text run 1 at (203.00,99.00) startOffset 0 endOffset 8 width 38.40: "circle-1"
-      RenderSVGEllipse {circle} at (5,84) size 239x239 [stroke={[type=SOLID] [color=#00FF00] [stroke width=4.00]}] [fill={[type=SOLID] [color=#FFFF00]}] [cx=100.00] [cy=260.00] [r=20.00]
-      RenderSVGText {text} at (80,283) size 39x14 contains 1 chunk(s)
-        RenderSVGInlineText {#text} at (0,0) size 39x14
-          chunk 1 text run 1 at (80.00,295.00) startOffset 0 endOffset 8 width 38.40: "circle-2"
-      RenderSVGRect {rect} at (0,20) size 322x340 [stroke={[type=SOLID] [color=#000000]}] [x=64.00] [y=227.00] [width=72.00] [height=72.00]
-      RenderSVGEllipse {circle} at (0,0) size 0x0 [stroke={[type=SOLID] [color=#0000FF] [stroke width=10.00]}] [cx=340.00] [cy=260.00] [r=50.00]
-      RenderSVGText {text} at (320,320) size 39x14 contains 1 chunk(s)
-        RenderSVGInlineText {#text} at (0,0) size 39x14
-          chunk 1 text run 1 at (320.00,332.00) startOffset 0 endOffset 8 width 38.40: "circle-3"
-    RenderSVGContainer {g} at (0,0) size 480x360
-      RenderSVGRect {rect} at (0,0) size 480x360 [stroke={[type=SOLID] [color=#000000]}] [x=1.00] [y=1.00] [width=478.00] [height=358.00]
diff --git a/LayoutTests/platform/qt/fast/js/global-constructors-expected.txt b/LayoutTests/platform/qt/fast/js/global-constructors-expected.txt
index e0f97c5..b45e956 100644
--- a/LayoutTests/platform/qt/fast/js/global-constructors-expected.txt
+++ b/LayoutTests/platform/qt/fast/js/global-constructors-expected.txt
@@ -282,6 +282,7 @@
 PASS SVGUnitTypes.toString() is '[object SVGUnitTypesConstructor]'
 PASS SVGUseElement.toString() is '[object SVGUseElementConstructor]'
 PASS SVGViewElement.toString() is '[object SVGViewElementConstructor]'
+PASS SVGViewSpec.toString() is '[object SVGViewSpecConstructor]'
 PASS SVGZoomAndPan.toString() is '[object SVGZoomAndPanConstructor]'
 PASS SVGZoomEvent.toString() is '[object SVGZoomEventConstructor]'
 PASS Selection.toString() is '[object SelectionConstructor]'
diff --git a/LayoutTests/platform/qt/svg/custom/linking-a-03-b-all-expected.png b/LayoutTests/platform/qt/svg/custom/linking-a-03-b-all-expected.png
deleted file mode 100644
index c133210..0000000
--- a/LayoutTests/platform/qt/svg/custom/linking-a-03-b-all-expected.png
+++ /dev/null
Binary files differ
diff --git a/LayoutTests/platform/qt/svg/custom/linking-a-03-b-all-expected.txt b/LayoutTests/platform/qt/svg/custom/linking-a-03-b-all-expected.txt
deleted file mode 100644
index bf06d61..0000000
--- a/LayoutTests/platform/qt/svg/custom/linking-a-03-b-all-expected.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-layer at (0,0) size 800x600
-  RenderView at (0,0) size 800x600
-layer at (0,0) size 480x360
-  RenderSVGRoot {svg} at (0,0) size 480x360
-    RenderSVGContainer {g} at (0,0) size 480x360
-      RenderSVGText {text} at (100,8) size 202x16 contains 1 chunk(s)
-        RenderSVGInlineText {#text} at (0,0) size 202x16
-          chunk 1 text run 1 at (100.00,20.00) startOffset 0 endOffset 41 width 201.60: "Some circles with ids, for linking tests."
-      RenderSVGEllipse {circle} at (0,0) size 0x0 [stroke={[type=SOLID] [color=#000000]}] [fill={[type=SOLID] [color=#FF0000]}] [cx=220.00] [cy=140.00] [r=35.00]
-      RenderSVGText {text} at (203,87) size 39x16 contains 1 chunk(s)
-        RenderSVGInlineText {#text} at (0,0) size 39x16
-          chunk 1 text run 1 at (203.00,99.00) startOffset 0 endOffset 8 width 38.40: "circle-1"
-      RenderSVGEllipse {circle} at (5,84) size 239x239 [stroke={[type=SOLID] [color=#00FF00] [stroke width=4.00]}] [fill={[type=SOLID] [color=#FFFF00]}] [cx=100.00] [cy=260.00] [r=20.00]
-      RenderSVGText {text} at (80,283) size 39x16 contains 1 chunk(s)
-        RenderSVGInlineText {#text} at (0,0) size 39x16
-          chunk 1 text run 1 at (80.00,295.00) startOffset 0 endOffset 8 width 38.40: "circle-2"
-      RenderSVGRect {rect} at (0,20) size 322x340 [stroke={[type=SOLID] [color=#000000]}] [x=64.00] [y=227.00] [width=72.00] [height=72.00]
-      RenderSVGEllipse {circle} at (0,0) size 0x0 [stroke={[type=SOLID] [color=#0000FF] [stroke width=10.00]}] [cx=340.00] [cy=260.00] [r=50.00]
-      RenderSVGText {text} at (320,320) size 39x16 contains 1 chunk(s)
-        RenderSVGInlineText {#text} at (0,0) size 39x16
-          chunk 1 text run 1 at (320.00,332.00) startOffset 0 endOffset 8 width 38.40: "circle-3"
-    RenderSVGContainer {g} at (0,0) size 480x360
-      RenderSVGRect {rect} at (0,0) size 480x360 [stroke={[type=SOLID] [color=#000000]}] [x=1.00] [y=1.00] [width=478.00] [height=358.00]
diff --git a/LayoutTests/platform/win/fast/js/global-constructors-expected.txt b/LayoutTests/platform/win/fast/js/global-constructors-expected.txt
index af44696..85e5988 100644
--- a/LayoutTests/platform/win/fast/js/global-constructors-expected.txt
+++ b/LayoutTests/platform/win/fast/js/global-constructors-expected.txt
@@ -291,6 +291,8 @@
 PASS SVGUseElement.toString() is '[object SVGUseElementConstructor]'
 PASS SVGVKernElement.toString() is '[object SVGVKernElementConstructor]'
 PASS SVGViewElement.toString() is '[object SVGViewElementConstructor]'
+PASS SVGViewSpec.toString() is '[object SVGViewSpecConstructor]'
+PASS SVGZoomAndPan.toString() is '[object SVGZoomAndPanConstructor]'
 PASS SVGZoomEvent.toString() is '[object SVGZoomEventConstructor]'
 PASS SharedWorker.toString() is '[object SharedWorkerConstructor]'
 PASS Storage.toString() is '[object StorageConstructor]'
diff --git a/LayoutTests/svg/custom/global-constructors-expected.txt b/LayoutTests/svg/custom/global-constructors-expected.txt
index 72deff5..6cfd0d1 100644
--- a/LayoutTests/svg/custom/global-constructors-expected.txt
+++ b/LayoutTests/svg/custom/global-constructors-expected.txt
@@ -32,7 +32,7 @@
 FAIL SVGExternalResourcesRequired.toString() should be [object SVGExternalResourcesRequiredConstructor]. Threw exception ReferenceError: Can't find variable: SVGExternalResourcesRequired
 FAIL SVGFitToViewBox.toString() should be [object SVGFitToViewBoxConstructor]. Threw exception ReferenceError: Can't find variable: SVGFitToViewBox
 PASS SVGZoomAndPan.toString() is '[object SVGZoomAndPanConstructor]'
-FAIL SVGViewSpec.toString() should be [object SVGViewSpecConstructor]. Threw exception ReferenceError: Can't find variable: SVGViewSpec
+PASS SVGViewSpec.toString() is '[object SVGViewSpecConstructor]'
 FAIL SVGURIReference.toString() should be [object SVGURIReferenceConstructor]. Threw exception ReferenceError: Can't find variable: SVGURIReference
 FAIL SVGCSSRule.toString() should be [object SVGCSSRuleConstructor]. Threw exception ReferenceError: Can't find variable: SVGCSSRule
 PASS SVGDocument.toString() is '[object SVGDocumentConstructor]'
diff --git a/LayoutTests/svg/custom/linking-a-03-b-all-expected.svg b/LayoutTests/svg/custom/linking-a-03-b-all-expected.svg
new file mode 100644
index 0000000..852c24a
--- /dev/null
+++ b/LayoutTests/svg/custom/linking-a-03-b-all-expected.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Basic//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-basic.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="480" height="360" viewBox="64 227 72 72" preserveAspectRatio="none">
+	<g id="test-body-content" transform="rotate(5)">
+		<text x="100" y="20" style="font-size:12">Some circles with ids, for linking tests.</text>
+		<circle id="circle-1" cx="220" cy="140" r="35" style="fill:red; stroke:black"/>
+		<text style="font-family:Helvetica;font-size:12" x="203" y="99">circle-1</text>
+		<circle id="circle-2" cx="100" cy="260" r="20" style="stroke:lime; fill:yellow; stroke-width:4"/>
+		<text style="font-family:Helvetica;font-size:12" x="80" y="295">circle-2</text>
+		<!-- Framing rect for circle-2 -->
+		<rect x="64" y="227" width="72" height="72" style="fill:none; stroke:black"/>
+		<circle id="circle-3" cx="340" cy="260" r="50" style="stroke:blue; fill:none; stroke-width:10"/>
+		<text style="font-family:Helvetica;font-size:12" x="320" y="332">circle-3</text>
+	</g>
+	<g id="test-legend" transform="rotate(5)">
+		<!-- Test-framing rectangle, drawn just inside viewport boundary. -->
+		<rect id="test-frame" x="1" y="1" width="478" height="358" style="fill:none; stroke:#000000"/>
+	</g>
+</svg>
diff --git a/LayoutTests/svg/dom/SVGViewSpec-defaults-expected.txt b/LayoutTests/svg/dom/SVGViewSpec-defaults-expected.txt
new file mode 100644
index 0000000..0f74bf1
--- /dev/null
+++ b/LayoutTests/svg/dom/SVGViewSpec-defaults-expected.txt
@@ -0,0 +1,70 @@
+This test checks the SVGViewSpec API
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+Check initial SVGSVGElement.currentView values on a SVGSVGElement
+PASS currentView.transform.numberOfItems is 0
+PASS currentView.viewTarget is null
+PASS currentView.zoomAndPan is SVGZoomAndPan.SVG_ZOOMANDPAN_MAGNIFY
+PASS currentView.viewBox.baseVal.x is 0
+PASS currentView.viewBox.baseVal.y is 0
+PASS currentView.viewBox.baseVal.width is 0
+PASS currentView.viewBox.baseVal.height is 0
+PASS currentView.preserveAspectRatio.baseVal.align is SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMID
+PASS currentView.preserveAspectRatio.baseVal.meetOrSlice is SVGPreserveAspectRatio.SVG_MEETORSLICE_MEET
+PASS currentView.viewBoxString is "0 0 0 0"
+PASS currentView.preserveAspectRatioString is "xMidYMid meet"
+PASS currentView.transformString is ""
+PASS currentView.viewTargetString is ""
+PASS currentView.zoomAndPan is SVGZoomAndPan.SVG_ZOOMANDPAN_MAGNIFY
+
+Try changing zoomAndPan - none of these will work, as SVGViewSpec is fully readonly - even the animated properties it inherits from parent classes like SVGZoomAndPan/SVGFitToViewBox
+PASS currentView.zoomAndPan = SVGZoomAndPan.SVG_ZOOMANDPAN_DISABLE threw exception Error: NO_MODIFICATION_ALLOWED_ERR: DOM Exception 7.
+PASS currentView.zoomAndPan is SVGZoomAndPan.SVG_ZOOMANDPAN_MAGNIFY
+
+Try changing viewBox - this has no affect on the SVGSVGElement the viewSpec belongs to - it exposed all its properties as read-only
+PASS currentView.viewBox.baseVal.x = 10 threw exception Error: NO_MODIFICATION_ALLOWED_ERR: DOM Exception 7.
+PASS currentView.viewBox.baseVal.x is 0
+PASS currentView.viewBox.baseVal.y = 20 threw exception Error: NO_MODIFICATION_ALLOWED_ERR: DOM Exception 7.
+PASS currentView.viewBox.baseVal.y is 0
+PASS currentView.viewBox.baseVal.width = 50 threw exception Error: NO_MODIFICATION_ALLOWED_ERR: DOM Exception 7.
+PASS currentView.viewBox.baseVal.width is 0
+PASS currentView.viewBox.baseVal.height = 100 threw exception Error: NO_MODIFICATION_ALLOWED_ERR: DOM Exception 7.
+PASS currentView.viewBox.baseVal.height is 0
+PASS currentView.viewBoxString is "0 0 0 0"
+
+Try changing viewBoxString
+PASS currentView.viewBoxString = '1 2 3 4' is "1 2 3 4"
+PASS currentView.viewBoxString is "0 0 0 0"
+
+Try changing preserveAspectRatio
+PASS currentView.preserveAspectRatio.baseVal.align = SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMIN threw exception Error: NO_MODIFICATION_ALLOWED_ERR: DOM Exception 7.
+PASS currentView.preserveAspectRatio.baseVal.align is SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMID
+PASS currentView.preserveAspectRatio.baseVal.meetOrSlice = SVGPreserveAspectRatio.SVG_MEETORSLICE_SLICE threw exception Error: NO_MODIFICATION_ALLOWED_ERR: DOM Exception 7.
+PASS currentView.preserveAspectRatio.baseVal.meetOrSlice is SVGPreserveAspectRatio.SVG_MEETORSLICE_MEET
+
+Try changing preserveAspectRatioString
+PASS currentView.preserveAspectRatioString = 'xMinYMin slice' is "xMinYMin slice"
+PASS currentView.preserveAspectRatioString is "xMidYMid meet"
+
+Try changing transformString
+PASS currentView.transformString = 'rotate(90)' is "rotate(90)"
+PASS currentView.transformString is ""
+
+Try changing viewTarget
+PASS currentView.viewTarget = svgElement is svgElement
+PASS currentView.viewTarget is null
+
+Try changing viewTargetString
+PASS currentView.viewTargetString = '#test' is "#test"
+PASS currentView.viewTargetString is ""
+
+Try changing transform
+PASS currentView.transform.clear() threw exception Error: NO_MODIFICATION_ALLOWED_ERR: DOM Exception 7.
+PASS currentView.transform.numberOfItems is 0
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/svg/dom/SVGViewSpec-defaults.html b/LayoutTests/svg/dom/SVGViewSpec-defaults.html
new file mode 100644
index 0000000..8cd9131
--- /dev/null
+++ b/LayoutTests/svg/dom/SVGViewSpec-defaults.html
@@ -0,0 +1,12 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<script src="../../fast/js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="script-tests/SVGViewSpec-defaults.js"></script>
+<script src="../../fast/js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/svg/dom/SVGViewSpec-expected.txt b/LayoutTests/svg/dom/SVGViewSpec-expected.txt
new file mode 100644
index 0000000..d10231a
--- /dev/null
+++ b/LayoutTests/svg/dom/SVGViewSpec-expected.txt
@@ -0,0 +1,51 @@
+This test checks the SVGViewSpec API, operating on a parsed viewSpec
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+Loading external SVG resources/viewspec-target.svg
+Passing SVGViewSpec: svgView(viewBox(0,0,100,50);preserveAspectRatio(xMinYMid slice);transform(translate(0 10) translate(25 25) rotate(45) translate(-25 -25) scale(0.7 0.7));viewTarget(blub);zoomAndPan(disable))
+
+
+Check transform value
+PASS currentView.transformString is "translate(0 10) translate(25 25) rotate(45) translate(-25 -25) scale(0.7 0.7)"
+PASS currentView.transform.numberOfItems is 5
+PASS currentView.transform.getItem(0).type is SVGTransform.SVG_TRANSFORM_TRANSLATE
+PASS currentView.transform.getItem(0).angle is 0
+PASS matrixToString(currentView.transform.getItem(0).matrix) is "[1.00 0.00 0.00 1.00 0.00 10.00]"
+PASS currentView.transform.getItem(1).type is SVGTransform.SVG_TRANSFORM_TRANSLATE
+PASS currentView.transform.getItem(1).angle is 0
+PASS matrixToString(currentView.transform.getItem(1).matrix) is "[1.00 0.00 0.00 1.00 25.00 25.00]"
+PASS currentView.transform.getItem(2).type is SVGTransform.SVG_TRANSFORM_ROTATE
+PASS currentView.transform.getItem(2).angle is 45
+PASS matrixToString(currentView.transform.getItem(2).matrix) is "[0.71 0.71 -0.71 0.71 0.00 0.00]"
+PASS currentView.transform.getItem(3).type is SVGTransform.SVG_TRANSFORM_TRANSLATE
+PASS currentView.transform.getItem(3).angle is 0
+PASS matrixToString(currentView.transform.getItem(3).matrix) is "[1.00 0.00 0.00 1.00 -25.00 -25.00]"
+PASS currentView.transform.getItem(4).type is SVGTransform.SVG_TRANSFORM_SCALE
+PASS currentView.transform.getItem(4).angle is 0
+PASS matrixToString(currentView.transform.getItem(4).matrix) is "[0.70 0.00 0.00 0.70 0.00 0.00]"
+
+Check viewTarget value
+PASS currentView.viewTargetString is "blub"
+PASS currentView.viewTarget is null
+
+Check zoomAndPan value
+PASS currentView.zoomAndPan is SVGZoomAndPan.SVG_ZOOMANDPAN_DISABLE
+
+Check viewBox value
+PASS currentView.viewBox.baseVal.x is 0
+PASS currentView.viewBox.baseVal.y is 0
+PASS currentView.viewBox.baseVal.width is 100
+PASS currentView.viewBox.baseVal.height is 50
+PASS currentView.viewBoxString is "0 0 100 50"
+
+Check preserveAspectRatio value
+PASS currentView.preserveAspectRatioString is "xMinYMid slice"
+PASS currentView.preserveAspectRatio.baseVal.align is SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMID
+PASS currentView.preserveAspectRatio.baseVal.meetOrSlice is SVGPreserveAspectRatio.SVG_MEETORSLICE_SLICE
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/svg/dom/SVGViewSpec.html b/LayoutTests/svg/dom/SVGViewSpec.html
new file mode 100644
index 0000000..a1f9992
--- /dev/null
+++ b/LayoutTests/svg/dom/SVGViewSpec.html
@@ -0,0 +1,11 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<script src="../../fast/js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="script-tests/SVGViewSpec.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/svg/dom/complex-svgView-specification-expected.html b/LayoutTests/svg/dom/complex-svgView-specification-expected.html
new file mode 100644
index 0000000..59ee67f
--- /dev/null
+++ b/LayoutTests/svg/dom/complex-svgView-specification-expected.html
@@ -0,0 +1,7 @@
+<!DOCTYPE html>
+<html>
+<body style="margin: 0">
+<svg style="display:block" width="120" height="120" viewBox="0 0 100 50" preserveAspectRatio="xMinYMid slice">
+	<rect fill="green" width="50" height="50" transform="translate(0 10) translate(25 25) rotate(45) translate(-25 -25) scale(0.7 0.7)"/>
+</svg>
+</body>
diff --git a/LayoutTests/svg/dom/complex-svgView-specification.html b/LayoutTests/svg/dom/complex-svgView-specification.html
new file mode 100644
index 0000000..0e38cc4
--- /dev/null
+++ b/LayoutTests/svg/dom/complex-svgView-specification.html
@@ -0,0 +1,5 @@
+<!DOCTYPE html>
+<html>
+<body style="margin: 0">
+    <iframe style="border: 0; display: block" width="120" height="120" src="resources/viewspec-target.svg#svgView(viewBox(0,0,100,50);preserveAspectRatio(xMinYMid slice);transform(translate(0 10) translate(25 25) rotate(45) translate(-25 -25) scale(0.7 0.7)))"/>
+</body>
diff --git a/LayoutTests/svg/dom/resources/viewspec-target.svg b/LayoutTests/svg/dom/resources/viewspec-target.svg
new file mode 100644
index 0000000..a7b5dc3
--- /dev/null
+++ b/LayoutTests/svg/dom/resources/viewspec-target.svg
@@ -0,0 +1,4 @@
+<svg xmlns="http://www.w3.org/2000/svg">
+  <rect width="50" height="50" fill="green"/>
+  <rect y="60" x="60" width="50" height="50" fill="red"/>
+</svg>
diff --git a/LayoutTests/svg/dom/script-tests/SVGViewSpec-defaults.js b/LayoutTests/svg/dom/script-tests/SVGViewSpec-defaults.js
new file mode 100644
index 0000000..243b56d
--- /dev/null
+++ b/LayoutTests/svg/dom/script-tests/SVGViewSpec-defaults.js
@@ -0,0 +1,84 @@
+description("This test checks the SVGViewSpec API");
+
+var svgElement = document.createElementNS("http://www.w3.org/2000/svg", "svg");
+var currentView = svgElement.currentView;
+svgElement.setAttribute("id", "test");
+svgElement.setAttribute("width", "150");
+svgElement.setAttribute("height", "50");
+svgElement.setAttribute("display", "block");
+
+debug("");
+debug("Check initial SVGSVGElement.currentView values on a SVGSVGElement");
+shouldBe("currentView.transform.numberOfItems", "0");
+shouldBeNull("currentView.viewTarget");
+shouldBe("currentView.zoomAndPan", "SVGZoomAndPan.SVG_ZOOMANDPAN_MAGNIFY");
+shouldBe("currentView.viewBox.baseVal.x", "0");
+shouldBe("currentView.viewBox.baseVal.y", "0");
+shouldBe("currentView.viewBox.baseVal.width", "0");
+shouldBe("currentView.viewBox.baseVal.height", "0");
+shouldBe("currentView.preserveAspectRatio.baseVal.align", "SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMID");
+shouldBe("currentView.preserveAspectRatio.baseVal.meetOrSlice", "SVGPreserveAspectRatio.SVG_MEETORSLICE_MEET");
+shouldBeEqualToString("currentView.viewBoxString", "0 0 0 0");
+shouldBeEqualToString("currentView.preserveAspectRatioString", "xMidYMid meet");
+shouldBeEqualToString("currentView.transformString", "");
+shouldBeEqualToString("currentView.viewTargetString", "");
+shouldBe("currentView.zoomAndPan", "SVGZoomAndPan.SVG_ZOOMANDPAN_MAGNIFY");
+
+debug("");
+debug("Try changing zoomAndPan - none of these will work, as SVGViewSpec is fully readonly - even the animated properties it inherits from parent classes like SVGZoomAndPan/SVGFitToViewBox");
+shouldThrow("currentView.zoomAndPan = SVGZoomAndPan.SVG_ZOOMANDPAN_DISABLE");
+shouldBe("currentView.zoomAndPan", "SVGZoomAndPan.SVG_ZOOMANDPAN_MAGNIFY");
+
+debug("");
+debug("Try changing viewBox - this has no affect on the SVGSVGElement the viewSpec belongs to - it exposed all its properties as read-only");
+shouldThrow("currentView.viewBox.baseVal.x = 10");
+shouldBe("currentView.viewBox.baseVal.x", "0");
+shouldThrow("currentView.viewBox.baseVal.y = 20");
+shouldBe("currentView.viewBox.baseVal.y", "0");
+shouldThrow("currentView.viewBox.baseVal.width = 50");
+shouldBe("currentView.viewBox.baseVal.width", "0");
+shouldThrow("currentView.viewBox.baseVal.height = 100");
+shouldBe("currentView.viewBox.baseVal.height", "0");
+shouldBeEqualToString("currentView.viewBoxString", "0 0 0 0");
+
+debug("");
+debug("Try changing viewBoxString");
+shouldBeEqualToString("currentView.viewBoxString = '1 2 3 4'", "1 2 3 4");
+shouldBeEqualToString("currentView.viewBoxString", "0 0 0 0");
+
+debug("");
+debug("Try changing preserveAspectRatio");
+shouldThrow("currentView.preserveAspectRatio.baseVal.align = SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMIN");
+shouldBe("currentView.preserveAspectRatio.baseVal.align", "SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMID");
+shouldThrow("currentView.preserveAspectRatio.baseVal.meetOrSlice = SVGPreserveAspectRatio.SVG_MEETORSLICE_SLICE");
+shouldBe("currentView.preserveAspectRatio.baseVal.meetOrSlice", "SVGPreserveAspectRatio.SVG_MEETORSLICE_MEET");
+
+debug("");
+debug("Try changing preserveAspectRatioString");
+shouldBeEqualToString("currentView.preserveAspectRatioString = 'xMinYMin slice'", "xMinYMin slice");
+shouldBeEqualToString("currentView.preserveAspectRatioString", "xMidYMid meet");
+
+
+debug("");
+debug("Try changing transformString");
+shouldBeEqualToString("currentView.transformString = 'rotate(90)'", "rotate(90)");
+shouldBeEqualToString("currentView.transformString", "");
+
+
+debug("");
+debug("Try changing viewTarget");
+shouldBe("currentView.viewTarget = svgElement", "svgElement");
+shouldBeNull("currentView.viewTarget");
+
+
+debug("");
+debug("Try changing viewTargetString");
+shouldBeEqualToString("currentView.viewTargetString = '#test'", "#test");
+shouldBeEqualToString("currentView.viewTargetString", "");
+
+debug("");
+debug("Try changing transform");
+shouldThrow("currentView.transform.clear()");
+shouldBe("currentView.transform.numberOfItems", "0");
+
+successfullyParsed = true;
diff --git a/LayoutTests/svg/dom/script-tests/SVGViewSpec.js b/LayoutTests/svg/dom/script-tests/SVGViewSpec.js
new file mode 100644
index 0000000..f6c85c1
--- /dev/null
+++ b/LayoutTests/svg/dom/script-tests/SVGViewSpec.js
@@ -0,0 +1,94 @@
+description("This test checks the SVGViewSpec API, operating on a parsed viewSpec");
+if (window.layoutTestController)
+    layoutTestController.waitUntilDone();
+
+function completeTest() {
+    var script = document.createElement("script");
+
+    script.onload = function() {
+        if (window.layoutTestController)
+            layoutTestController.notifyDone();
+    };
+
+    script.src = "../../fast/js/resources/js-test-post.js";
+    document.body.appendChild(script);
+}
+
+// Load an external file to test svgView() handling.
+function testFragment(string) {
+    debug("");
+    debug("Loading external SVG resources/viewspec-target.svg");
+    debug("Passing SVGViewSpec: " + string);
+    debug("");
+    var iframeElement = document.createElement("iframe");
+    iframeElement.setAttribute("id", "iframe");
+    iframeElement.setAttribute("style", "display: block");
+    iframeElement.setAttribute("width", "120px");
+    iframeElement.setAttribute("height", "120px");
+    iframeElement.setAttribute("onload", "setTimeout(continueTesting, 0)");
+    var newURL = "resources/viewspec-target.svg#" + string;
+    iframeElement.src = newURL;
+
+    document.getElementById("console").appendChild(iframeElement);
+}
+
+function matrixToString(matrix) {
+    return "[" + matrix.a.toFixed(2) + " " + matrix.b.toFixed(2) + " " + matrix.c.toFixed(2) + " " + matrix.d.toFixed(2) + " " + matrix.e.toFixed(2) + " " + matrix.f.toFixed(2) + "]";
+}
+
+function continueTesting() {
+    currentView = document.getElementById("iframe").contentDocument.documentElement.currentView;
+
+    debug("");
+    debug("Check transform value");
+    shouldBeEqualToString("currentView.transformString", "translate(0 10) translate(25 25) rotate(45) translate(-25 -25) scale(0.7 0.7)");
+    shouldBe("currentView.transform.numberOfItems", "5");
+
+    shouldBe("currentView.transform.getItem(0).type", "SVGTransform.SVG_TRANSFORM_TRANSLATE");
+    shouldBe("currentView.transform.getItem(0).angle", "0");
+    shouldBeEqualToString("matrixToString(currentView.transform.getItem(0).matrix)", "[1.00 0.00 0.00 1.00 0.00 10.00]");
+
+    shouldBe("currentView.transform.getItem(1).type", "SVGTransform.SVG_TRANSFORM_TRANSLATE");
+    shouldBe("currentView.transform.getItem(1).angle", "0");
+    shouldBeEqualToString("matrixToString(currentView.transform.getItem(1).matrix)", "[1.00 0.00 0.00 1.00 25.00 25.00]");
+
+    shouldBe("currentView.transform.getItem(2).type", "SVGTransform.SVG_TRANSFORM_ROTATE");
+    shouldBe("currentView.transform.getItem(2).angle", "45");
+    shouldBeEqualToString("matrixToString(currentView.transform.getItem(2).matrix)", "[0.71 0.71 -0.71 0.71 0.00 0.00]");
+
+    shouldBe("currentView.transform.getItem(3).type", "SVGTransform.SVG_TRANSFORM_TRANSLATE");
+    shouldBe("currentView.transform.getItem(3).angle", "0");
+    shouldBeEqualToString("matrixToString(currentView.transform.getItem(3).matrix)", "[1.00 0.00 0.00 1.00 -25.00 -25.00]");
+
+    shouldBe("currentView.transform.getItem(4).type", "SVGTransform.SVG_TRANSFORM_SCALE");
+    shouldBe("currentView.transform.getItem(4).angle", "0");
+    shouldBeEqualToString("matrixToString(currentView.transform.getItem(4).matrix)", "[0.70 0.00 0.00 0.70 0.00 0.00]");
+
+    debug("");
+    debug("Check viewTarget value");
+    shouldBeEqualToString("currentView.viewTargetString", "blub");
+    shouldBeNull("currentView.viewTarget"); // There's no element named 'blub' in the tree.
+
+    debug("");
+    debug("Check zoomAndPan value");
+    shouldBe("currentView.zoomAndPan", "SVGZoomAndPan.SVG_ZOOMANDPAN_DISABLE");
+
+    debug("");
+    debug("Check viewBox value");
+    shouldBe("currentView.viewBox.baseVal.x", "0");
+    shouldBe("currentView.viewBox.baseVal.y", "0");
+    shouldBe("currentView.viewBox.baseVal.width", "100");
+    shouldBe("currentView.viewBox.baseVal.height", "50");
+    shouldBeEqualToString("currentView.viewBoxString", "0 0 100 50");
+
+    debug("");
+    debug("Check preserveAspectRatio value");
+    shouldBeEqualToString("currentView.preserveAspectRatioString", "xMinYMid slice");
+    shouldBe("currentView.preserveAspectRatio.baseVal.align", "SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMID");
+    shouldBe("currentView.preserveAspectRatio.baseVal.meetOrSlice", "SVGPreserveAspectRatio.SVG_MEETORSLICE_SLICE");
+
+    completeTest();
+}
+
+testFragment("svgView(viewBox(0,0,100,50);preserveAspectRatio(xMinYMid slice);transform(translate(0 10) translate(25 25) rotate(45) translate(-25 -25) scale(0.7 0.7));viewTarget(blub);zoomAndPan(disable))");
+successfullyParsed = true;
diff --git a/LayoutTests/svg/dom/viewspec-parser-expected.txt b/LayoutTests/svg/dom/viewspec-parser-expected.txt
new file mode 100644
index 0000000..3d5dade
--- /dev/null
+++ b/LayoutTests/svg/dom/viewspec-parser-expected.txt
@@ -0,0 +1,945 @@
+This test fuzzes the transform parser with semi-random attribute values and dumps the results of any values that parse successfully.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+Loaded: resources/viewspec-target.svg#
+Parsed: [initial view] from: [initial view]
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(0,0,200,200)))
+Parsed: svgView(viewBox(0 0 200 200)) from: svgView(viewBox(0,0,200,200)))
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(xMaxYMin slice))
+Parsed: svgView(preserveAspectRatio(xMaxYMin slice)) from: svgView(preserveAspectRatio(xMaxYMin slice))
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(xMaxYMin))
+Parsed: svgView(preserveAspectRatio(xMaxYMin meet)) from: svgView(preserveAspectRatio(xMaxYMin))
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(1,2,3,4);preserveAspectRatio(xMaxYMin))
+Parsed: svgView(viewBox(1 2 3 4);preserveAspectRatio(xMaxYMin meet)) from: svgView(viewBox(1,2,3,4);preserveAspectRatio(xMaxYMin))
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(disable))
+Parsed: svgView(zoomAndPan(disable)) from: svgView(zoomAndPan(disable))
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(#myElementId))
+Parsed: svgView(viewTarget(#myElementId)) from: svgView(viewTarget(#myElementId))
+
+Loaded: resources/viewspec-target.svg#svgView
+Parsed: [initial view] from: svgView
+
+Loaded: resources/viewspec-target.svg#svgView(
+Parsed: [initial view] from: svgView(
+
+Loaded: resources/viewspec-target.svg#svgView()
+Parsed: [initial view] from: svgView()
+
+Loaded: resources/viewspec-target.svg#svgView(
+Parsed: [initial view] from: svgView(
+
+Loaded: resources/viewspec-target.svg#svgView(transform(scale(2));;)
+Parsed: [initial view] from: svgView(transform(scale(2));;)
+
+Loaded: resources/viewspec-target.svg#svgView(transform(scale(2));x
+Parsed: [initial view] from: svgView(transform(scale(2));x
+
+Loaded: resources/viewspec-target.svg#svgView(transform(scale(.5)))
+Parsed: svgView(transform(scale(0.5 0.5))) from: svgView(transform(scale(.5)))
+
+Loaded: resources/viewspec-target.svg#svgView(;transform(scale(.5)))
+Parsed: [initial view] from: svgView(;transform(scale(.5)))
+
+Loaded: resources/viewspec-target.svg#svgView(;;transform(scale(.5)))
+Parsed: [initial view] from: svgView(;;transform(scale(.5)))
+
+Loaded: resources/viewspec-target.svg#svgView(transform(scale(.5));transform(scale(2));transform(scale(2)))
+Parsed: svgView(transform(scale(0.5 0.5) scale(2 2) scale(2 2))) from: svgView(transform(scale(.5));transform(scale(2));transform(scale(2)))
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox())
+Parsed: [initial view] from: svgView(viewBox())
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(0))
+Parsed: [initial view] from: svgView(viewBox(0))
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(0,0))
+Parsed: [initial view] from: svgView(viewBox(0,0))
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(0,0,0))
+Parsed: [initial view] from: svgView(viewBox(0,0,0))
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(0,0,0,0))
+Parsed: [initial view] from: svgView(viewBox(0,0,0,0))
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox( 78)28
+Parsed: [initial view] from: svgView(viewBox( 78)2	8	
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(e.
+Parsed: [initial view] from: svgView(viewBox(e.
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(7
+Parsed: [initial view] from: svgView(viewBox(7
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox((
+Parsed: [initial view] from: svgView(viewBox(	(
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(
+Parsed: [initial view] from: svgView(viewBox(
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(.)29e0 7950,- e
+Parsed: [initial view] from: svgView(viewBox(.)2	9e0 795	0,- e
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(e,4(7- )+e(e8.
+Parsed: [initial view] from: svgView(viewBox(e,4(7- )+e(e8.
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(74- 9.(+ e.0e635
+Parsed: [initial view] from: svgView(viewBox(74- 9.(+ e.0e635
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(-9,).8e7e4e9ee
+Parsed: [initial view] from: svgView(viewBox(-9,).8e7e4e9ee 
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(49-,,4)30378.052
+Parsed: [initial view] from: svgView(viewBox(49-,,4)30378.052
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(e7863e
+Parsed: [initial view] from: svgView(viewBox(e7863e
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(0
+Parsed: [initial view] from: svgView(viewBox(	0
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(e72(e,49.7.
+Parsed: [initial view] from: svgView(viewBox(e72(	e	,49.7.
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(e55,
+Parsed: [initial view] from: svgView(viewBox(e55, 
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(263,ee1)74-
+Parsed: [initial view] from: svgView(viewBox(263,ee1)74-	
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(.64110,.+1.
+Parsed: [initial view] from: svgView(viewBox(.64110,.+1.
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(.59e3...725-
+Parsed: [initial view] from: svgView(viewBox(.59e3...725-
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(6-)2).180
+Parsed: [initial view] from: svgView(viewBox(6	-)2).180
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(,e 579++.
+Parsed: [initial view] from: svgView(viewBox(,e 579	++.
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(-+
+Parsed: [initial view] from: svgView(viewBox(-+
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(74e-6-)297
+Parsed: [initial view] from: svgView(viewBox(74e	-	6	-)29	7
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(221e..++77
+Parsed: [initial view] from: svgView(viewBox(221e..+	+77
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox())4e1e).-e8378.
+Parsed: [initial view] from: svgView(viewBox())4e	1e).-e8378.
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(4+01 e
+Parsed: [initial view] from: svgView(viewBox(	4+01 	e
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(
+Parsed: [initial view] from: svgView(viewBox(
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(-6++9++ 9.3)6438
+Parsed: [initial view] from: svgView(viewBox(-6++9++ 9.3)6438
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(-,15e)(-+,- 6
+Parsed: [initial view] from: svgView(viewBox(-,15e)(-+,- 6
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(3e+)085932
+Parsed: [initial view] from: svgView(viewBox(3e+)085932
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(+
+Parsed: [initial view] from: svgView(viewBox(+
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(-
+Parsed: [initial view] from: svgView(viewBox(-
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(0944.6-
+Parsed: [initial view] from: svgView(viewBox(	0944.6-
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(.
+Parsed: [initial view] from: svgView(viewBox(.
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(5
+Parsed: [initial view] from: svgView(viewBox(	5
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(3e(-2e3e
+Parsed: [initial view] from: svgView(viewBox(3e(-2e3e
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(
+Parsed: [initial view] from: svgView(viewBox(
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(65e 3e(.1 6916
+Parsed: [initial view] from: svgView(viewBox(6	5e 3e	(.	1 69	16
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(1ee5 56,(8.5e,3
+Parsed: [initial view] from: svgView(viewBox(1ee5 56,(8.5	e,3
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(e- e-
+Parsed: [initial view] from: svgView(viewBox(e-		 e-
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox()e0e)
+Parsed: [initial view] from: svgView(viewBox()e0e)
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(231293.16e
+Parsed: [initial view] from: svgView(viewBox(231293.16e
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(()2(37-888580(9e+
+Parsed: [initial view] from: svgView(viewBox(()2(37-888580(9e+
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(18e805
+Parsed: [initial view] from: svgView(viewBox(18e805
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(0
+Parsed: [initial view] from: svgView(viewBox(0
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(63) 693(
+Parsed: [initial view] from: svgView(viewBox(63) 693(
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(80,2)+ 4ee,
+Parsed: [initial view] from: svgView(viewBox(80,2)+ 4ee,
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(5e+59e2e5
+Parsed: [initial view] from: svgView(viewBox(5e+59e2e5
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(53e,9
+Parsed: [initial view] from: svgView(viewBox(5	3e,9
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(e7)((59
+Parsed: [initial view] from: svgView(viewBox(e7	)((59	
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(963.+8-e73-e+)
+Parsed: [initial view] from: svgView(viewBox(963.+8-e73-e		+)
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox(71(1(+-3382.3
+Parsed: [initial view] from: svgView(viewBox(71(1(+-3382.3
+
+Loaded: resources/viewspec-target.svg#svgView(viewBoxx(0, 0)
+Parsed: [initial view] from: svgView(viewBoxx(0, 0)
+
+Loaded: resources/viewspec-target.svg#svgView(viewBo(0, 0)
+Parsed: [initial view] from: svgView(viewBo(0, 0)
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox
+Parsed: [initial view] from: svgView(viewBox
+
+Loaded: resources/viewspec-target.svg#svgView(viewBox
+Parsed: [initial view] from: svgView(viewBox
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio())
+Parsed: [initial view] from: svgView(preserveAspectRatio())
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(0))
+Parsed: [initial view] from: svgView(preserveAspectRatio(0))
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(0,0))
+Parsed: [initial view] from: svgView(preserveAspectRatio(0,0))
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(0,0,0))
+Parsed: [initial view] from: svgView(preserveAspectRatio(0,0,0))
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(0,0,0,0))
+Parsed: [initial view] from: svgView(preserveAspectRatio(0,0,0,0))
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio( 27(
+Parsed: [initial view] from: svgView(preserveAspectRatio( 27(
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(
+Parsed: [initial view] from: svgView(preserveAspectRatio(
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(+
+Parsed: [initial view] from: svgView(preserveAspectRatio(+
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(88
+Parsed: [initial view] from: svgView(preserveAspectRatio(88
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(9 43,+6 87.)
+Parsed: [initial view] from: svgView(preserveAspectRatio(9 43,+6 87.)
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(- .5997
+Parsed: [initial view] from: svgView(preserveAspectRatio(	-	 .5997
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(5.9)557
+Parsed: [initial view] from: svgView(preserveAspectRatio(5.9)557
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(+65)e)0,217
+Parsed: [initial view] from: svgView(preserveAspectRatio(+65)e)0,	217
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(.2
+Parsed: [initial view] from: svgView(preserveAspectRatio(.2
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(+
+Parsed: [initial view] from: svgView(preserveAspectRatio(+	
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(e8+(++e52,. 73
+Parsed: [initial view] from: svgView(preserveAspectRatio(e8+(++	e52,. 73
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(,0+.
+Parsed: [initial view] from: svgView(preserveAspectRatio(,0+	.
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(-59-62159544,8,3
+Parsed: [initial view] from: svgView(preserveAspectRatio(-59-62159544,8,	3	
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(0857) 5
+Parsed: [initial view] from: svgView(preserveAspectRatio(0857) 5
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(6,71+5e )e
+Parsed: [initial view] from: svgView(preserveAspectRatio(6,71+5e )e 
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(2e5
+Parsed: [initial view] from: svgView(preserveAspectRatio(2e5	
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(1e2)7e()90
+Parsed: [initial view] from: svgView(preserveAspectRatio(1e2)7e()	90
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(9.-)7
+Parsed: [initial view] from: svgView(preserveAspectRatio(9.-)7
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(8e759.6,
+Parsed: [initial view] from: svgView(preserveAspectRatio(8e759.6,
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(2(65.59e0+8-5
+Parsed: [initial view] from: svgView(preserveAspectRatio(2(65	.59e0+8-5
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(.0712
+Parsed: [initial view] from: svgView(preserveAspectRatio(.0712
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(e97,e33-)6,(e0-1+
+Parsed: [initial view] from: svgView(preserveAspectRatio(e97,e33-)6,(e0-1	+
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(. 3 6.e,)57e7.(6
+Parsed: [initial view] from: svgView(preserveAspectRatio(. 3 6.e,)57e7.	(6
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(1-7.(e(8.e-)e.) 63
+Parsed: [initial view] from: svgView(preserveAspectRatio(1-7.(e(8.e-)e.) 63	
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(6786- +8912e
+Parsed: [initial view] from: svgView(preserveAspectRatio(6786- +8912e
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio()ee8),-886().9--
+Parsed: [initial view] from: svgView(preserveAspectRatio()ee8),-886().9	--	
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(.,e5732.
+Parsed: [initial view] from: svgView(preserveAspectRatio(.,e5732.
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(18-+
+Parsed: [initial view] from: svgView(preserveAspectRatio(18-+
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(3,(13e+711e9eee0.)
+Parsed: [initial view] from: svgView(preserveAspectRatio(3,(13e+711e9eee0.)
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(6
+Parsed: [initial view] from: svgView(preserveAspectRatio(6	
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio()+69
+Parsed: [initial view] from: svgView(preserveAspectRatio()	+69
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(, 19e)2)+0-(9)2
+Parsed: [initial view] from: svgView(preserveAspectRatio(, 19e	)2)+0-(9)2
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(1e,--+810)5..e37
+Parsed: [initial view] from: svgView(preserveAspectRatio(1e,--+810)5..e37
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(35 )+e
+Parsed: [initial view] from: svgView(preserveAspectRatio(35 )+e
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(362020()8347081e78
+Parsed: [initial view] from: svgView(preserveAspectRatio(362020()8347081e78
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio()+
+Parsed: [initial view] from: svgView(preserveAspectRatio()+
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(e-.54(+0063141e
+Parsed: [initial view] from: svgView(preserveAspectRatio(e-.54(+006	3141e
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(e).1+9e.0)7
+Parsed: [initial view] from: svgView(preserveAspectRatio(e)	.1+9e.0)7
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(61)2e.
+Parsed: [initial view] from: svgView(preserveAspectRatio(61)2e.
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(7075-5(e67)+(-7)7)
+Parsed: [initial view] from: svgView(preserveAspectRatio(7075-5(e67)+(-7)7)
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(e
+Parsed: [initial view] from: svgView(preserveAspectRatio(e  
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(88)(3e21
+Parsed: [initial view] from: svgView(preserveAspectRatio(88)(3e21
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(3e-003(4
+Parsed: [initial view] from: svgView(preserveAspectRatio(3e-003(4
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(682- 19-0)4642
+Parsed: [initial view] from: svgView(preserveAspectRatio(682- 	19-0)4642
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(6 7
+Parsed: [initial view] from: svgView(preserveAspectRatio(6 7
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(.9e1.e6+,e0-20e)9
+Parsed: [initial view] from: svgView(preserveAspectRatio(.9e1.e6+,e0-	20e	)9
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(e+
+Parsed: [initial view] from: svgView(preserveAspectRatio(e+
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(96,e20 1e2-5)
+Parsed: [initial view] from: svgView(preserveAspectRatio(96,e2	0 1e2-5)
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio( 8-7(3.
+Parsed: [initial view] from: svgView(preserveAspectRatio( 8-7(3.
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio(
+Parsed: [initial view] from: svgView(preserveAspectRatio(
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatioo(0, 0)
+Parsed: [initial view] from: svgView(preserveAspectRatioo(0, 0)
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRati(0, 0)
+Parsed: [initial view] from: svgView(preserveAspectRati(0, 0)
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio
+Parsed: [initial view] from: svgView(preserveAspectRatio
+
+Loaded: resources/viewspec-target.svg#svgView(preserveAspectRatio
+Parsed: [initial view] from: svgView(preserveAspectRatio
+
+Loaded: resources/viewspec-target.svg#svgView(transform())
+Parsed: [initial view] from: svgView(transform())
+
+Loaded: resources/viewspec-target.svg#svgView(transform(0))
+Parsed: [initial view] from: svgView(transform(0))
+
+Loaded: resources/viewspec-target.svg#svgView(transform(0,0))
+Parsed: [initial view] from: svgView(transform(0,0))
+
+Loaded: resources/viewspec-target.svg#svgView(transform(0,0,0))
+Parsed: [initial view] from: svgView(transform(0,0,0))
+
+Loaded: resources/viewspec-target.svg#svgView(transform(0,0,0,0))
+Parsed: [initial view] from: svgView(transform(0,0,0,0))
+
+Loaded: resources/viewspec-target.svg#svgView(transform(8 78
+Parsed: [initial view] from: svgView(transform(8 78
+
+Loaded: resources/viewspec-target.svg#svgView(transform(282e.172(0 .)
+Parsed: [initial view] from: svgView(transform(2	8	2e.172	(0 .)
+
+Loaded: resources/viewspec-target.svg#svgView(transform(9
+Parsed: [initial view] from: svgView(transform(	9
+
+Loaded: resources/viewspec-target.svg#svgView(transform(0 7950,- eee,
+Parsed: [initial view] from: svgView(transform(0 795	0,- eee,
+
+Loaded: resources/viewspec-target.svg#svgView(transform((7-
+Parsed: [initial view] from: svgView(transform((7- 
+
+Loaded: resources/viewspec-target.svg#svgView(transform(+e(e8.)74- 9.(+
+Parsed: [initial view] from: svgView(transform(+e(e8.)74- 9.(+ 
+
+Loaded: resources/viewspec-target.svg#svgView(transform(.0e635(-9,).8e
+Parsed: [initial view] from: svgView(transform(.0e635(-9,).8e
+
+Loaded: resources/viewspec-target.svg#svgView(transform(e4e9ee
+Parsed: [initial view] from: svgView(transform(e4e9ee 
+
+Loaded: resources/viewspec-target.svg#svgView(transform(49-,,4)30378.052
+Parsed: [initial view] from: svgView(transform(49-,,4)30378.052
+
+Loaded: resources/viewspec-target.svg#svgView(transform(e7863e
+Parsed: [initial view] from: svgView(transform(e7863e
+
+Loaded: resources/viewspec-target.svg#svgView(transform(0
+Parsed: [initial view] from: svgView(transform(	0
+
+Loaded: resources/viewspec-target.svg#svgView(transform(e72(e,49.7.
+Parsed: [initial view] from: svgView(transform(e72(	e	,49.7.
+
+Loaded: resources/viewspec-target.svg#svgView(transform(e55,
+Parsed: [initial view] from: svgView(transform(e55, 
+
+Loaded: resources/viewspec-target.svg#svgView(transform(263,ee1)74-
+Parsed: [initial view] from: svgView(transform(263,ee1)74-	
+
+Loaded: resources/viewspec-target.svg#svgView(transform(.64110,.+1.
+Parsed: [initial view] from: svgView(transform(.64110,.+1.
+
+Loaded: resources/viewspec-target.svg#svgView(transform(.59e3...725-
+Parsed: [initial view] from: svgView(transform(.59e3...725-
+
+Loaded: resources/viewspec-target.svg#svgView(transform(6-)2).180
+Parsed: [initial view] from: svgView(transform(6	-)2).180
+
+Loaded: resources/viewspec-target.svg#svgView(transform(,e 579++.
+Parsed: [initial view] from: svgView(transform(,e 579	++.
+
+Loaded: resources/viewspec-target.svg#svgView(transform(-+
+Parsed: [initial view] from: svgView(transform(-+
+
+Loaded: resources/viewspec-target.svg#svgView(transform(74e-6-)297
+Parsed: [initial view] from: svgView(transform(74e	-	6	-)29	7
+
+Loaded: resources/viewspec-target.svg#svgView(transform(221e..++77
+Parsed: [initial view] from: svgView(transform(221e..+	+77
+
+Loaded: resources/viewspec-target.svg#svgView(transform())4e1e).-e8378.
+Parsed: [initial view] from: svgView(transform())4e	1e).-e8378.
+
+Loaded: resources/viewspec-target.svg#svgView(transform(4+01 e
+Parsed: [initial view] from: svgView(transform(	4+01 	e
+
+Loaded: resources/viewspec-target.svg#svgView(transform(
+Parsed: [initial view] from: svgView(transform(
+
+Loaded: resources/viewspec-target.svg#svgView(transform(-6++9++ 9.3)6438
+Parsed: [initial view] from: svgView(transform(-6++9++ 9.3)6438
+
+Loaded: resources/viewspec-target.svg#svgView(transform(-,15e)(-+,- 6
+Parsed: [initial view] from: svgView(transform(-,15e)(-+,- 6
+
+Loaded: resources/viewspec-target.svg#svgView(transform(3e+)085932
+Parsed: [initial view] from: svgView(transform(3e+)085932
+
+Loaded: resources/viewspec-target.svg#svgView(transform(+
+Parsed: [initial view] from: svgView(transform(+
+
+Loaded: resources/viewspec-target.svg#svgView(transform(-
+Parsed: [initial view] from: svgView(transform(-
+
+Loaded: resources/viewspec-target.svg#svgView(transform(0944.6-
+Parsed: [initial view] from: svgView(transform(	0944.6-
+
+Loaded: resources/viewspec-target.svg#svgView(transform(.
+Parsed: [initial view] from: svgView(transform(.
+
+Loaded: resources/viewspec-target.svg#svgView(transform(5
+Parsed: [initial view] from: svgView(transform(	5
+
+Loaded: resources/viewspec-target.svg#svgView(transform(3e(-2e3e
+Parsed: [initial view] from: svgView(transform(3e(-2e3e
+
+Loaded: resources/viewspec-target.svg#svgView(transform(
+Parsed: [initial view] from: svgView(transform(
+
+Loaded: resources/viewspec-target.svg#svgView(transform(65e 3e(.1 6916
+Parsed: [initial view] from: svgView(transform(6	5e 3e	(.	1 69	16
+
+Loaded: resources/viewspec-target.svg#svgView(transform(1ee5 56,(8.5e,3
+Parsed: [initial view] from: svgView(transform(1ee5 56,(8.5	e,3
+
+Loaded: resources/viewspec-target.svg#svgView(transform(e- e-
+Parsed: [initial view] from: svgView(transform(e-		 e-
+
+Loaded: resources/viewspec-target.svg#svgView(transform()e0e)
+Parsed: [initial view] from: svgView(transform()e0e)
+
+Loaded: resources/viewspec-target.svg#svgView(transform(231293.16e
+Parsed: [initial view] from: svgView(transform(231293.16e
+
+Loaded: resources/viewspec-target.svg#svgView(transform(()2(37-888580(9e+
+Parsed: [initial view] from: svgView(transform(()2(37-888580(9e+
+
+Loaded: resources/viewspec-target.svg#svgView(transform(18e805
+Parsed: [initial view] from: svgView(transform(18e805
+
+Loaded: resources/viewspec-target.svg#svgView(transform(0
+Parsed: [initial view] from: svgView(transform(0
+
+Loaded: resources/viewspec-target.svg#svgView(transform(63) 693(
+Parsed: [initial view] from: svgView(transform(63) 693(
+
+Loaded: resources/viewspec-target.svg#svgView(transform(80,2)+ 4ee,
+Parsed: [initial view] from: svgView(transform(80,2)+ 4ee,
+
+Loaded: resources/viewspec-target.svg#svgView(transform(5e+59e2e5
+Parsed: [initial view] from: svgView(transform(5e+59e2e5
+
+Loaded: resources/viewspec-target.svg#svgView(transform(53e,9
+Parsed: [initial view] from: svgView(transform(5	3e,9
+
+Loaded: resources/viewspec-target.svg#svgView(transform(e7)((59
+Parsed: [initial view] from: svgView(transform(e7	)((59	
+
+Loaded: resources/viewspec-target.svg#svgView(transform(963.+8-e73-e+)
+Parsed: [initial view] from: svgView(transform(963.+8-e73-e		+)
+
+Loaded: resources/viewspec-target.svg#svgView(transform(71(1(+-3382.3
+Parsed: [initial view] from: svgView(transform(71(1(+-3382.3
+
+Loaded: resources/viewspec-target.svg#svgView(transform( 27(
+Parsed: [initial view] from: svgView(transform( 27(
+
+Loaded: resources/viewspec-target.svg#svgView(transformm(0, 0)
+Parsed: [initial view] from: svgView(transformm(0, 0)
+
+Loaded: resources/viewspec-target.svg#svgView(transfor(0, 0)
+Parsed: [initial view] from: svgView(transfor(0, 0)
+
+Loaded: resources/viewspec-target.svg#svgView(transform
+Parsed: [initial view] from: svgView(transform
+
+Loaded: resources/viewspec-target.svg#svgView(transform
+Parsed: [initial view] from: svgView(transform
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan())
+Parsed: [initial view] from: svgView(zoomAndPan())
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(0))
+Parsed: [initial view] from: svgView(zoomAndPan(0))
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(0,0))
+Parsed: [initial view] from: svgView(zoomAndPan(0,0))
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(0,0,0))
+Parsed: [initial view] from: svgView(zoomAndPan(0,0,0))
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(0,0,0,0))
+Parsed: [initial view] from: svgView(zoomAndPan(0,0,0,0))
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(
+Parsed: [initial view] from: svgView(zoomAndPan(
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(+
+Parsed: [initial view] from: svgView(zoomAndPan(+
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(88
+Parsed: [initial view] from: svgView(zoomAndPan(88
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(9 43,+6 87.)
+Parsed: [initial view] from: svgView(zoomAndPan(9 43,+6 87.)
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(- .5997
+Parsed: [initial view] from: svgView(zoomAndPan(	-	 .5997
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(5.9)557
+Parsed: [initial view] from: svgView(zoomAndPan(5.9)557
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(+65)e)0,217
+Parsed: [initial view] from: svgView(zoomAndPan(+65)e)0,	217
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(.2
+Parsed: [initial view] from: svgView(zoomAndPan(.2
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(+
+Parsed: [initial view] from: svgView(zoomAndPan(+	
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(e8+(++e52,. 73
+Parsed: [initial view] from: svgView(zoomAndPan(e8+(++	e52,. 73
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(,0+.
+Parsed: [initial view] from: svgView(zoomAndPan(,0+	.
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(-59-62159544,8,3
+Parsed: [initial view] from: svgView(zoomAndPan(-59-62159544,8,	3	
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(0857) 5
+Parsed: [initial view] from: svgView(zoomAndPan(0857) 5
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(6,71+5e )e
+Parsed: [initial view] from: svgView(zoomAndPan(6,71+5e )e 
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(2e5
+Parsed: [initial view] from: svgView(zoomAndPan(2e5	
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(1e2)7e()90
+Parsed: [initial view] from: svgView(zoomAndPan(1e2)7e()	90
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(9.-)7
+Parsed: [initial view] from: svgView(zoomAndPan(9.-)7
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(8e759.6,
+Parsed: [initial view] from: svgView(zoomAndPan(8e759.6,
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(2(65.59e0+8-5
+Parsed: [initial view] from: svgView(zoomAndPan(2(65	.59e0+8-5
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(.0712
+Parsed: [initial view] from: svgView(zoomAndPan(.0712
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(e97,e33-)6,(e0-1+
+Parsed: [initial view] from: svgView(zoomAndPan(e97,e33-)6,(e0-1	+
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(. 3 6.e,)57e7.(6
+Parsed: [initial view] from: svgView(zoomAndPan(. 3 6.e,)57e7.	(6
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(1-7.(e(8.e-)e.) 63
+Parsed: [initial view] from: svgView(zoomAndPan(1-7.(e(8.e-)e.) 63	
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(6786- +8912e
+Parsed: [initial view] from: svgView(zoomAndPan(6786- +8912e
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan()ee8),-886().9--
+Parsed: [initial view] from: svgView(zoomAndPan()ee8),-886().9	--	
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(.,e5732.
+Parsed: [initial view] from: svgView(zoomAndPan(.,e5732.
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(18-+
+Parsed: [initial view] from: svgView(zoomAndPan(18-+
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(3,(13e+711e9eee0.)
+Parsed: [initial view] from: svgView(zoomAndPan(3,(13e+711e9eee0.)
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(6
+Parsed: [initial view] from: svgView(zoomAndPan(6	
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan()+69
+Parsed: [initial view] from: svgView(zoomAndPan()	+69
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(, 19e)2)+0-(9)2
+Parsed: [initial view] from: svgView(zoomAndPan(, 19e	)2)+0-(9)2
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(1e,--+810)5..e37
+Parsed: [initial view] from: svgView(zoomAndPan(1e,--+810)5..e37
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(35 )+e
+Parsed: [initial view] from: svgView(zoomAndPan(35 )+e
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(362020()8347081e78
+Parsed: [initial view] from: svgView(zoomAndPan(362020()8347081e78
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan()+
+Parsed: [initial view] from: svgView(zoomAndPan()+
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(e-.54(+0063141e
+Parsed: [initial view] from: svgView(zoomAndPan(e-.54(+006	3141e
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(e).1+9e.0)7
+Parsed: [initial view] from: svgView(zoomAndPan(e)	.1+9e.0)7
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(61)2e.
+Parsed: [initial view] from: svgView(zoomAndPan(61)2e.
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(7075-5(e67)+(-7)7)
+Parsed: [initial view] from: svgView(zoomAndPan(7075-5(e67)+(-7)7)
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(e
+Parsed: [initial view] from: svgView(zoomAndPan(e  
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(88)(3e21
+Parsed: [initial view] from: svgView(zoomAndPan(88)(3e21
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(3e-003(4
+Parsed: [initial view] from: svgView(zoomAndPan(3e-003(4
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(682- 19-0)4642
+Parsed: [initial view] from: svgView(zoomAndPan(682- 	19-0)4642
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(6 7
+Parsed: [initial view] from: svgView(zoomAndPan(6 7
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(.9e1.e6+,e0-20e)9
+Parsed: [initial view] from: svgView(zoomAndPan(.9e1.e6+,e0-	20e	)9
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(e+
+Parsed: [initial view] from: svgView(zoomAndPan(e+
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(96,e20 1e2-5)
+Parsed: [initial view] from: svgView(zoomAndPan(96,e2	0 1e2-5)
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan( 8-7(3.
+Parsed: [initial view] from: svgView(zoomAndPan( 8-7(3.
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(
+Parsed: [initial view] from: svgView(zoomAndPan(
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan(8 78
+Parsed: [initial view] from: svgView(zoomAndPan(8 78
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPann(0, 0)
+Parsed: [initial view] from: svgView(zoomAndPann(0, 0)
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPa(0, 0)
+Parsed: [initial view] from: svgView(zoomAndPa(0, 0)
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan
+Parsed: [initial view] from: svgView(zoomAndPan
+
+Loaded: resources/viewspec-target.svg#svgView(zoomAndPan
+Parsed: [initial view] from: svgView(zoomAndPan
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget())
+Parsed: [initial view] from: svgView(viewTarget())
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(0))
+Parsed: svgView(viewTarget(0)) from: svgView(viewTarget(0))
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(0,0))
+Parsed: svgView(viewTarget(0,0)) from: svgView(viewTarget(0,0))
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(0,0,0))
+Parsed: svgView(viewTarget(0,0,0)) from: svgView(viewTarget(0,0,0))
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(0,0,0,0))
+Parsed: svgView(viewTarget(0,0,0,0)) from: svgView(viewTarget(0,0,0,0))
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(282e.172(0 .)
+Parsed: [initial view] from: svgView(viewTarget(2	8	2e.172	(0 .)
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(9
+Parsed: [initial view] from: svgView(viewTarget(	9
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(0 7950,- eee,
+Parsed: [initial view] from: svgView(viewTarget(0 795	0,- eee,
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget((7-
+Parsed: [initial view] from: svgView(viewTarget((7- 
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(+e(e8.)74- 9.(+
+Parsed: [initial view] from: svgView(viewTarget(+e(e8.)74- 9.(+ 
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(.0e635(-9,).8e
+Parsed: [initial view] from: svgView(viewTarget(.0e635(-9,).8e
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(e4e9ee
+Parsed: [initial view] from: svgView(viewTarget(e4e9ee 
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(49-,,4)30378.052
+Parsed: [initial view] from: svgView(viewTarget(49-,,4)30378.052
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(e7863e
+Parsed: [initial view] from: svgView(viewTarget(e7863e
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(0
+Parsed: [initial view] from: svgView(viewTarget(	0
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(e72(e,49.7.
+Parsed: [initial view] from: svgView(viewTarget(e72(	e	,49.7.
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(e55,
+Parsed: [initial view] from: svgView(viewTarget(e55, 
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(263,ee1)74-
+Parsed: [initial view] from: svgView(viewTarget(263,ee1)74-	
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(.64110,.+1.
+Parsed: [initial view] from: svgView(viewTarget(.64110,.+1.
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(.59e3...725-
+Parsed: [initial view] from: svgView(viewTarget(.59e3...725-
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(6-)2).180
+Parsed: [initial view] from: svgView(viewTarget(6	-)2).180
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(,e 579++.
+Parsed: [initial view] from: svgView(viewTarget(,e 579	++.
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(-+
+Parsed: [initial view] from: svgView(viewTarget(-+
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(74e-6-)297
+Parsed: [initial view] from: svgView(viewTarget(74e	-	6	-)29	7
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(221e..++77
+Parsed: [initial view] from: svgView(viewTarget(221e..+	+77
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget())4e1e).-e8378.
+Parsed: [initial view] from: svgView(viewTarget())4e	1e).-e8378.
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(4+01 e
+Parsed: [initial view] from: svgView(viewTarget(	4+01 	e
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(
+Parsed: [initial view] from: svgView(viewTarget(
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(-6++9++ 9.3)6438
+Parsed: [initial view] from: svgView(viewTarget(-6++9++ 9.3)6438
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(-,15e)(-+,- 6
+Parsed: [initial view] from: svgView(viewTarget(-,15e)(-+,- 6
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(3e+)085932
+Parsed: [initial view] from: svgView(viewTarget(3e+)085932
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(+
+Parsed: [initial view] from: svgView(viewTarget(+
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(-
+Parsed: [initial view] from: svgView(viewTarget(-
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(0944.6-
+Parsed: [initial view] from: svgView(viewTarget(	0944.6-
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(.
+Parsed: [initial view] from: svgView(viewTarget(.
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(5
+Parsed: [initial view] from: svgView(viewTarget(	5
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(3e(-2e3e
+Parsed: [initial view] from: svgView(viewTarget(3e(-2e3e
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(
+Parsed: [initial view] from: svgView(viewTarget(
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(65e 3e(.1 6916
+Parsed: [initial view] from: svgView(viewTarget(6	5e 3e	(.	1 69	16
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(1ee5 56,(8.5e,3
+Parsed: [initial view] from: svgView(viewTarget(1ee5 56,(8.5	e,3
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(e- e-
+Parsed: [initial view] from: svgView(viewTarget(e-		 e-
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget()e0e)
+Parsed: [initial view] from: svgView(viewTarget()e0e)
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(231293.16e
+Parsed: [initial view] from: svgView(viewTarget(231293.16e
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(()2(37-888580(9e+
+Parsed: [initial view] from: svgView(viewTarget(()2(37-888580(9e+
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(18e805
+Parsed: [initial view] from: svgView(viewTarget(18e805
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(0
+Parsed: [initial view] from: svgView(viewTarget(0
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(63) 693(
+Parsed: [initial view] from: svgView(viewTarget(63) 693(
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(80,2)+ 4ee,
+Parsed: [initial view] from: svgView(viewTarget(80,2)+ 4ee,
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(5e+59e2e5
+Parsed: [initial view] from: svgView(viewTarget(5e+59e2e5
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(53e,9
+Parsed: [initial view] from: svgView(viewTarget(5	3e,9
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(e7)((59
+Parsed: [initial view] from: svgView(viewTarget(e7	)((59	
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(963.+8-e73-e+)
+Parsed: [initial view] from: svgView(viewTarget(963.+8-e73-e		+)
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(71(1(+-3382.3
+Parsed: [initial view] from: svgView(viewTarget(71(1(+-3382.3
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget( 27(
+Parsed: [initial view] from: svgView(viewTarget( 27(
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget(
+Parsed: [initial view] from: svgView(viewTarget(
+
+Loaded: resources/viewspec-target.svg#svgView(viewTargett(0, 0)
+Parsed: [initial view] from: svgView(viewTargett(0, 0)
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarge(0, 0)
+Parsed: [initial view] from: svgView(viewTarge(0, 0)
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget
+Parsed: [initial view] from: svgView(viewTarget
+
+Loaded: resources/viewspec-target.svg#svgView(viewTarget
+Parsed: [initial view] from: svgView(viewTarget
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+ 
diff --git a/LayoutTests/svg/dom/viewspec-parser.html-disabled b/LayoutTests/svg/dom/viewspec-parser.html
similarity index 67%
rename from LayoutTests/svg/dom/viewspec-parser.html-disabled
rename to LayoutTests/svg/dom/viewspec-parser.html
index ace37bd..8382cf8 100644
--- a/LayoutTests/svg/dom/viewspec-parser.html-disabled
+++ b/LayoutTests/svg/dom/viewspec-parser.html
@@ -16,24 +16,29 @@
         zoomAndPan: 1,
         viewTarget: 1
     };
-    
+
     var preserveAspectRatioValues = [ "Min", "Max", "Mid" ];
-    
+
     var testsToRun = [
+      "svgView(viewBox(0,0,200,200)))",
+      "svgView(preserveAspectRatio(xMaxYMin slice))",
+      "svgView(preserveAspectRatio(xMaxYMin))",
+      "svgView(viewBox(1,2,3,4);preserveAspectRatio(xMaxYMin))",
+      "svgView(zoomAndPan(disable))",
+      "svgView(viewTarget(#myElementId))",
       "svgView",
       "svgView(",
       "svgView()",
       "svgView(" + String.fromCharCode(0),
-      "svgView(" + String.fromCharCode(0) + ")",
       "svgView(transform(scale(2));;)",
       "svgView(transform(scale(2));x", // used to hang
       "svgView(transform(scale(.5)))",
       "svgView(;transform(scale(.5)))",
       "svgView(;;transform(scale(.5)))",
       "svgView(transform(scale(.5));transform(scale(2));transform(scale(2)))",
+
       ];
-    
-    
+
     var characters = [
         "0",
         "1",
@@ -56,12 +61,12 @@
         "\t", // not a valid fragment char
         ","
     ];
-    
+
     function buildTestsToRun() {
       for (var attribute in attributes) {
 
           // Too few / too many arguments
-          for (var i = 0; i < 20; i++) { //>
+          for (var i = 0; i < 5; i++) { //>
               var attributeString = "svgView(" + attribute + "(";
               for (var j = 0; j < i; j++) { //>
                   attributeString += "0";
@@ -73,7 +78,7 @@
           }
 
           // Random assortments of valid characters
-          for (var i = 0; i < 100; i++) { //>
+          for (var i = 0; i < 50; i++) { //>
               var attributeString = "svgView(" + attribute + "(";
               var count = Math.scriptedRandomInt(20);
               for (var j = 0; j < count; j++) { //>
@@ -81,43 +86,51 @@
               }
               testsToRun.push(attributeString);
           }
-          
+
           // attribute names that are "off by one"
           var extraChar = attribute.charAt(attribute.length - 1);
           testsToRun.push("svgView(" + attribute + extraChar + "(0, 0)");
           testsToRun.push("svgView(" + attribute.substring(0, attribute.length - 1) + "(0, 0)");
-          
+
           // Empty-ish attributes
           testsToRun.push("svgView(" + attribute);
           testsToRun.push("svgView(" + attribute + String.fromCharCode(0));
-          testsToRun.push("svgView(" + attribute + "(" + String.fromCharCode(0) + ")");
       }
-      
     }
-    
+
+    function zoomAndPanToString(zoomAndPan)
+    {
+        if (zoomAndPan == SVGZoomAndPan.SVG_ZOOMANDPAN_MAGNIFY)
+            return "magnify";
+        if (zoomAndPan == SVGZoomAndPan.SVG_ZOOMANDPAN_DISABLE)
+            return "disable";
+        return "unknown";
+    }
+
     function viewSpecToString(viewSpec)
     {
         if (!viewSpec)
-          return viewSpec;
-        
+          return undefined;
+
         var attributes = [];
-        if (viewSpec.transform)
-          attributes.push("transform(" + viewSpec.transform + ")");
-        if (viewSpec.viewBox)
-          attributes.push("viewBox(" + viewSpec.viewBox + ")");
-        if (viewSpec.preserveAspectRatio)
-          attributes.push("preserveAspectRatio(" + viewSpec.preserveAspectRatio + ")");
-        if (viewSpec.zoomAndPan)
-          attributes.push("zoomAndPan(" + viewSpec.zoomAndPan + ")");
-        if (viewSpec.viewTarget)
-          attributes.push("viewTarget(" + viewSpac.viewTarget + ")");
-          
+        if (viewSpec.transformString)
+          attributes.push("transform(" + viewSpec.transformString + ")");
+        if (viewSpec.viewBoxString && viewSpec.viewBoxString != "0 0 0 0")
+          attributes.push("viewBox(" + viewSpec.viewBoxString + ")");
+        if (viewSpec.preserveAspectRatioString && viewSpec.preserveAspectRatioString != "xMidYMid meet")
+          attributes.push("preserveAspectRatio(" + viewSpec.preserveAspectRatioString + ")");
+        if (viewSpec.zoomAndPan && viewSpec.zoomAndPan != SVGZoomAndPan.SVG_ZOOMANDPAN_MAGNIFY)
+          attributes.push("zoomAndPan(" + zoomAndPanToString(viewSpec.zoomAndPan) + ")");
+        if (viewSpec.viewTargetString)
+          attributes.push("viewTarget(" + viewSpec.viewTargetString + ")");
+        if (!attributes.length)
+          return "[initial view]";
         return "svgView(" + attributes.join(";") + ")";
     }
-    
+
     var testNumber = 0;
     var testString = "[initial view]"
-    
+
     function makeURLRelative(url) {
       return url.slice(url.indexOf("resources"));
     }
@@ -131,10 +144,9 @@
       embedElement.setAttribute("id", "object");
       embedElement.setAttribute("width", "100");
       embedElement.setAttribute("height", "100");
-      embedElement.setAttribute("onload", "continueFuzzing(event)");
-      var newURL = "resources/viewspec-parser.svg#" + string;
+      embedElement.setAttribute("onload", "setTimeout('continueFuzzing(event)', 0)");
+      var newURL = "resources/viewspec-target.svg#" + string;
       embedElement.src = newURL;
-      debug("Starting: " + makeURLRelative(embedElement.src));
       document.body.appendChild(embedElement);
     }
 
@@ -142,34 +154,38 @@
     {
       testFragment(testString);
     }
-    
+
     function continueFuzzing(event)
     {
         var embedElement = document.getElementById("object");
         if (embedElement.contentDocument) {
-          debug("Loaded:   " + makeURLRelative(embedElement.contentDocument.URL));
-          debug("Parsed: " + viewSpecToString(embedElement.contentDocument.currentView) + " from: " + testString);      
+          debug("Loaded: " + makeURLRelative(embedElement.contentDocument.URL));
+          debug("Parsed: " + viewSpecToString(embedElement.contentDocument.documentElement.currentView) + " from: " + testString + "\n");
         } else
           debug("no svgdocument");
-        
+
         if (testNumber < testsToRun.length)
           testString = testsToRun[testNumber];
         else {
-          var scriptTag = document.createElement("script");
-          scriptTag.src = "../../fast/js/resources/js-test-post.js";
-          document.body.appendChild(scriptTag);
-          if (window.layoutTestController)
-            layoutTestController.notifyDone();
+          var script = document.createElement("script");
+
+          script.onload = function() {
+              if (window.layoutTestController)
+                  layoutTestController.notifyDone();
+          };
+
+          script.src = "../../fast/js/resources/js-test-post.js";
+          document.body.appendChild(script);
           return;
         }
         testNumber++;
-        
+
         // this lets us out of the onload handler so we don't overrun the stack
         window.setTimeout(startNextTest, 0);
     }
     if (window.layoutTestController)
       layoutTestController.waitUntilDone();
-    
+
     buildTestsToRun();
     testFragment("");
 </script>
diff --git a/Source/WebCore/CMakeLists.txt b/Source/WebCore/CMakeLists.txt
index 94ff7bc..1e07577 100644
--- a/Source/WebCore/CMakeLists.txt
+++ b/Source/WebCore/CMakeLists.txt
@@ -1976,8 +1976,8 @@
         svg/SVGURIReference.cpp
         svg/SVGUseElement.cpp
         svg/SVGViewElement.cpp
-        svg/SVGVKernElement.cpp
         svg/SVGViewSpec.cpp
+        svg/SVGVKernElement.cpp
         svg/SVGZoomAndPan.cpp
         svg/SVGZoomEvent.cpp
         svg/animation/SMILTime.cpp
@@ -2135,6 +2135,7 @@
         svg/SVGUnitTypes.idl
         svg/SVGUseElement.idl
         svg/SVGViewElement.idl
+        svg/SVGViewSpec.idl
         svg/SVGVKernElement.idl
         svg/SVGZoomAndPan.idl
         svg/SVGZoomEvent.idl
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index c051635..d57e753 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,180 @@
+2012-05-29  Nikolas Zimmermann  <nzimmermann@rim.com>
+
+        SVGViewSpec DOM bindings aka SVGSVGElement.currentView is unimplemented
+        https://bugs.webkit.org/show_bug.cgi?id=15495
+
+        Reviewed by Rob Buis.
+
+        Finish SVGViewSpec implementation and expose it to the Web. Numerous smaller bugs are fixed:
+        - SVGViewSpec and all of its contents should be read-only. Enforce that and test it.
+          Add a new enum to SVGPropertyInfo so that each SVGAnimatedProperty knows if its content is supposed to be read-write or read-only.
+        - Make the 'transform' attribute of SVGViewSpec exposable by switching to a SVGTransformListProperty - it can now be accessed from JS.
+        - Assure that following XXXString methods are in sync with the corresponding SVG DOM interfaces
+            readonly attribute DOMString viewBoxString;
+            readonly attribute DOMString preserveAspectRatioString;
+            readonly attribute DOMString transformString;
+            readonly attribute DOMString viewTargetString;
+        - Cleanup code in svg/properties that was intended to handle SVGViewSpec. Turns out lot of the complexity was unncessary, and can be removed.
+        - Move SVGFitToViewBox to the same pattern SVGZoomAndPan uses since two days, that avoids any virtual function calls for attribute parsing.
+        - Create/expose ObjectiveC/JS bindings for SVGViewSpec.
+        - Enable SVGViewSpec constructor.
+
+        Tests: svg/custom/linking-a-03-b-all-expected.svg
+               svg/dom/SVGViewSpec-defaults.html
+               svg/dom/SVGViewSpec.html
+               svg/dom/complex-svgView-specification.html
+               svg/dom/viewspec-parser.html
+
+        * CMakeLists.txt:
+        * DerivedSources.cpp:
+        * DerivedSources.make:
+        * DerivedSources.pri:
+        * GNUmakefile.list.am:
+        * Target.pri:
+        * WebCore.gyp/WebCore.gyp:
+        * WebCore.gypi:
+        * WebCore.order:
+        * WebCore.vcproj/WebCore.vcproj:
+        * WebCore.xcodeproj/project.pbxproj:
+        * bindings/js/JSSVGLengthCustom.cpp:
+        (WebCore::JSSVGLength::setValue):
+        (WebCore::JSSVGLength::convertToSpecifiedUnits):
+        * bindings/objc/DOMSVG.h:
+        * bindings/scripts/CodeGeneratorJS.pm:
+        (GenerateImplementation):
+        (NativeToJSValue):
+        * bindings/scripts/CodeGeneratorObjC.pm:
+        (GenerateImplementation):
+        * bindings/scripts/CodeGeneratorV8.pm:
+        (GenerateNormalAttrGetter):
+        (GenerateNormalAttrSetter):
+        (GenerateFunctionCallback):
+        * bindings/v8/custom/V8SVGLengthCustom.cpp:
+        (WebCore::V8SVGLength::valueAccessorSetter):
+        (WebCore::V8SVGLength::convertToSpecifiedUnitsCallback):
+        * page/DOMWindow.idl:
+        * rendering/svg/RenderSVGResourcePattern.cpp:
+        (WebCore::RenderSVGResourcePattern::buildTileImageTransform):
+        * svg/SVGFitToViewBox.cpp:
+        * svg/SVGFitToViewBox.h:
+        (SVGFitToViewBox):
+        (WebCore::SVGFitToViewBox::parseAttribute):
+        * svg/SVGMarkerElement.cpp:
+        (WebCore::SVGMarkerElement::orientTypePropertyInfo):
+        (WebCore::SVGMarkerElement::parseAttribute):
+        (WebCore::SVGMarkerElement::synchronizeOrientType):
+        (WebCore::SVGMarkerElement::lookupOrCreateOrientTypeWrapper):
+        * svg/SVGPathElement.cpp:
+        (WebCore::SVGPathElement::dPropertyInfo):
+        (WebCore::SVGPathElement::svgAttributeChanged):
+        (WebCore::SVGPathElement::pathByteStream):
+        (WebCore::SVGPathElement::lookupOrCreateDWrapper):
+        (WebCore::SVGPathElement::synchronizeD):
+        * svg/SVGPathSegWithContext.h:
+        (WebCore::SVGPathSegWithContext::animatedProperty):
+        * svg/SVGPatternElement.cpp:
+        (WebCore::SVGPatternElement::parseAttribute):
+        * svg/SVGPolyElement.cpp:
+        (WebCore::SVGPolyElement::pointsPropertyInfo):
+        (WebCore::SVGPolyElement::parseAttribute):
+        (WebCore::SVGPolyElement::synchronizePoints):
+        (WebCore::SVGPolyElement::lookupOrCreatePointsWrapper):
+        * svg/SVGRect.h:
+        * svg/SVGSVGElement.cpp:
+        (WebCore::SVGSVGElement::~SVGSVGElement):
+        (WebCore::SVGSVGElement::currentView):
+        (WebCore::SVGSVGElement::parseAttribute):
+        (WebCore::SVGSVGElement::currentViewBoxRect):
+        (WebCore::SVGSVGElement::viewBoxToViewTransform):
+        (WebCore::SVGSVGElement::setupInitialView):
+        (WebCore::SVGSVGElement::inheritViewAttributes):
+        * svg/SVGSVGElement.h:
+        (SVGSVGElement):
+        * svg/SVGSVGElement.idl:
+        * svg/SVGSymbolElement.cpp:
+        (WebCore::SVGSymbolElement::parseAttribute):
+        * svg/SVGTests.cpp:
+        (WebCore::SVGTests::requiredFeaturesPropertyInfo):
+        (WebCore::SVGTests::requiredExtensionsPropertyInfo):
+        (WebCore::SVGTests::systemLanguagePropertyInfo):
+        (WebCore::SVGTests::synchronizeRequiredFeatures):
+        (WebCore::SVGTests::synchronizeRequiredExtensions):
+        (WebCore::SVGTests::synchronizeSystemLanguage):
+        * svg/SVGTextContentElement.cpp:
+        (WebCore::SVGTextContentElement::textLengthPropertyInfo):
+        (WebCore::SVGTextContentElement::synchronizeTextLength):
+        (WebCore::SVGTextContentElement::lookupOrCreateTextLengthWrapper):
+        * svg/SVGViewElement.cpp:
+        (WebCore::SVGViewElement::parseAttribute):
+        * svg/SVGViewElement.h:
+        * svg/SVGViewSpec.cpp:
+        (WebCore::SVGViewSpec::viewBoxPropertyInfo):
+        (WebCore::SVGViewSpec::preserveAspectRatioPropertyInfo):
+        (WebCore::SVGViewSpec::transformPropertyInfo):
+        (WebCore::SVGViewSpec::SVGViewSpec):
+        (WebCore::SVGViewSpec::viewBoxIdentifier):
+        (WebCore::SVGViewSpec::preserveAspectRatioIdentifier):
+        (WebCore::SVGViewSpec::transformIdentifier):
+        (WebCore::SVGViewSpec::setZoomAndPan):
+        (WebCore::SVGViewSpec::setTransformString):
+        (WebCore::SVGViewSpec::transformString):
+        (WebCore::SVGViewSpec::viewBoxString):
+        (WebCore::SVGViewSpec::preserveAspectRatioString):
+        (WebCore::SVGViewSpec::viewTarget):
+        (WebCore::SVGViewSpec::transform):
+        (WebCore::SVGViewSpec::lookupOrCreateViewBoxWrapper):
+        (WebCore::SVGViewSpec::lookupOrCreatePreserveAspectRatioWrapper):
+        (WebCore::SVGViewSpec::lookupOrCreateTransformWrapper):
+        (WebCore::SVGViewSpec::reset):
+        (WebCore::SVGViewSpec::parseViewSpec):
+        * svg/SVGViewSpec.h:
+        (WebCore::SVGViewSpec::~SVGViewSpec):
+        (SVGViewSpec):
+        (WebCore::SVGViewSpec::create):
+        (WebCore::SVGViewSpec::setViewTargetString):
+        (WebCore::SVGViewSpec::setZoomAndPan):
+        (WebCore::SVGViewSpec::contextElement):
+        (WebCore::SVGViewSpec::resetContextElement):
+        (WebCore::SVGViewSpec::transformBaseValue):
+        (WebCore::SVGViewSpec::viewBoxAnimated):
+        (WebCore::SVGViewSpec::viewBox):
+        (WebCore::SVGViewSpec::viewBoxBaseValue):
+        (WebCore::SVGViewSpec::setViewBoxBaseValue):
+        (WebCore::SVGViewSpec::preserveAspectRatioAnimated):
+        (WebCore::SVGViewSpec::preserveAspectRatio):
+        (WebCore::SVGViewSpec::preserveAspectRatioBaseValue):
+        (WebCore::SVGViewSpec::setPreserveAspectRatioBaseValue):
+        * svg/SVGViewSpec.idl:
+        * svg/properties/SVGAnimatedProperty.h:
+        (WebCore::SVGAnimatedProperty::isReadOnly):
+        (WebCore::SVGAnimatedProperty::setIsReadOnly):
+        (SVGAnimatedProperty):
+        (WebCore::SVGAnimatedProperty::lookupOrCreateWrapper):
+        (WebCore::SVGAnimatedProperty::lookupWrapper):
+        (WebCore::SVGAnimatedProperty::SVGAnimatedProperty):
+        * svg/properties/SVGAnimatedPropertyMacros.h:
+        (WebCore::SVGSynchronizableAnimatedProperty::synchronize):
+        (SVGSynchronizableAnimatedProperty):
+        * svg/properties/SVGAnimatedPropertySynchronizer.h: Removed.
+        * svg/properties/SVGAttributeToPropertyMap.h:
+        * svg/properties/SVGListProperty.h:
+        * svg/properties/SVGListPropertyTearOff.h:
+        (SVGListPropertyTearOff):
+        (WebCore::SVGListPropertyTearOff::isReadOnly):
+        * svg/properties/SVGPathSegListPropertyTearOff.h:
+        (SVGPathSegListPropertyTearOff):
+        (WebCore::SVGPathSegListPropertyTearOff::isReadOnly):
+        * svg/properties/SVGProperty.h:
+        (SVGProperty):
+        * svg/properties/SVGPropertyInfo.h:
+        (WebCore::SVGPropertyInfo::SVGPropertyInfo):
+        (SVGPropertyInfo):
+        * svg/properties/SVGPropertyTearOff.h:
+        (WebCore::SVGPropertyTearOff::isReadOnly):
+        * svg/properties/SVGStaticListPropertyTearOff.h:
+        (SVGStaticListPropertyTearOff):
+        (WebCore::SVGStaticListPropertyTearOff::isReadOnly):
+
 2012-05-29  Kent Tamura  <tkent@chromium.org>
 
         REGRESSION (r90971): the cursor is painted “behind” the placeholder text
diff --git a/Source/WebCore/DerivedSources.cpp b/Source/WebCore/DerivedSources.cpp
index 11ffbd9..8e46992 100644
--- a/Source/WebCore/DerivedSources.cpp
+++ b/Source/WebCore/DerivedSources.cpp
@@ -437,8 +437,9 @@
 #include "JSSVGTSpanElement.cpp"
 #include "JSSVGUnitTypes.cpp"
 #include "JSSVGUseElement.cpp"
-#include "JSSVGViewElement.cpp"
 #include "JSSVGVKernElement.cpp"
+#include "JSSVGViewElement.cpp"
+#include "JSSVGViewSpec.cpp"
 #include "JSSVGZoomAndPan.cpp"
 #include "JSSVGZoomEvent.cpp"
 #include "JSText.cpp"
diff --git a/Source/WebCore/DerivedSources.make b/Source/WebCore/DerivedSources.make
index 9cd509a..c0b92859 100644
--- a/Source/WebCore/DerivedSources.make
+++ b/Source/WebCore/DerivedSources.make
@@ -575,6 +575,7 @@
     $(WebCore)/svg/SVGUseElement.idl \
     $(WebCore)/svg/SVGVKernElement.idl \
     $(WebCore)/svg/SVGViewElement.idl \
+    $(WebCore)/svg/SVGViewSpec.idl \
     $(WebCore)/svg/SVGZoomAndPan.idl \
     $(WebCore)/svg/SVGZoomEvent.idl \
     $(WebCore)/testing/Internals.idl \
diff --git a/Source/WebCore/DerivedSources.pri b/Source/WebCore/DerivedSources.pri
index 685da7e..2386799 100644
--- a/Source/WebCore/DerivedSources.pri
+++ b/Source/WebCore/DerivedSources.pri
@@ -606,6 +606,7 @@
     $$PWD/svg/SVGUseElement.idl \
     $$PWD/svg/SVGViewElement.idl \
     $$PWD/svg/SVGVKernElement.idl \
+    $$PWD/svg/SVGViewSpec.idl \
     $$PWD/svg/SVGZoomAndPan.idl \
     $$PWD/svg/SVGZoomEvent.idl
 }
diff --git a/Source/WebCore/GNUmakefile.list.am b/Source/WebCore/GNUmakefile.list.am
index f88e656..2aff39e 100644
--- a/Source/WebCore/GNUmakefile.list.am
+++ b/Source/WebCore/GNUmakefile.list.am
@@ -4202,7 +4202,6 @@
 	Source/WebCore/svg/properties/SVGAnimatedProperty.h \
 	Source/WebCore/svg/properties/SVGAnimatedPropertyDescription.h \
 	Source/WebCore/svg/properties/SVGAnimatedPropertyMacros.h \
-	Source/WebCore/svg/properties/SVGAnimatedPropertySynchronizer.h \
 	Source/WebCore/svg/properties/SVGAnimatedPropertyTearOff.h \
 	Source/WebCore/svg/properties/SVGAnimatedStaticPropertyTearOff.h \
 	Source/WebCore/svg/properties/SVGAnimatedTransformListPropertyTearOff.h \
@@ -5392,6 +5391,7 @@
 	DerivedSources/WebCore/JSSVGUseElement.h \
 	DerivedSources/WebCore/JSSVGViewElement.cpp \
 	DerivedSources/WebCore/JSSVGViewElement.h \
+	DerivedSources/WebCore/JSSVGViewSpec.cpp \
 	DerivedSources/WebCore/JSSVGViewSpec.h \
 	DerivedSources/WebCore/JSSVGVKernElement.cpp \
 	DerivedSources/WebCore/JSSVGVKernElement.h \
@@ -5541,6 +5541,7 @@
 	$(WebCore)/svg/SVGUseElement.idl \
 	$(WebCore)/svg/SVGVKernElement.idl \
 	$(WebCore)/svg/SVGViewElement.idl \
+	$(WebCore)/svg/SVGViewSpec.idl \
 	$(WebCore)/svg/SVGZoomAndPan.idl \
 	$(WebCore)/svg/SVGZoomEvent.idl
 endif # END ENABLE_SVG
diff --git a/Source/WebCore/Target.pri b/Source/WebCore/Target.pri
index d391afe..e7674fa 100644
--- a/Source/WebCore/Target.pri
+++ b/Source/WebCore/Target.pri
@@ -2634,7 +2634,6 @@
     svg/properties/SVGAnimatedProperty.h \
     svg/properties/SVGAnimatedPropertyDescription.h \
     svg/properties/SVGAnimatedPropertyMacros.h \
-    svg/properties/SVGAnimatedPropertySynchronizer.h \
     svg/properties/SVGAnimatedPropertyTearOff.h \
     svg/properties/SVGAnimatedStaticPropertyTearOff.h \
     svg/properties/SVGAnimatedTransformListPropertyTearOff.h \
diff --git a/Source/WebCore/WebCore.gyp/WebCore.gyp b/Source/WebCore/WebCore.gyp/WebCore.gyp
index aafd471..8255884 100644
--- a/Source/WebCore/WebCore.gyp/WebCore.gyp
+++ b/Source/WebCore/WebCore.gyp/WebCore.gyp
@@ -173,7 +173,6 @@
       '../svg/SVGStylable.idl',
       '../svg/SVGTests.idl',
       '../svg/SVGTransformable.idl',
-      '../svg/SVGViewSpec.idl',
 
       # FIXME: I don't know why these are excluded, either.
       # Someone (me?) should figure it out and add appropriate comments.
diff --git a/Source/WebCore/WebCore.gypi b/Source/WebCore/WebCore.gypi
index 88e5c2d..cec1393 100644
--- a/Source/WebCore/WebCore.gypi
+++ b/Source/WebCore/WebCore.gypi
@@ -739,7 +739,6 @@
             'svg/properties/SVGAnimatedProperty.h',
             'svg/properties/SVGAnimatedPropertyDescription.h',
             'svg/properties/SVGAnimatedPropertyMacros.h',
-            'svg/properties/SVGAnimatedPropertySynchronizer.h',
             'svg/properties/SVGAnimatedPropertyTearOff.h',
             'svg/properties/SVGAnimatedStaticPropertyTearOff.h',
             'svg/properties/SVGAnimatedTransformListPropertyTearOff.h',
@@ -7168,6 +7167,8 @@
             '<(PRODUCT_DIR)/DerivedSources/WebCore/DOMSVGVKernElement.h',
             '<(PRODUCT_DIR)/DerivedSources/WebCore/DOMSVGVKernElement.mm',
             '<(PRODUCT_DIR)/DerivedSources/WebCore/DOMSVGVKernElementInternal.h',
+            '<(PRODUCT_DIR)/DerivedSources/WebCore/DOMSVGViewSpec.dep',
+            '<(PRODUCT_DIR)/DerivedSources/WebCore/DOMSVGViewSpec.mm',
             '<(PRODUCT_DIR)/DerivedSources/WebCore/DOMSVGViewElement.dep',
             '<(PRODUCT_DIR)/DerivedSources/WebCore/DOMSVGViewElement.mm',
             '<(PRODUCT_DIR)/DerivedSources/WebCore/DOMSVGZoomEvent.mm',
@@ -8132,6 +8133,9 @@
             '<(PRODUCT_DIR)/DerivedSources/WebCore/JSSVGViewElement.cpp',
             '<(PRODUCT_DIR)/DerivedSources/WebCore/JSSVGViewElement.dep',
             '<(PRODUCT_DIR)/DerivedSources/WebCore/JSSVGViewElement.h',
+            '<(PRODUCT_DIR)/DerivedSources/WebCore/JSSVGViewSpec.cpp',
+            '<(PRODUCT_DIR)/DerivedSources/WebCore/JSSVGViewSpec.dep',
+            '<(PRODUCT_DIR)/DerivedSources/WebCore/JSSVGViewSpec.h',
             '<(PRODUCT_DIR)/DerivedSources/WebCore/JSSVGZoomAndPan.cpp',
             '<(PRODUCT_DIR)/DerivedSources/WebCore/JSSVGZoomAndPan.h',
             '<(PRODUCT_DIR)/DerivedSources/WebCore/JSSVGZoomEvent.cpp',
diff --git a/Source/WebCore/WebCore.order b/Source/WebCore/WebCore.order
index 1af438b..28b7b7a 100644
--- a/Source/WebCore/WebCore.order
+++ b/Source/WebCore/WebCore.order
@@ -29345,7 +29345,6 @@
 __ZN7WebCore8SVGTests21synchronizePropertiesEPNS_10SVGElementERKNS_13QualifiedNameE
 __ZN7WebCore8SVGTests27synchronizeRequiredFeaturesEPNS_10SVGElementE
 __ZNK7WebCore13SVGStringList13valueAsStringEv
-__ZN7WebCore31SVGAnimatedPropertySynchronizerILb1EE11synchronizeEPNS_10SVGElementERKNS_13QualifiedNameERKN3WTF12AtomicStringE
 __ZN7WebCore8SVGTests29synchronizeRequiredExtensionsEPNS_10SVGElementE
 __ZN7WebCore8SVGTests25synchronizeSystemLanguageEPNS_10SVGElementE
 __ZN7WebCore37jsSVGNumberListPrototypeFunctionClearEPN3JSC9ExecStateE
diff --git a/Source/WebCore/WebCore.vcproj/WebCore.vcproj b/Source/WebCore/WebCore.vcproj/WebCore.vcproj
index 844b8d3..40fe09a 100755
--- a/Source/WebCore/WebCore.vcproj/WebCore.vcproj
+++ b/Source/WebCore/WebCore.vcproj/WebCore.vcproj
@@ -21834,6 +21834,62 @@
 				>
 			</File>
 			<File
+				RelativePath="$(ConfigurationBuildDir)\obj\$(ProjectName)\DerivedSources\JSSVGViewSpec.cpp"
+				>
+				<FileConfiguration
+					Name="Debug|Win32"
+					ExcludedFromBuild="true"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32"
+					ExcludedFromBuild="true"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Debug_Cairo_CFLite|Win32"
+					ExcludedFromBuild="true"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release_Cairo_CFLite|Win32"
+					ExcludedFromBuild="true"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Debug_All|Win32"
+					ExcludedFromBuild="true"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Production|Win32"
+					ExcludedFromBuild="true"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+					/>
+				</FileConfiguration>
+			</File>
+			<File
+				RelativePath="$(ConfigurationBuildDir)\obj\$(ProjectName)\DerivedSources\JSSVGViewSpec.h"
+				>
+			</File>
+			<File
 				RelativePath="$(ConfigurationBuildDir)\obj\$(ProjectName)\DerivedSources\JSSVGVKernElement.cpp"
 				>
 				<FileConfiguration
@@ -72182,10 +72238,6 @@
 					>
 				</File>
 				<File
-					RelativePath="..\svg\properties\SVGAnimatedPropertySynchronizer.h"
-					>
-				</File>
-				<File
 					RelativePath="..\svg\properties\SVGAnimatedPropertyTearOff.h"
 					>
 				</File>
diff --git a/Source/WebCore/WebCore.xcodeproj/project.pbxproj b/Source/WebCore/WebCore.xcodeproj/project.pbxproj
index 741bc73..2514f11 100644
--- a/Source/WebCore/WebCore.xcodeproj/project.pbxproj
+++ b/Source/WebCore/WebCore.xcodeproj/project.pbxproj
@@ -137,7 +137,6 @@
 		081668D4125603BF006F25DE /* SVGTextChunkBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 081668D2125603BF006F25DE /* SVGTextChunkBuilder.h */; };
 		081668DA125603D5006F25DE /* SVGTextLayoutEngine.h in Headers */ = {isa = PBXBuildFile; fileRef = 081668D8125603D5006F25DE /* SVGTextLayoutEngine.h */; };
 		081AA8DA1111237E002AB06E /* SVGElementRareData.h in Headers */ = {isa = PBXBuildFile; fileRef = 081AA8D91111237E002AB06E /* SVGElementRareData.h */; };
-		081CDFBF126ECFE800D215CA /* SVGAnimatedPropertySynchronizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 081CDFBE126ECFE800D215CA /* SVGAnimatedPropertySynchronizer.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		081DD49C13BA1A6000DC7627 /* SVGPropertyInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 081DD49B13BA1A6000DC7627 /* SVGPropertyInfo.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		081EBF3A0FD34F4100DA7559 /* SVGFilterBuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 081EBF380FD34F4100DA7559 /* SVGFilterBuilder.cpp */; };
 		081EBF3B0FD34F4100DA7559 /* SVGFilterBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 081EBF390FD34F4100DA7559 /* SVGFilterBuilder.h */; };
@@ -1804,10 +1803,15 @@
 		6EE8A77210F803F3005A4A24 /* JSWebGLContextAttributes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6EE8A77010F803F3005A4A24 /* JSWebGLContextAttributes.cpp */; };
 		6EE8A77310F803F3005A4A24 /* JSWebGLContextAttributes.h in Headers */ = {isa = PBXBuildFile; fileRef = 6EE8A77110F803F3005A4A24 /* JSWebGLContextAttributes.h */; };
 		7117445914BC34EC00EE5FC8 /* SVGTextMetricsBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 7117445714BC34E200EE5FC8 /* SVGTextMetricsBuilder.h */; };
+		7118FED415685CC60030B79A /* JSSVGViewSpec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7118FED215685CC60030B79A /* JSSVGViewSpec.cpp */; };
+		7118FED515685CC60030B79A /* JSSVGViewSpec.h in Headers */ = {isa = PBXBuildFile; fileRef = 7118FED315685CC60030B79A /* JSSVGViewSpec.h */; };
 		7134496D146941B300720312 /* SVGLengthContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7134496B146941B300720312 /* SVGLengthContext.cpp */; };
 		7134496E146941B300720312 /* SVGLengthContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 7134496C146941B300720312 /* SVGLengthContext.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		71537A01146BD9D7008BD615 /* SVGPathData.h in Headers */ = {isa = PBXBuildFile; fileRef = 715379FF146BD9D6008BD615 /* SVGPathData.h */; };
 		7157F062150B6564006EAABD /* SVGAnimatedTransformList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7157F061150B6564006EAABD /* SVGAnimatedTransformList.cpp */; };
+		717A1981156A63BE00F9FE8C /* DOMSVGViewSpecInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 710867D51568644B00AA779B /* DOMSVGViewSpecInternal.h */; };
+		71904DE8156A631C001E1BA5 /* DOMSVGViewSpec.h in Copy Generated Headers */ = {isa = PBXBuildFile; fileRef = 71FE57EE156A620600ABEBD3 /* DOMSVGViewSpec.h */; };
+		71904DEA156A633A001E1BA5 /* DOMSVGViewSpecInternal.h in Copy Generated Headers */ = {isa = PBXBuildFile; fileRef = 718512331568649800C40967 /* DOMSVGViewSpecInternal.h */; };
 		71A57DF1154BE25C0009D120 /* SVGPathUtilities.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 71A57DEF154BE25C0009D120 /* SVGPathUtilities.cpp */; };
 		71A57DF2154BE25C0009D120 /* SVGPathUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 71A57DF0154BE25C0009D120 /* SVGPathUtilities.h */; };
 		71CC7A20152A0BFE009EEAF9 /* SVGAnimatedEnumeration.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 71CC7A1F152A0BFE009EEAF9 /* SVGAnimatedEnumeration.cpp */; };
@@ -1815,6 +1819,8 @@
 		71DCB7021568197600862271 /* JSSVGZoomAndPan.h in Headers */ = {isa = PBXBuildFile; fileRef = 71DCB7001568197600862271 /* JSSVGZoomAndPan.h */; };
 		71E623D1151F72A60036E2F4 /* SVGAnimatedIntegerOptionalInteger.h in Headers */ = {isa = PBXBuildFile; fileRef = 71E623CF151F72A60036E2F4 /* SVGAnimatedIntegerOptionalInteger.h */; };
 		71FB967B1383D64600AC8A4C /* SVGAnimatedEnumerationPropertyTearOff.h in Headers */ = {isa = PBXBuildFile; fileRef = 71FB967A1383D64600AC8A4C /* SVGAnimatedEnumerationPropertyTearOff.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		71FE57F0156A620600ABEBD3 /* DOMSVGViewSpec.h in Headers */ = {isa = PBXBuildFile; fileRef = 71FE57EE156A620600ABEBD3 /* DOMSVGViewSpec.h */; };
+		71FE57F1156A620600ABEBD3 /* DOMSVGViewSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 71FE57EF156A620600ABEBD3 /* DOMSVGViewSpec.mm */; };
 		72626E020EF022FE00A07E20 /* FontFastPath.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 72626E010EF022FE00A07E20 /* FontFastPath.cpp */; };
 		750D029311D0E7F300BD1B27 /* RenderInputSpeech.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 750D029111D0E7F300BD1B27 /* RenderInputSpeech.cpp */; };
 		750D029411D0E7F300BD1B27 /* RenderInputSpeech.h in Headers */ = {isa = PBXBuildFile; fileRef = 750D029211D0E7F300BD1B27 /* RenderInputSpeech.h */; };
@@ -6875,7 +6881,9 @@
 				A80F3B7D0CCDCE24002DD990 /* DOMSVGUseElementInternal.h in Copy Generated Headers */,
 				A8F46A910CB20A9D003A9670 /* DOMSVGViewElement.h in Copy Generated Headers */,
 				A80F3B5F0CCDCE24002DD990 /* DOMSVGViewElementInternal.h in Copy Generated Headers */,
+				71904DE8156A631C001E1BA5 /* DOMSVGViewSpec.h in Copy Generated Headers */,
 				A8F46AFD0CB20A9D003A9670 /* DOMSVGZoomAndPan.h in Copy Generated Headers */,
+				71904DEA156A633A001E1BA5 /* DOMSVGViewSpecInternal.h in Copy Generated Headers */,
 				A8F46A930CB20A9D003A9670 /* DOMSVGZoomEvent.h in Copy Generated Headers */,
 				A80F3BB10CCDCE24002DD990 /* DOMSVGZoomEventInternal.h in Copy Generated Headers */,
 				1C11CCC20AA6093700DADB20 /* DOMText.h in Copy Generated Headers */,
@@ -7015,7 +7023,6 @@
 		081668D7125603D5006F25DE /* SVGTextLayoutEngine.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGTextLayoutEngine.cpp; sourceTree = "<group>"; };
 		081668D8125603D5006F25DE /* SVGTextLayoutEngine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGTextLayoutEngine.h; sourceTree = "<group>"; };
 		081AA8D91111237E002AB06E /* SVGElementRareData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGElementRareData.h; sourceTree = "<group>"; };
-		081CDFBE126ECFE800D215CA /* SVGAnimatedPropertySynchronizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGAnimatedPropertySynchronizer.h; sourceTree = "<group>"; };
 		081DD49B13BA1A6000DC7627 /* SVGPropertyInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGPropertyInfo.h; sourceTree = "<group>"; };
 		081EBF380FD34F4100DA7559 /* SVGFilterBuilder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGFilterBuilder.cpp; sourceTree = "<group>"; };
 		081EBF390FD34F4100DA7559 /* SVGFilterBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGFilterBuilder.h; sourceTree = "<group>"; };
@@ -8852,13 +8859,17 @@
 		6ED878C3147493F4004C3597 /* RenderTableCaption.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderTableCaption.h; sourceTree = "<group>"; };
 		6EE8A77010F803F3005A4A24 /* JSWebGLContextAttributes.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSWebGLContextAttributes.cpp; sourceTree = "<group>"; };
 		6EE8A77110F803F3005A4A24 /* JSWebGLContextAttributes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSWebGLContextAttributes.h; sourceTree = "<group>"; };
+		710867D51568644B00AA779B /* DOMSVGViewSpecInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DOMSVGViewSpecInternal.h; sourceTree = "<group>"; };
 		7117445614BC34E200EE5FC8 /* SVGTextMetricsBuilder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGTextMetricsBuilder.cpp; sourceTree = "<group>"; };
 		7117445714BC34E200EE5FC8 /* SVGTextMetricsBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGTextMetricsBuilder.h; sourceTree = "<group>"; };
+		7118FED215685CC60030B79A /* JSSVGViewSpec.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSSVGViewSpec.cpp; sourceTree = "<group>"; };
+		7118FED315685CC60030B79A /* JSSVGViewSpec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSSVGViewSpec.h; sourceTree = "<group>"; };
 		7134496B146941B300720312 /* SVGLengthContext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGLengthContext.cpp; sourceTree = "<group>"; };
 		7134496C146941B300720312 /* SVGLengthContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGLengthContext.h; sourceTree = "<group>"; };
 		715379FE146BD9D6008BD615 /* SVGPathData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGPathData.cpp; sourceTree = "<group>"; };
 		715379FF146BD9D6008BD615 /* SVGPathData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGPathData.h; sourceTree = "<group>"; };
 		7157F061150B6564006EAABD /* SVGAnimatedTransformList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGAnimatedTransformList.cpp; sourceTree = "<group>"; };
+		718512331568649800C40967 /* DOMSVGViewSpecInternal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DOMSVGViewSpecInternal.h; sourceTree = "<group>"; };
 		71A57DEF154BE25C0009D120 /* SVGPathUtilities.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGPathUtilities.cpp; sourceTree = "<group>"; };
 		71A57DF0154BE25C0009D120 /* SVGPathUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGPathUtilities.h; sourceTree = "<group>"; };
 		71CC7A1F152A0BFE009EEAF9 /* SVGAnimatedEnumeration.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGAnimatedEnumeration.cpp; sourceTree = "<group>"; };
@@ -8867,6 +8878,8 @@
 		71E623CE151F72A60036E2F4 /* SVGAnimatedIntegerOptionalInteger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGAnimatedIntegerOptionalInteger.cpp; sourceTree = "<group>"; };
 		71E623CF151F72A60036E2F4 /* SVGAnimatedIntegerOptionalInteger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGAnimatedIntegerOptionalInteger.h; sourceTree = "<group>"; };
 		71FB967A1383D64600AC8A4C /* SVGAnimatedEnumerationPropertyTearOff.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGAnimatedEnumerationPropertyTearOff.h; sourceTree = "<group>"; };
+		71FE57EE156A620600ABEBD3 /* DOMSVGViewSpec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DOMSVGViewSpec.h; sourceTree = "<group>"; };
+		71FE57EF156A620600ABEBD3 /* DOMSVGViewSpec.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DOMSVGViewSpec.mm; sourceTree = "<group>"; };
 		72626E010EF022FE00A07E20 /* FontFastPath.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FontFastPath.cpp; sourceTree = "<group>"; };
 		750D029111D0E7F300BD1B27 /* RenderInputSpeech.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderInputSpeech.cpp; sourceTree = "<group>"; };
 		750D029211D0E7F300BD1B27 /* RenderInputSpeech.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderInputSpeech.h; sourceTree = "<group>"; };
@@ -13788,7 +13801,6 @@
 				088A0DFC126EF1DB00978F7A /* SVGAnimatedProperty.h */,
 				088A0DFD126EF1DB00978F7A /* SVGAnimatedPropertyDescription.h */,
 				088A0DFE126EF1DB00978F7A /* SVGAnimatedPropertyMacros.h */,
-				081CDFBE126ECFE800D215CA /* SVGAnimatedPropertySynchronizer.h */,
 				088A0DFF126EF1DB00978F7A /* SVGAnimatedPropertyTearOff.h */,
 				08525E621278C00100A84778 /* SVGAnimatedStaticPropertyTearOff.h */,
 				085A15921289A8DD002710E3 /* SVGAnimatedTransformListPropertyTearOff.h */,
@@ -16195,6 +16207,9 @@
 				859D62970AD888EF00012995 /* DOMSVGViewElement.h */,
 				859D62980AD888EF00012995 /* DOMSVGViewElement.mm */,
 				A8E543C90CA9D1C10097D09B /* DOMSVGViewElementInternal.h */,
+				71FE57EE156A620600ABEBD3 /* DOMSVGViewSpec.h */,
+				71FE57EF156A620600ABEBD3 /* DOMSVGViewSpec.mm */,
+				718512331568649800C40967 /* DOMSVGViewSpecInternal.h */,
 				84852281119016A7006EDC7F /* DOMSVGVKernElement.h */,
 				84852282119016A7006EDC7F /* DOMSVGVKernElement.mm */,
 				859D62990AD888EF00012995 /* DOMSVGZoomAndPan.h */,
@@ -16652,6 +16667,7 @@
 				859D62D80AD8892700012995 /* DOMSVGUnitTypesInternal.h */,
 				859D62D90AD8892700012995 /* DOMSVGUseElementInternal.h */,
 				859D62DA0AD8892700012995 /* DOMSVGViewElementInternal.h */,
+				710867D51568644B00AA779B /* DOMSVGViewSpecInternal.h */,
 				859D62DB0AD8892700012995 /* DOMSVGZoomEventInternal.h */,
 				4429AB070CB84F81007647C5 /* DOMTextEventInternal.h */,
 				85E7118A0AC5D5350053270F /* DOMTextInternal.h */,
@@ -18381,6 +18397,8 @@
 				B2FA3D2D0AB75A6F000E5AC4 /* JSSVGUseElement.h */,
 				B2FA3D2E0AB75A6F000E5AC4 /* JSSVGViewElement.cpp */,
 				B2FA3D2F0AB75A6F000E5AC4 /* JSSVGViewElement.h */,
+				7118FED215685CC60030B79A /* JSSVGViewSpec.cpp */,
+				7118FED315685CC60030B79A /* JSSVGViewSpec.h */,
 				848522791190162C006EDC7F /* JSSVGVKernElement.cpp */,
 				8485227A1190162C006EDC7F /* JSSVGVKernElement.h */,
 				71DCB6FF1568197600862271 /* JSSVGZoomAndPan.cpp */,
@@ -24465,7 +24483,6 @@
 				088A0E05126EF1DB00978F7A /* SVGAnimatedProperty.h in Headers */,
 				088A0E06126EF1DB00978F7A /* SVGAnimatedPropertyDescription.h in Headers */,
 				088A0E07126EF1DB00978F7A /* SVGAnimatedPropertyMacros.h in Headers */,
-				081CDFBF126ECFE800D215CA /* SVGAnimatedPropertySynchronizer.h in Headers */,
 				088A0E08126EF1DB00978F7A /* SVGAnimatedPropertyTearOff.h in Headers */,
 				08C859C01274575400A5728D /* SVGAnimatedRect.h in Headers */,
 				08525E631278C00100A84778 /* SVGAnimatedStaticPropertyTearOff.h in Headers */,
@@ -24957,6 +24974,9 @@
 				E4946EAF156E64DD00D3297F /* StyleRuleImport.h in Headers */,
 				71DCB7021568197600862271 /* JSSVGZoomAndPan.h in Headers */,
 				0F3F0E5A157030C3006DA57F /* RenderGeometryMap.h in Headers */,
+				7118FED515685CC60030B79A /* JSSVGViewSpec.h in Headers */,
+				71FE57F0156A620600ABEBD3 /* DOMSVGViewSpec.h in Headers */,
+				717A1981156A63BE00F9FE8C /* DOMSVGViewSpecInternal.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -27989,6 +28009,8 @@
 				E4946EAE156E64DD00D3297F /* StyleRuleImport.cpp in Sources */,
 				71DCB7011568197600862271 /* JSSVGZoomAndPan.cpp in Sources */,
 				0F3F0E59157030C3006DA57F /* RenderGeometryMap.cpp in Sources */,
+				7118FED415685CC60030B79A /* JSSVGViewSpec.cpp in Sources */,
+				71FE57F1156A620600ABEBD3 /* DOMSVGViewSpec.mm in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
diff --git a/Source/WebCore/bindings/js/JSSVGLengthCustom.cpp b/Source/WebCore/bindings/js/JSSVGLengthCustom.cpp
index 02ea9d6..dca4983 100644
--- a/Source/WebCore/bindings/js/JSSVGLengthCustom.cpp
+++ b/Source/WebCore/bindings/js/JSSVGLengthCustom.cpp
@@ -48,7 +48,7 @@
 
 void JSSVGLength::setValue(ExecState* exec, JSValue value)
 {
-    if (impl()->role() == AnimValRole) {
+    if (impl()->isReadOnly()) {
         setDOMException(exec, NO_MODIFICATION_ALLOWED_ERR);
         return;
     }
@@ -73,7 +73,7 @@
 
 JSValue JSSVGLength::convertToSpecifiedUnits(ExecState* exec)
 {
-    if (impl()->role() == AnimValRole) {
+    if (impl()->isReadOnly()) {
         setDOMException(exec, NO_MODIFICATION_ALLOWED_ERR);
         return jsUndefined();
     }
diff --git a/Source/WebCore/bindings/objc/DOMSVG.h b/Source/WebCore/bindings/objc/DOMSVG.h
index 86239da..4611ef7 100644
--- a/Source/WebCore/bindings/objc/DOMSVG.h
+++ b/Source/WebCore/bindings/objc/DOMSVG.h
@@ -169,5 +169,6 @@
 #import <WebCore/DOMSVGUnitTypes.h>
 #import <WebCore/DOMSVGUseElement.h>
 #import <WebCore/DOMSVGViewElement.h>
+#import <WebCore/DOMSVGViewSpec.h>
 #import <WebCore/DOMSVGZoomAndPan.h>
 #import <WebCore/DOMSVGZoomEvent.h>
diff --git a/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm b/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm
index ff8fb06..1434cb6 100644
--- a/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm
+++ b/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm
@@ -1956,7 +1956,7 @@
                             my $nativeValue = JSValueToNative($attribute->signature, "value");
                             if ($svgPropertyOrListPropertyType) {
                                 if ($svgPropertyType) {
-                                    push(@implContent, "    if (impl->role() == AnimValRole) {\n");
+                                    push(@implContent, "    if (impl->isReadOnly()) {\n");
                                     push(@implContent, "        setDOMException(exec, NO_MODIFICATION_ALLOWED_ERR);\n");
                                     push(@implContent, "        return;\n");
                                     push(@implContent, "    }\n");
@@ -2129,7 +2129,7 @@
                 } else {
                     push(@implContent, "    $implType* impl = static_cast<$implType*>(castedThis->impl());\n");
                     if ($svgPropertyType) {
-                        push(@implContent, "    if (impl->role() == AnimValRole) {\n");
+                        push(@implContent, "    if (impl->isReadOnly()) {\n");
                         push(@implContent, "        setDOMException(exec, NO_MODIFICATION_ALLOWED_ERR);\n");
                         push(@implContent, "        return JSValue::encode(jsUndefined());\n");
                         push(@implContent, "    }\n");
@@ -3099,7 +3099,7 @@
         return "toJSNewlyCreated(exec, $globalObject, WTF::getPtr($value))";
     }
 
-    if ($codeGenerator->IsSVGAnimatedType($implClassName)) {
+    if ($codeGenerator->IsSVGAnimatedType($implClassName) or $implClassName eq "SVGViewSpec") {
         # Convert from abstract SVGProperty to real type, so the right toJS() method can be invoked.
         $value = "static_cast<" . GetNativeType($type) . ">($value)";
     } elsif ($codeGenerator->IsSVGTypeNeedingTearOff($type) and not $implClassName =~ /List$/) {
diff --git a/Source/WebCore/bindings/scripts/CodeGeneratorObjC.pm b/Source/WebCore/bindings/scripts/CodeGeneratorObjC.pm
index 0a96489..3087cbb 100644
--- a/Source/WebCore/bindings/scripts/CodeGeneratorObjC.pm
+++ b/Source/WebCore/bindings/scripts/CodeGeneratorObjC.pm
@@ -1328,7 +1328,7 @@
                         $getterContentTail = "))";
                     }
                 }
-            } elsif ($codeGenerator->IsSVGAnimatedType($implClassName) and $codeGenerator->IsSVGTypeNeedingTearOff($idlType)) {
+            } elsif (($codeGenerator->IsSVGAnimatedType($implClassName) or $implClassName eq "SVGViewSpec") and $codeGenerator->IsSVGTypeNeedingTearOff($idlType)) {
                 my $idlTypeWithNamespace = GetSVGTypeWithNamespace($idlType);
                 $getterContentHead = "kit(static_cast<$idlTypeWithNamespace*>($getterContentHead)";
                 $getterContentTail .= ")";
@@ -1436,7 +1436,7 @@
                 if ($svgPropertyType) {
                     $implIncludes{"ExceptionCode.h"} = 1;
                     $getterContentHead = "$getterExpressionPrefix";
-                    push(@implContent, "    if (IMPL->role() == WebCore::AnimValRole) {\n");
+                    push(@implContent, "    if (IMPL->isReadOnly()) {\n");
                     push(@implContent, "        WebCore::raiseOnDOMError(WebCore::NO_MODIFICATION_ALLOWED_ERR);\n");
                     push(@implContent, "        return;\n");
                     push(@implContent, "    }\n");
@@ -1636,7 +1636,7 @@
                 $content = "${implementedBy}::" . $codeGenerator->WK_lcfirst($functionName) . "(" . join(", ", @parameterNames) . ")";
             } elsif ($svgPropertyType) {
                 $implIncludes{"ExceptionCode.h"} = 1;
-                push(@functionContent, "    if (IMPL->role() == WebCore::AnimValRole) {\n");
+                push(@functionContent, "    if (IMPL->isReadOnly()) {\n");
                 push(@functionContent, "        WebCore::raiseOnDOMError(WebCore::NO_MODIFICATION_ALLOWED_ERR);\n");
                 if ($returnType eq "void") {
                     push(@functionContent, "        return;\n");
diff --git a/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm b/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm
index bfcc98e..4ac8855 100644
--- a/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm
+++ b/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm
@@ -945,7 +945,7 @@
         return;
     }
 
-    if ($codeGenerator->IsSVGAnimatedType($implClassName) and $codeGenerator->IsSVGTypeNeedingTearOff($attrType)) {
+    if (($codeGenerator->IsSVGAnimatedType($implClassName) or $implClassName eq "SVGViewSpec") and $codeGenerator->IsSVGTypeNeedingTearOff($attrType)) {
         AddToImplIncludes("V8$attrType.h");
         my $svgNativeType = $codeGenerator->GetSVGTypeNeedingTearOff($attrType);
         # Convert from abstract SVGProperty to real type, so the right toJS() method can be invoked.
@@ -1061,7 +1061,7 @@
         } else {
             AddToImplIncludes("ExceptionCode.h");
             push(@implContentDecls, "    $svgNativeType* wrapper = V8${implClassName}::toNative(info.Holder());\n");
-            push(@implContentDecls, "    if (wrapper->role() == AnimValRole) {\n");
+            push(@implContentDecls, "    if (wrapper->isReadOnly()) {\n");
             push(@implContentDecls, "        V8Proxy::setDOMException(NO_MODIFICATION_ALLOWED_ERR, info.GetIsolate());\n");
             push(@implContentDecls, "        return;\n");
             push(@implContentDecls, "    }\n");
@@ -1395,7 +1395,7 @@
         } else {
             AddToImplIncludes("ExceptionCode.h");
             push(@implContentDecls, "    $nativeClassName wrapper = V8${implClassName}::toNative(args.Holder());\n");
-            push(@implContentDecls, "    if (wrapper->role() == AnimValRole)\n");
+            push(@implContentDecls, "    if (wrapper->isReadOnly())\n");
             push(@implContentDecls, "        return V8Proxy::setDOMException(NO_MODIFICATION_ALLOWED_ERR, args.GetIsolate());\n");
             my $svgWrappedNativeType = $codeGenerator->GetSVGWrappedTypeNeedingTearOff($implClassName);
             push(@implContentDecls, "    $svgWrappedNativeType& impInstance = wrapper->propertyReference();\n");
diff --git a/Source/WebCore/bindings/v8/custom/V8SVGLengthCustom.cpp b/Source/WebCore/bindings/v8/custom/V8SVGLengthCustom.cpp
index fc7ade7..292bc0d 100644
--- a/Source/WebCore/bindings/v8/custom/V8SVGLengthCustom.cpp
+++ b/Source/WebCore/bindings/v8/custom/V8SVGLengthCustom.cpp
@@ -58,7 +58,7 @@
 {
     INC_STATS("DOM.SVGLength.value._set");
     SVGPropertyTearOff<SVGLength>* wrapper = V8SVGLength::toNative(info.Holder());
-    if (wrapper->role() == AnimValRole) {
+    if (wrapper->isReadOnly()) {
         V8Proxy::setDOMException(NO_MODIFICATION_ALLOWED_ERR, info.GetIsolate());
         return;
     }
@@ -82,7 +82,7 @@
 {
     INC_STATS("DOM.SVGLength.convertToSpecifiedUnits");
     SVGPropertyTearOff<SVGLength>* wrapper = V8SVGLength::toNative(args.Holder());
-    if (wrapper->role() == AnimValRole)
+    if (wrapper->isReadOnly())
         return V8Proxy::setDOMException(NO_MODIFICATION_ALLOWED_ERR, args.GetIsolate());
 
     if (args.Length() < 1)
diff --git a/Source/WebCore/page/DOMWindow.idl b/Source/WebCore/page/DOMWindow.idl
index 3661c1b..56243fd 100644
--- a/Source/WebCore/page/DOMWindow.idl
+++ b/Source/WebCore/page/DOMWindow.idl
@@ -708,7 +708,7 @@
         attribute SVGUnitTypesConstructor SVGUnitTypes;
         attribute SVGUseElementConstructor SVGUseElement;
         attribute SVGViewElementConstructor SVGViewElement;
-//      attribute SVGViewSpecConstructor SVGViewSpec;
+        attribute SVGViewSpecConstructor SVGViewSpec;
         attribute SVGZoomAndPanConstructor SVGZoomAndPan;
 
         attribute SVGAnimateColorElementConstructor SVGAnimateColorElement;
diff --git a/Source/WebCore/rendering/svg/RenderSVGResourcePattern.cpp b/Source/WebCore/rendering/svg/RenderSVGResourcePattern.cpp
index 4dc501b..15d6476 100644
--- a/Source/WebCore/rendering/svg/RenderSVGResourcePattern.cpp
+++ b/Source/WebCore/rendering/svg/RenderSVGResourcePattern.cpp
@@ -27,6 +27,7 @@
 #include "GraphicsContext.h"
 #include "PatternAttributes.h"
 #include "RenderSVGRoot.h"
+#include "SVGFitToViewBox.h"
 #include "SVGRenderSupport.h"
 #include "SVGRenderingContext.h"
 
@@ -215,7 +216,7 @@
     if (patternBoundaries.width() <= 0 || patternBoundaries.height() <= 0)
         return false;
 
-    AffineTransform viewBoxCTM = patternElement->viewBoxToViewTransform(attributes.viewBox(), attributes.preserveAspectRatio(), patternBoundaries.width(), patternBoundaries.height());
+    AffineTransform viewBoxCTM = SVGFitToViewBox::viewBoxToViewTransform(attributes.viewBox(), attributes.preserveAspectRatio(), patternBoundaries.width(), patternBoundaries.height());
 
     // Apply viewBox/objectBoundingBox transformations.
     if (!viewBoxCTM.isIdentity())
diff --git a/Source/WebCore/svg/SVGFitToViewBox.cpp b/Source/WebCore/svg/SVGFitToViewBox.cpp
index e4df4ff..f1f6cf4 100644
--- a/Source/WebCore/svg/SVGFitToViewBox.cpp
+++ b/Source/WebCore/svg/SVGFitToViewBox.cpp
@@ -88,26 +88,6 @@
     return preserveAspectRatio.getCTM(viewBoxRect.x(), viewBoxRect.y(), viewBoxRect.width(), viewBoxRect.height(), viewWidth, viewHeight);
 }
 
-bool SVGFitToViewBox::parseAttribute(Document* document, const Attribute& attribute)
-{
-    if (attribute.name() == SVGNames::viewBoxAttr) {
-        FloatRect viewBox;
-        if (!attribute.isNull())
-            parseViewBox(document, attribute.value(), viewBox);
-        setViewBoxBaseValue(viewBox);
-        return true;
-    }
-
-    if (attribute.name() == SVGNames::preserveAspectRatioAttr) {
-        SVGPreserveAspectRatio preserveAspectRatio;
-        preserveAspectRatio.parse(attribute.value());
-        setPreserveAspectRatioBaseValue(preserveAspectRatio);
-        return true;
-    }
-
-    return false;
-}
-
 bool SVGFitToViewBox::isKnownAttribute(const QualifiedName& attrName)
 {
     return attrName == SVGNames::viewBoxAttr || attrName == SVGNames::preserveAspectRatioAttr;
diff --git a/Source/WebCore/svg/SVGFitToViewBox.h b/Source/WebCore/svg/SVGFitToViewBox.h
index d771445..5145212 100644
--- a/Source/WebCore/svg/SVGFitToViewBox.h
+++ b/Source/WebCore/svg/SVGFitToViewBox.h
@@ -22,33 +22,52 @@
 #define SVGFitToViewBox_h
 
 #if ENABLE(SVG)
+#include "Attribute.h"
+#include "FloatRect.h"
 #include "QualifiedName.h"
+#include "SVGNames.h"
+#include "SVGPreserveAspectRatio.h"
 #include <wtf/HashSet.h>
 
 namespace WebCore {
 
 class AffineTransform;
-class Attribute;
 class Document;
-class FloatRect;
-class SVGPreserveAspectRatio;
 
 class SVGFitToViewBox {
 public:
-    virtual ~SVGFitToViewBox() { }
-
-    bool parseViewBox(Document*, const UChar*& start, const UChar* end, FloatRect& viewBox, bool validate = true);
     static AffineTransform viewBoxToViewTransform(const FloatRect& viewBoxRect, const SVGPreserveAspectRatio&, float viewWidth, float viewHeight);
 
-    bool parseAttribute(Document*, const Attribute&);
-    bool isKnownAttribute(const QualifiedName&);
-    void addSupportedAttributes(HashSet<QualifiedName>&);
+    static bool isKnownAttribute(const QualifiedName&);
+    static void addSupportedAttributes(HashSet<QualifiedName>&);
 
-    virtual void setViewBoxBaseValue(const FloatRect&) = 0;
-    virtual void setPreserveAspectRatioBaseValue(const SVGPreserveAspectRatio&) = 0;
+    template<class SVGElementTarget>
+    static bool parseAttribute(SVGElementTarget* target, const Attribute& attribute)
+    {
+        ASSERT(target);
+        ASSERT(target->document());
+        if (attribute.name() == SVGNames::viewBoxAttr) {
+            FloatRect viewBox;
+            if (!attribute.isNull())
+                parseViewBox(target->document(), attribute.value(), viewBox);
+            target->setViewBoxBaseValue(viewBox);
+            return true;
+        }
+
+        if (attribute.name() == SVGNames::preserveAspectRatioAttr) {
+            SVGPreserveAspectRatio preserveAspectRatio;
+            preserveAspectRatio.parse(attribute.value());
+            target->setPreserveAspectRatioBaseValue(preserveAspectRatio);
+            return true;
+        }
+
+        return false;
+    }
+
+    static bool parseViewBox(Document*, const UChar*& start, const UChar* end, FloatRect& viewBox, bool validate = true);
 
 private:
-    bool parseViewBox(Document*, const String&, FloatRect&);
+    static bool parseViewBox(Document*, const String&, FloatRect&);
 };
 
 } // namespace WebCore
diff --git a/Source/WebCore/svg/SVGMarkerElement.cpp b/Source/WebCore/svg/SVGMarkerElement.cpp
index 9f9f197..2a6ebb1 100644
--- a/Source/WebCore/svg/SVGMarkerElement.cpp
+++ b/Source/WebCore/svg/SVGMarkerElement.cpp
@@ -39,6 +39,7 @@
     static const SVGPropertyInfo* s_propertyInfo = 0;
     if (!s_propertyInfo) {
         s_propertyInfo = new SVGPropertyInfo(AnimatedEnumeration,
+                                             PropertyIsReadWrite,
                                              SVGNames::orientAttr,
                                              orientTypeIdentifier(),
                                              &SVGMarkerElement::synchronizeOrientType,
@@ -153,7 +154,7 @@
             setOrientAngleBaseValue(angle);
     } else if (SVGLangSpace::parseAttribute(attribute)
              || SVGExternalResourcesRequired::parseAttribute(attribute)
-             || SVGFitToViewBox::parseAttribute(document(), attribute)) {
+             || SVGFitToViewBox::parseAttribute(this, attribute)) {
     } else
         ASSERT_NOT_REACHED();
 
@@ -239,14 +240,14 @@
         return;
 
     DEFINE_STATIC_LOCAL(AtomicString, autoString, ("auto"));
-    SVGAnimatedPropertySynchronizer<true>::synchronize(ownerType, orientTypePropertyInfo()->attributeName, autoString);
+    ownerType->m_orientType.synchronize(ownerType, orientTypePropertyInfo()->attributeName, autoString);
 }
 
 PassRefPtr<SVGAnimatedProperty> SVGMarkerElement::lookupOrCreateOrientTypeWrapper(void* contextElement)
 {
     ASSERT(contextElement);
     SVGMarkerElement* ownerType = static_cast<SVGMarkerElement*>(contextElement);
-    return SVGAnimatedProperty::lookupOrCreateWrapper<SVGMarkerElement, SVGAnimatedEnumerationPropertyTearOff<SVGMarkerOrientType>, SVGMarkerOrientType, true>
+    return SVGAnimatedProperty::lookupOrCreateWrapper<SVGMarkerElement, SVGAnimatedEnumerationPropertyTearOff<SVGMarkerOrientType>, SVGMarkerOrientType>
            (ownerType, orientTypePropertyInfo(), ownerType->m_orientType.value);
 }
   
diff --git a/Source/WebCore/svg/SVGPathElement.cpp b/Source/WebCore/svg/SVGPathElement.cpp
index f4c01f1..986f5fe 100644
--- a/Source/WebCore/svg/SVGPathElement.cpp
+++ b/Source/WebCore/svg/SVGPathElement.cpp
@@ -52,6 +52,7 @@
     static const SVGPropertyInfo* s_propertyInfo = 0;
     if (!s_propertyInfo) {
         s_propertyInfo = new SVGPropertyInfo(AnimatedPath,
+                                             PropertyIsReadWrite,
                                              SVGNames::dAttr,
                                              SVGNames::dAttr.localName(),
                                              &SVGPathElement::synchronizeD,
@@ -261,7 +262,7 @@
     RenderSVGPath* renderer = static_cast<RenderSVGPath*>(this->renderer());
 
     if (attrName == SVGNames::dAttr) {
-        if (m_pathSegList.shouldSynchronize && !SVGAnimatedProperty::lookupWrapper<SVGPathElement, SVGAnimatedPathSegListPropertyTearOff, true>(this, dPropertyInfo())->isAnimating()) {
+        if (m_pathSegList.shouldSynchronize && !SVGAnimatedProperty::lookupWrapper<SVGPathElement, SVGAnimatedPathSegListPropertyTearOff>(this, dPropertyInfo())->isAnimating()) {
             SVGPathSegList newList(PathSegUnalteredRole);
             buildSVGPathSegListFromByteStream(m_pathByteStream.get(), this, newList, UnalteredParsing);
             m_pathSegList.value = newList;
@@ -277,7 +278,7 @@
 
 SVGPathByteStream* SVGPathElement::pathByteStream() const
 {
-    SVGAnimatedProperty* property = SVGAnimatedProperty::lookupWrapper<SVGPathElement, SVGAnimatedPathSegListPropertyTearOff, true>(this, dPropertyInfo());
+    SVGAnimatedProperty* property = SVGAnimatedProperty::lookupWrapper<SVGPathElement, SVGAnimatedPathSegListPropertyTearOff>(this, dPropertyInfo());
     if (!property || !property->isAnimating())
         return m_pathByteStream.get();
     return static_cast<SVGAnimatedPathSegListPropertyTearOff*>(property)->animatedPathByteStream();
@@ -288,13 +289,13 @@
     ASSERT(contextElement);
     SVGPathElement* ownerType = static_cast<SVGPathElement*>(contextElement);
 
-    if (SVGAnimatedProperty* property = SVGAnimatedProperty::lookupWrapper<SVGPathElement, SVGAnimatedPathSegListPropertyTearOff, true>(ownerType, dPropertyInfo()))
+    if (SVGAnimatedProperty* property = SVGAnimatedProperty::lookupWrapper<SVGPathElement, SVGAnimatedPathSegListPropertyTearOff>(ownerType, dPropertyInfo()))
         return property;
 
     // Build initial SVGPathSegList.
     buildSVGPathSegListFromByteStream(ownerType->m_pathByteStream.get(), ownerType, ownerType->m_pathSegList.value, UnalteredParsing);
 
-    return SVGAnimatedProperty::lookupOrCreateWrapper<SVGPathElement, SVGAnimatedPathSegListPropertyTearOff, SVGPathSegList, true>
+    return SVGAnimatedProperty::lookupOrCreateWrapper<SVGPathElement, SVGAnimatedPathSegListPropertyTearOff, SVGPathSegList>
            (ownerType, dPropertyInfo(), ownerType->m_pathSegList.value);
 }
 
@@ -304,7 +305,7 @@
     SVGPathElement* ownerType = static_cast<SVGPathElement*>(contextElement);
     if (!ownerType->m_pathSegList.shouldSynchronize)
         return;
-    SVGAnimatedPropertySynchronizer<true>::synchronize(ownerType, dPropertyInfo()->attributeName, ownerType->m_pathSegList.value.valueAsString());
+    ownerType->m_pathSegList.synchronize(ownerType, dPropertyInfo()->attributeName, ownerType->m_pathSegList.value.valueAsString());
 }
 
 SVGPathSegListPropertyTearOff* SVGPathElement::pathSegList()
diff --git a/Source/WebCore/svg/SVGPathSegWithContext.h b/Source/WebCore/svg/SVGPathSegWithContext.h
index fccfd6a..7010672 100644
--- a/Source/WebCore/svg/SVGPathSegWithContext.h
+++ b/Source/WebCore/svg/SVGPathSegWithContext.h
@@ -39,7 +39,7 @@
         case PathSegUndefinedRole:
             return 0;
         case PathSegUnalteredRole:
-            return SVGAnimatedProperty::lookupWrapper<SVGPathElement, SVGAnimatedPathSegListPropertyTearOff, true>(m_element.get(), SVGPathElement::dPropertyInfo());
+            return SVGAnimatedProperty::lookupWrapper<SVGPathElement, SVGAnimatedPathSegListPropertyTearOff>(m_element.get(), SVGPathElement::dPropertyInfo());
         case PathSegNormalizedRole:
             // FIXME: https://bugs.webkit.org/show_bug.cgi?id=15412 - Implement normalized path segment lists!
             return 0;
diff --git a/Source/WebCore/svg/SVGPatternElement.cpp b/Source/WebCore/svg/SVGPatternElement.cpp
index b04f3b3..c39e288 100644
--- a/Source/WebCore/svg/SVGPatternElement.cpp
+++ b/Source/WebCore/svg/SVGPatternElement.cpp
@@ -34,6 +34,7 @@
 #include "RenderSVGContainer.h"
 #include "RenderSVGResourcePattern.h"
 #include "SVGElementInstance.h"
+#include "SVGFitToViewBox.h"
 #include "SVGNames.h"
 #include "SVGRenderSupport.h"
 #include "SVGSVGElement.h"
@@ -143,7 +144,7 @@
              || SVGTests::parseAttribute(attribute)
              || SVGLangSpace::parseAttribute(attribute)
              || SVGExternalResourcesRequired::parseAttribute(attribute)
-             || SVGFitToViewBox::parseAttribute(document(), attribute)) {
+             || SVGFitToViewBox::parseAttribute(this, attribute)) {
     } else
         ASSERT_NOT_REACHED();
 
diff --git a/Source/WebCore/svg/SVGPolyElement.cpp b/Source/WebCore/svg/SVGPolyElement.cpp
index 57deccb..3ae5fe5 100644
--- a/Source/WebCore/svg/SVGPolyElement.cpp
+++ b/Source/WebCore/svg/SVGPolyElement.cpp
@@ -41,6 +41,7 @@
     static const SVGPropertyInfo* s_propertyInfo = 0;
     if (!s_propertyInfo) {
         s_propertyInfo = new SVGPropertyInfo(AnimatedPoints,
+                                             PropertyIsReadWrite,
                                              SVGNames::pointsAttr,
                                              SVGNames::pointsAttr.localName(),
                                              &SVGPolyElement::synchronizePoints,
@@ -90,7 +91,7 @@
         if (!pointsListFromSVGData(newList, value))
             document()->accessSVGExtensions()->reportError("Problem parsing points=\"" + value + "\"");
 
-        if (SVGAnimatedProperty* wrapper = SVGAnimatedProperty::lookupWrapper<SVGPolyElement, SVGAnimatedPointList, true>(this, pointsPropertyInfo()))
+        if (SVGAnimatedProperty* wrapper = SVGAnimatedProperty::lookupWrapper<SVGPolyElement, SVGAnimatedPointList>(this, pointsPropertyInfo()))
             static_cast<SVGAnimatedPointList*>(wrapper)->detachListWrappers(newList.size());
 
         m_points.value = newList;
@@ -143,14 +144,14 @@
     SVGPolyElement* ownerType = static_cast<SVGPolyElement*>(contextElement);
     if (!ownerType->m_points.shouldSynchronize)
         return;
-    SVGAnimatedPropertySynchronizer<true>::synchronize(ownerType, pointsPropertyInfo()->attributeName, ownerType->m_points.value.valueAsString());
+    ownerType->m_points.synchronize(ownerType, pointsPropertyInfo()->attributeName, ownerType->m_points.value.valueAsString());
 }
 
 PassRefPtr<SVGAnimatedProperty> SVGPolyElement::lookupOrCreatePointsWrapper(void* contextElement)
 {
     ASSERT(contextElement);
     SVGPolyElement* ownerType = static_cast<SVGPolyElement*>(contextElement);
-    return SVGAnimatedProperty::lookupOrCreateWrapper<SVGPolyElement, SVGAnimatedPointList, SVGPointList, true>
+    return SVGAnimatedProperty::lookupOrCreateWrapper<SVGPolyElement, SVGAnimatedPointList, SVGPointList>
            (ownerType, pointsPropertyInfo(), ownerType->m_points.value);
 }
 
diff --git a/Source/WebCore/svg/SVGRect.h b/Source/WebCore/svg/SVGRect.h
index 379a5bf..27db378 100644
--- a/Source/WebCore/svg/SVGRect.h
+++ b/Source/WebCore/svg/SVGRect.h
@@ -40,7 +40,6 @@
         builder.append(String::number(type.width()));
         builder.append(' ');
         builder.append(String::number(type.height()));
-        builder.append(' ');
         return builder.toString();
     }
 };
diff --git a/Source/WebCore/svg/SVGSVGElement.cpp b/Source/WebCore/svg/SVGSVGElement.cpp
index 0fbda9d..4b438f5 100644
--- a/Source/WebCore/svg/SVGSVGElement.cpp
+++ b/Source/WebCore/svg/SVGSVGElement.cpp
@@ -46,13 +46,13 @@
 #include "SMILTimeContainer.h"
 #include "SVGAngle.h"
 #include "SVGElementInstance.h"
+#include "SVGFitToViewBox.h"
 #include "SVGNames.h"
 #include "SVGPreserveAspectRatio.h"
 #include "SVGTransform.h"
 #include "SVGTransformList.h"
 #include "SVGViewElement.h"
 #include "SVGViewSpec.h"
-#include "SVGZoomAndPan.h"
 #include "SVGZoomEvent.h"
 #include "ScriptEventListener.h"
 #include "StaticNodeList.h"
@@ -103,6 +103,8 @@
 
 SVGSVGElement::~SVGSVGElement()
 {
+    if (m_viewSpec)
+        m_viewSpec->resetContextElement();
     document()->unregisterForPageCacheSuspensionCallbacks(this);
     // There are cases where removedFromDocument() is not called.
     // see ContainerNode::removeAllChildren, called by its destructor.
@@ -170,10 +172,10 @@
     return pixelUnitToMillimeterY();
 }
 
-SVGViewSpec* SVGSVGElement::currentView() const
+SVGViewSpec* SVGSVGElement::currentView()
 {
     if (!m_viewSpec)
-        m_viewSpec = adoptPtr(new SVGViewSpec(const_cast<SVGSVGElement*>(this)));
+        m_viewSpec = SVGViewSpec::create(this);
     return m_viewSpec.get();
 }
 
@@ -269,7 +271,7 @@
     else if (SVGTests::parseAttribute(attribute)
                || SVGLangSpace::parseAttribute(attribute)
                || SVGExternalResourcesRequired::parseAttribute(attribute)
-               || SVGFitToViewBox::parseAttribute(document(), attribute)
+               || SVGFitToViewBox::parseAttribute(this, attribute)
                || SVGZoomAndPan::parseAttribute(this, attribute)) {
     } else
         SVGStyledLocatableElement::parseAttribute(attribute);
@@ -525,11 +527,8 @@
 
 FloatRect SVGSVGElement::currentViewBoxRect() const
 {
-    if (useCurrentView()) {
-        if (SVGViewSpec* view = currentView()) // what if we should use it but it is not set?
-            return view->viewBox();
-        return FloatRect();
-    }
+    if (m_useCurrentView)
+        return m_viewSpec ? m_viewSpec->viewBox() : FloatRect();
 
     FloatRect useViewBox = viewBox();
     if (!useViewBox.isEmpty())
@@ -646,71 +645,95 @@
 
 AffineTransform SVGSVGElement::viewBoxToViewTransform(float viewWidth, float viewHeight) const
 {
-    AffineTransform ctm = SVGFitToViewBox::viewBoxToViewTransform(currentViewBoxRect(), preserveAspectRatio(), viewWidth, viewHeight);
-    if (useCurrentView() && currentView()) {
-        AffineTransform transform;
-        if (currentView()->transformBaseValue().concatenate(transform))
-            ctm *= transform;
-    }
+    if (!m_useCurrentView || !m_viewSpec)
+        return SVGFitToViewBox::viewBoxToViewTransform(currentViewBoxRect(), preserveAspectRatio(), viewWidth, viewHeight);
+
+    AffineTransform ctm = SVGFitToViewBox::viewBoxToViewTransform(currentViewBoxRect(), m_viewSpec->preserveAspectRatio(), viewWidth, viewHeight);
+    const SVGTransformList& transformList = m_viewSpec->transformBaseValue();
+    if (transformList.isEmpty())
+        return ctm;
+
+    AffineTransform transform;
+    if (transformList.concatenate(transform))
+        ctm *= transform;
 
     return ctm;
 }
 
 void SVGSVGElement::setupInitialView(const String& fragmentIdentifier, Element* anchorNode)
 {
+    RenderObject* renderer = this->renderer();
+    SVGViewSpec* view = m_viewSpec.get();
+    if (view)
+        view->reset();
+
     bool hadUseCurrentView = m_useCurrentView;
+    m_useCurrentView = false;
+
     if (fragmentIdentifier.startsWith("xpointer(")) {
         // FIXME: XPointer references are ignored (https://bugs.webkit.org/show_bug.cgi?id=17491)
-        setUseCurrentView(false);
-    } else if (fragmentIdentifier.startsWith("svgView(")) {
-        if (currentView()->parseViewSpec(fragmentIdentifier))
-            setUseCurrentView(true);
-    } else if (anchorNode && anchorNode->hasTagName(SVGNames::viewTag)) {
+        if (renderer && hadUseCurrentView)
+            RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer);
+        return;
+    }
+
+    if (fragmentIdentifier.startsWith("svgView(")) {
+        if (!view)
+            view = currentView(); // Create the SVGViewSpec.
+
+        if (view->parseViewSpec(fragmentIdentifier))
+            m_useCurrentView = true;
+        else
+            view->reset();
+
+        if (renderer && (hadUseCurrentView || m_useCurrentView))
+            RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer);
+        return;
+    }
+
+    // Spec: If the SVG fragment identifier addresses a ‘view’ element within an SVG document (e.g., MyDrawing.svg#MyView
+    // or MyDrawing.svg#xpointer(id('MyView'))) then the closest ancestor ‘svg’ element is displayed in the viewport.
+    // Any view specification attributes included on the given ‘view’ element override the corresponding view specification
+    // attributes on the closest ancestor ‘svg’ element.
+    if (anchorNode && anchorNode->hasTagName(SVGNames::viewTag)) {
         if (SVGViewElement* viewElement = anchorNode->hasTagName(SVGNames::viewTag) ? static_cast<SVGViewElement*>(anchorNode) : 0) {
             SVGElement* element = SVGLocatable::nearestViewportElement(viewElement);
             if (element->hasTagName(SVGNames::svgTag)) {
                 SVGSVGElement* svg = static_cast<SVGSVGElement*>(element);
                 svg->inheritViewAttributes(viewElement);
-                setUseCurrentView(true);
+
+                if (RenderObject* renderer = svg->renderer())
+                    RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer);
             }
         }
+        return;
     }
 
-    if (!hadUseCurrentView) {
-        if (!m_useCurrentView)
-            return;
-    } else if (!m_useCurrentView)
-        currentView()->setTransformString(emptyString());
-
-    // Force a layout, otherwise RenderSVGRoots localToBorderBoxTransform won't be rebuild.
-    if (RenderObject* object = renderer())
-        RenderSVGResource::markForLayoutAndParentResourceInvalidation(object);
-
     // FIXME: We need to decide which <svg> to focus on, and zoom to it.
     // FIXME: We need to actually "highlight" the viewTarget(s).
 }
 
 void SVGSVGElement::inheritViewAttributes(SVGViewElement* viewElement)
 {
-    if (viewElement->hasAttribute(SVGNames::viewBoxAttr))
-        currentView()->setViewBoxBaseValue(viewElement->viewBox());
-    else
-        currentView()->setViewBoxBaseValue(viewBox());
+    SVGViewSpec* view = currentView();
+    m_useCurrentView = true;
 
-    SVGPreserveAspectRatio aspectRatio;
-    if (viewElement->hasAttribute(SVGNames::preserveAspectRatioAttr))
-        aspectRatio = viewElement->preserveAspectRatioBaseValue();
+    if (viewElement->hasAttribute(SVGNames::viewBoxAttr))
+        view->setViewBoxBaseValue(viewElement->viewBox());
     else
-        aspectRatio = preserveAspectRatioBaseValue();
-    currentView()->setPreserveAspectRatioBaseValue(aspectRatio);
+        view->setViewBoxBaseValue(viewBox());
+
+    if (viewElement->hasAttribute(SVGNames::preserveAspectRatioAttr))
+        view->setPreserveAspectRatioBaseValue(viewElement->preserveAspectRatioBaseValue());
+    else
+        view->setPreserveAspectRatioBaseValue(preserveAspectRatioBaseValue());
 
     if (viewElement->hasAttribute(SVGNames::zoomAndPanAttr))
-        currentView()->setZoomAndPanBaseValue(viewElement->zoomAndPan());
-    
-    if (RenderObject* object = renderer())
-        RenderSVGResource::markForLayoutAndParentResourceInvalidation(object);
+        view->setZoomAndPanBaseValue(viewElement->zoomAndPan());
+    else
+        view->setZoomAndPanBaseValue(zoomAndPan());
 }
-    
+
 void SVGSVGElement::documentWillSuspendForPageCache()
 {
     pauseAnimations();
diff --git a/Source/WebCore/svg/SVGSVGElement.h b/Source/WebCore/svg/SVGSVGElement.h
index 99b6be2..cee47a4 100644
--- a/Source/WebCore/svg/SVGSVGElement.h
+++ b/Source/WebCore/svg/SVGSVGElement.h
@@ -72,9 +72,7 @@
     float screenPixelToMillimeterY() const;
 
     bool useCurrentView() const { return m_useCurrentView; }
-    void setUseCurrentView(bool currentView) { m_useCurrentView = currentView; }
-
-    SVGViewSpec* currentView() const;
+    SVGViewSpec* currentView();
 
     enum ConsiderCSSMode {
         RespectCSSProperties,
@@ -191,7 +189,7 @@
     SVGZoomAndPanType m_zoomAndPan;
     RefPtr<SMILTimeContainer> m_timeContainer;
     FloatPoint m_translation;
-    mutable OwnPtr<SVGViewSpec> m_viewSpec;
+    RefPtr<SVGViewSpec> m_viewSpec;
 };
 
 } // namespace WebCore
diff --git a/Source/WebCore/svg/SVGSVGElement.idl b/Source/WebCore/svg/SVGSVGElement.idl
index 8fcd3d8..54f4c61 100644
--- a/Source/WebCore/svg/SVGSVGElement.idl
+++ b/Source/WebCore/svg/SVGSVGElement.idl
@@ -48,9 +48,8 @@
         readonly attribute float pixelUnitToMillimeterY;
         readonly attribute float screenPixelToMillimeterX;
         readonly attribute float screenPixelToMillimeterY;
-                 attribute boolean useCurrentView
-                     /*setter raises(DOMException)*/;
-        // TODO    readonly attribute SVGViewSpec currentView;
+        readonly attribute boolean useCurrentView;
+        readonly attribute SVGViewSpec currentView;
                  attribute float currentScale
                      /*setter raises(DOMException)*/;
         readonly attribute SVGPoint currentTranslate;
diff --git a/Source/WebCore/svg/SVGSymbolElement.cpp b/Source/WebCore/svg/SVGSymbolElement.cpp
index 9c2f686..d3a1f3a 100644
--- a/Source/WebCore/svg/SVGSymbolElement.cpp
+++ b/Source/WebCore/svg/SVGSymbolElement.cpp
@@ -76,7 +76,7 @@
         return;
     if (SVGExternalResourcesRequired::parseAttribute(attribute))
         return;
-    if (SVGFitToViewBox::parseAttribute(document(), attribute))
+    if (SVGFitToViewBox::parseAttribute(this, attribute))
         return;
 
     ASSERT_NOT_REACHED();
diff --git a/Source/WebCore/svg/SVGTests.cpp b/Source/WebCore/svg/SVGTests.cpp
index 9918938..63235a4 100644
--- a/Source/WebCore/svg/SVGTests.cpp
+++ b/Source/WebCore/svg/SVGTests.cpp
@@ -38,6 +38,7 @@
     static const SVGPropertyInfo* s_propertyInfo = 0;
     if (!s_propertyInfo) {
         s_propertyInfo = new SVGPropertyInfo(AnimatedUnknown,
+                                             PropertyIsReadWrite,
                                              SVGNames::requiredFeaturesAttr,
                                              SVGNames::requiredFeaturesAttr.localName(),
                                              &SVGElement::synchronizeRequiredFeatures,
@@ -52,6 +53,7 @@
     static const SVGPropertyInfo* s_propertyInfo = 0;
     if (!s_propertyInfo) {
         s_propertyInfo = new SVGPropertyInfo(AnimatedUnknown,
+                                             PropertyIsReadWrite,
                                              SVGNames::requiredExtensionsAttr,
                                              SVGNames::requiredExtensionsAttr.localName(),
                                              &SVGElement::synchronizeRequiredExtensions,
@@ -66,6 +68,7 @@
     static const SVGPropertyInfo* s_propertyInfo = 0;
     if (!s_propertyInfo) {
         s_propertyInfo = new SVGPropertyInfo(AnimatedUnknown,
+                                             PropertyIsReadWrite,
                                              SVGNames::systemLanguageAttr,
                                              SVGNames::systemLanguageAttr.localName(),
                                              &SVGElement::synchronizeSystemLanguage,
@@ -173,7 +176,7 @@
     if (!m_requiredFeatures.shouldSynchronize)
         return;
     AtomicString value(m_requiredFeatures.value.valueAsString());
-    SVGAnimatedPropertySynchronizer<true>::synchronize(contextElement, requiredFeaturesPropertyInfo()->attributeName, value);
+    m_requiredFeatures.synchronize(contextElement, requiredFeaturesPropertyInfo()->attributeName, value);
 }
 
 void SVGTests::synchronizeRequiredExtensions(SVGElement* contextElement)
@@ -182,7 +185,7 @@
     if (!m_requiredExtensions.shouldSynchronize)
         return;
     AtomicString value(m_requiredExtensions.value.valueAsString());
-    SVGAnimatedPropertySynchronizer<true>::synchronize(contextElement, requiredExtensionsPropertyInfo()->attributeName, value);
+    m_requiredExtensions.synchronize(contextElement, requiredExtensionsPropertyInfo()->attributeName, value);
 }
 
 void SVGTests::synchronizeSystemLanguage(SVGElement* contextElement)
@@ -191,7 +194,7 @@
     if (!m_systemLanguage.shouldSynchronize)
         return;
     AtomicString value(m_systemLanguage.value.valueAsString());
-    SVGAnimatedPropertySynchronizer<true>::synchronize(contextElement, systemLanguagePropertyInfo()->attributeName, value);
+    m_systemLanguage.synchronize(contextElement, systemLanguagePropertyInfo()->attributeName, value);
 }
 
 SVGStringList& SVGTests::requiredFeatures()
diff --git a/Source/WebCore/svg/SVGTextContentElement.cpp b/Source/WebCore/svg/SVGTextContentElement.cpp
index 612b605..8b7041f 100644
--- a/Source/WebCore/svg/SVGTextContentElement.cpp
+++ b/Source/WebCore/svg/SVGTextContentElement.cpp
@@ -44,6 +44,7 @@
     static const SVGPropertyInfo* s_propertyInfo = 0;
     if (!s_propertyInfo) {
         s_propertyInfo = new SVGPropertyInfo(AnimatedLength,
+                                             PropertyIsReadWrite,
                                              SVGNames::textLengthAttr,
                                              SVGNames::textLengthAttr.localName(),
                                              &SVGTextContentElement::synchronizeTextLength,
@@ -80,14 +81,14 @@
     if (!ownerType->m_textLength.shouldSynchronize)
         return;
     AtomicString value(SVGPropertyTraits<SVGLength>::toString(ownerType->m_specifiedTextLength));
-    SVGAnimatedPropertySynchronizer<true>::synchronize(ownerType, textLengthPropertyInfo()->attributeName, value);
+    ownerType->m_textLength.synchronize(ownerType, textLengthPropertyInfo()->attributeName, value);
 }
 
 PassRefPtr<SVGAnimatedProperty> SVGTextContentElement::lookupOrCreateTextLengthWrapper(void* contextElement)
 {
     ASSERT(contextElement);
     SVGTextContentElement* ownerType = static_cast<SVGTextContentElement*>(contextElement);
-    return SVGAnimatedProperty::lookupOrCreateWrapper<SVGTextContentElement, SVGAnimatedLength, SVGLength, true>
+    return SVGAnimatedProperty::lookupOrCreateWrapper<SVGTextContentElement, SVGAnimatedLength, SVGLength>
            (ownerType, textLengthPropertyInfo(), ownerType->m_textLength.value);
 }
 
diff --git a/Source/WebCore/svg/SVGViewElement.cpp b/Source/WebCore/svg/SVGViewElement.cpp
index dabe9db..da4b0d9 100644
--- a/Source/WebCore/svg/SVGViewElement.cpp
+++ b/Source/WebCore/svg/SVGViewElement.cpp
@@ -83,7 +83,7 @@
 
     if (SVGExternalResourcesRequired::parseAttribute(attribute))
         return;
-    if (SVGFitToViewBox::parseAttribute(document(), attribute))
+    if (SVGFitToViewBox::parseAttribute(this, attribute))
         return;
     if (SVGZoomAndPan::parseAttribute(this, attribute))
         return;
diff --git a/Source/WebCore/svg/SVGViewElement.h b/Source/WebCore/svg/SVGViewElement.h
index 11f5838..8c92f31 100644
--- a/Source/WebCore/svg/SVGViewElement.h
+++ b/Source/WebCore/svg/SVGViewElement.h
@@ -44,7 +44,6 @@
     using SVGStyledElement::deref;
 
     SVGStringList& viewTarget() { return m_viewTarget; }
-
     SVGZoomAndPanType zoomAndPan() const { return m_zoomAndPan; }
     void setZoomAndPan(unsigned short zoomAndPan) { m_zoomAndPan = SVGZoomAndPan::parseFromNumber(zoomAndPan); }
 
diff --git a/Source/WebCore/svg/SVGViewSpec.cpp b/Source/WebCore/svg/SVGViewSpec.cpp
index 8bb0400..08ab852 100644
--- a/Source/WebCore/svg/SVGViewSpec.cpp
+++ b/Source/WebCore/svg/SVGViewSpec.cpp
@@ -23,6 +23,8 @@
 #include "SVGViewSpec.h"
 
 #include "Document.h"
+#include "SVGAnimatedTransformList.h"
+#include "SVGFitToViewBox.h"
 #include "SVGNames.h"
 #include "SVGParserUtilities.h"
 #include "SVGSVGElement.h"
@@ -30,36 +32,105 @@
 
 namespace WebCore {
 
-// Animated property definitions
-DEFINE_ANIMATED_RECT(SVGViewSpec, SVGNames::viewBoxAttr, ViewBox, viewBox)
-DEFINE_ANIMATED_PRESERVEASPECTRATIO(SVGViewSpec, SVGNames::preserveAspectRatioAttr, PreserveAspectRatio, preserveAspectRatio)
+// Define custom animated property 'viewBox'.
+const SVGPropertyInfo* SVGViewSpec::viewBoxPropertyInfo()
+{
+    static const SVGPropertyInfo* s_propertyInfo = 0;
+    if (!s_propertyInfo) {
+        s_propertyInfo = new SVGPropertyInfo(AnimatedRect,
+                                             PropertyIsReadOnly,
+                                             SVGNames::viewBoxAttr,
+                                             viewBoxIdentifier(),
+                                             0,
+                                             &SVGViewSpec::lookupOrCreateViewBoxWrapper);
+    }
+    return s_propertyInfo;
+}
 
-BEGIN_REGISTER_ANIMATED_PROPERTIES(SVGViewSpec)
-    REGISTER_LOCAL_ANIMATED_PROPERTY(viewBox)
-    REGISTER_LOCAL_ANIMATED_PROPERTY(preserveAspectRatio)
-END_REGISTER_ANIMATED_PROPERTIES
+// Define custom animated property 'preserveAspectRatio'.
+const SVGPropertyInfo* SVGViewSpec::preserveAspectRatioPropertyInfo()
+{
+    static const SVGPropertyInfo* s_propertyInfo = 0;
+    if (!s_propertyInfo) {
+        s_propertyInfo = new SVGPropertyInfo(AnimatedPreserveAspectRatio,
+                                             PropertyIsReadOnly,
+                                             SVGNames::preserveAspectRatioAttr,
+                                             preserveAspectRatioIdentifier(),
+                                             0,
+                                             &SVGViewSpec::lookupOrCreatePreserveAspectRatioWrapper);
+    }
+    return s_propertyInfo;
+}
+
+
+// Define custom non-animated property 'transform'.
+const SVGPropertyInfo* SVGViewSpec::transformPropertyInfo()
+{
+    static const SVGPropertyInfo* s_propertyInfo = 0;
+    if (!s_propertyInfo) {
+        s_propertyInfo = new SVGPropertyInfo(AnimatedTransformList,
+                                             PropertyIsReadOnly,
+                                             SVGNames::transformAttr,
+                                             transformIdentifier(),
+                                             0,
+                                             &SVGViewSpec::lookupOrCreateTransformWrapper);
+    }
+    return s_propertyInfo;
+}
 
 SVGViewSpec::SVGViewSpec(SVGElement* contextElement)
     : m_contextElement(contextElement)
     , m_zoomAndPan(SVGZoomAndPanMagnify)
 {
     ASSERT(m_contextElement);
-    registerAnimatedPropertiesForSVGViewSpec();
+}
+
+const AtomicString& SVGViewSpec::viewBoxIdentifier()
+{
+    DEFINE_STATIC_LOCAL(AtomicString, s_identifier, ("SVGViewSpecViewBoxAttribute"));
+    return s_identifier;
+}
+
+const AtomicString& SVGViewSpec::preserveAspectRatioIdentifier()
+{
+    DEFINE_STATIC_LOCAL(AtomicString, s_identifier, ("SVGViewSpecPreserveAspectRatioAttribute"));
+    return s_identifier;
+}
+
+const AtomicString& SVGViewSpec::transformIdentifier()
+{
+    DEFINE_STATIC_LOCAL(AtomicString, s_identifier, ("SVGViewSpecTransformAttribute"));
+    return s_identifier;
+}
+
+void SVGViewSpec::setZoomAndPan(unsigned short, ExceptionCode& ec)
+{
+    // SVGViewSpec and all of its content is read-only.
+    ec = NO_MODIFICATION_ALLOWED_ERR;
 }
 
 void SVGViewSpec::setTransformString(const String& transform)
 {
-    m_transform.parse(transform);
+    if (!m_contextElement)
+        return;
+
+    SVGTransformList newList;
+    newList.parse(transform);
+
+    if (SVGAnimatedProperty* wrapper = SVGAnimatedProperty::lookupWrapper<SVGElement, SVGAnimatedTransformList>(m_contextElement, transformPropertyInfo()))
+        static_cast<SVGAnimatedTransformList*>(wrapper)->detachListWrappers(newList.size());
+
+    m_transform = newList;
 }
 
-void SVGViewSpec::setViewBoxString(const String& viewBoxStr)
+String SVGViewSpec::transformString() const
 {
-    FloatRect viewBox;
-    const UChar* c = viewBoxStr.characters();
-    const UChar* end = c + viewBoxStr.length();
-    if (!parseViewBox(m_contextElement->document(), c, end, viewBox, false))
-         return;
-    setViewBoxBaseValue(viewBox);
+    return SVGPropertyTraits<SVGTransformList>::toString(m_transform);
+}
+
+String SVGViewSpec::viewBoxString() const
+{
+    return SVGPropertyTraits<FloatRect>::toString(viewBoxBaseValue());
 }
 
 void SVGViewSpec::setPreserveAspectRatioString(const String& preserve)
@@ -69,16 +140,54 @@
     setPreserveAspectRatioBaseValue(preserveAspectRatio);
 }
 
-void SVGViewSpec::setViewTargetString(const String& viewTargetString)
+String SVGViewSpec::preserveAspectRatioString() const
 {
-    m_viewTargetString = viewTargetString;
+    return SVGPropertyTraits<SVGPreserveAspectRatio>::toString(preserveAspectRatioBaseValue());
 }
 
 SVGElement* SVGViewSpec::viewTarget() const
 {
+    if (!m_contextElement)
+        return 0;
     return static_cast<SVGElement*>(m_contextElement->treeScope()->getElementById(m_viewTargetString));
 }
 
+SVGTransformListPropertyTearOff* SVGViewSpec::transform()
+{
+    // Return the animVal here, as its readonly by default - which is exactly what we want here.
+    return static_cast<SVGTransformListPropertyTearOff*>(static_pointer_cast<SVGAnimatedTransformList>(lookupOrCreateTransformWrapper(this))->animVal());
+}
+
+PassRefPtr<SVGAnimatedProperty> SVGViewSpec::lookupOrCreateViewBoxWrapper(void* maskedOwnerType)
+{
+    ASSERT(maskedOwnerType);
+    SVGViewSpec* ownerType = static_cast<SVGViewSpec*>(maskedOwnerType);
+    return SVGAnimatedProperty::lookupOrCreateWrapper<SVGElement, SVGAnimatedRect, FloatRect>(ownerType->contextElement(), viewBoxPropertyInfo(), ownerType->m_viewBox);
+}
+
+PassRefPtr<SVGAnimatedProperty> SVGViewSpec::lookupOrCreatePreserveAspectRatioWrapper(void* maskedOwnerType)
+{
+    ASSERT(maskedOwnerType);
+    SVGViewSpec* ownerType = static_cast<SVGViewSpec*>(maskedOwnerType);
+    return SVGAnimatedProperty::lookupOrCreateWrapper<SVGElement, SVGAnimatedPreserveAspectRatio, SVGPreserveAspectRatio>(ownerType->contextElement(), preserveAspectRatioPropertyInfo(), ownerType->m_preserveAspectRatio);
+}
+
+PassRefPtr<SVGAnimatedProperty> SVGViewSpec::lookupOrCreateTransformWrapper(void* maskedOwnerType)
+{
+    ASSERT(maskedOwnerType);
+    SVGViewSpec* ownerType = static_cast<SVGViewSpec*>(maskedOwnerType);
+    return SVGAnimatedProperty::lookupOrCreateWrapper<SVGElement, SVGAnimatedTransformList, SVGTransformList>(ownerType->contextElement(), transformPropertyInfo(), ownerType->m_transform);
+}
+
+void SVGViewSpec::reset()
+{
+    m_zoomAndPan = SVGZoomAndPanMagnify;
+    m_transform.clear();
+    m_viewBox = FloatRect();
+    m_preserveAspectRatio = SVGPreserveAspectRatio();
+    m_viewTargetString = emptyString();
+}
+
 static const UChar svgViewSpec[] = {'s', 'v', 'g', 'V', 'i', 'e', 'w'};
 static const UChar viewBoxSpec[] = {'v', 'i', 'e', 'w', 'B', 'o', 'x'};
 static const UChar preserveAspectRatioSpec[] = {'p', 'r', 'e', 's', 'e', 'r', 'v', 'e', 'A', 's', 'p', 'e', 'c', 't', 'R', 'a', 't', 'i', 'o'};
@@ -91,7 +200,7 @@
     const UChar* currViewSpec = viewSpec.characters();
     const UChar* end = currViewSpec + viewSpec.length();
 
-    if (currViewSpec >= end)
+    if (currViewSpec >= end || !m_contextElement)
         return false;
 
     if (!skipString(currViewSpec, end, svgViewSpec, WTF_ARRAY_LENGTH(svgViewSpec)))
@@ -108,7 +217,7 @@
                     return false;
                 currViewSpec++;
                 FloatRect viewBox;
-                if (!parseViewBox(m_contextElement->document(), currViewSpec, end, viewBox, false))
+                if (!SVGFitToViewBox::parseViewBox(m_contextElement->document(), currViewSpec, end, viewBox, false))
                     return false;
                 setViewBoxBaseValue(viewBox);
                 if (currViewSpec >= end || *currViewSpec != ')')
diff --git a/Source/WebCore/svg/SVGViewSpec.h b/Source/WebCore/svg/SVGViewSpec.h
index 1e4c271..94456db 100644
--- a/Source/WebCore/svg/SVGViewSpec.h
+++ b/Source/WebCore/svg/SVGViewSpec.h
@@ -30,42 +30,91 @@
 namespace WebCore {
 
 class SVGElement;
+class SVGTransformListPropertyTearOff;
 
-class SVGViewSpec : public SVGZoomAndPan,
-                    public SVGFitToViewBox {
-    WTF_MAKE_NONCOPYABLE(SVGViewSpec);
+class SVGViewSpec : public RefCounted<SVGViewSpec>
+                  , public SVGZoomAndPan
+                  , public SVGFitToViewBox {
 public:
-    SVGViewSpec(SVGElement*);
+    virtual ~SVGViewSpec() { }
+
+    using RefCounted<SVGViewSpec>::ref;
+    using RefCounted<SVGViewSpec>::deref;
+
+    static PassRefPtr<SVGViewSpec> create(SVGElement* contextElement)
+    {
+        return adoptRef(new SVGViewSpec(contextElement));
+    }
 
     bool parseViewSpec(const String&);
+    void reset();
 
-    void setTransformString(const String&);
-    SVGTransformList transform() const { return m_transform; }
-    SVGTransformList transformBaseValue() const { return m_transform; }
-
-    void setViewBoxString(const String&);
+    SVGElement* viewTarget() const;
+    String viewBoxString() const;
 
     void setPreserveAspectRatioString(const String&);
+    String preserveAspectRatioString() const;
 
-    void setViewTargetString(const String&);
+    void setTransformString(const String&);
+    String transformString() const;
+
+    void setViewTargetString(const String& string) { m_viewTargetString = string; }
     String viewTargetString() const { return m_viewTargetString; }
-    SVGElement* viewTarget() const;
 
     SVGZoomAndPanType zoomAndPan() const { return m_zoomAndPan; }
+    void setZoomAndPan(unsigned short zoomAndPan) { setZoomAndPanBaseValue(zoomAndPan); }
     void setZoomAndPan(unsigned short, ExceptionCode&);
     void setZoomAndPanBaseValue(unsigned short zoomAndPan) { m_zoomAndPan = SVGZoomAndPan::parseFromNumber(zoomAndPan); }
 
-private:
-    SVGElement* m_contextElement;
+    SVGElement* contextElement() const { return m_contextElement; }
+    void resetContextElement() { m_contextElement = 0; }
 
-    BEGIN_DECLARE_ANIMATED_PROPERTIES(SVGViewSpec)
-        DECLARE_ANIMATED_RECT(ViewBox, viewBox)
-        DECLARE_ANIMATED_PRESERVEASPECTRATIO(PreserveAspectRatio, preserveAspectRatio)
-    END_DECLARE_ANIMATED_PROPERTIES
+    // Custom non-animated 'transform' property.
+    SVGTransformListPropertyTearOff* transform();
+    SVGTransformList transformBaseValue() const { return m_transform; }
+
+    // Custom animated 'viewBox' property.
+    PassRefPtr<SVGAnimatedRect> viewBoxAnimated()
+    {
+        return static_pointer_cast<SVGAnimatedRect>(lookupOrCreateViewBoxWrapper(this));
+    }
+
+    FloatRect& viewBox() { return m_viewBox; }
+    FloatRect viewBoxBaseValue() const { return m_viewBox; }
+    void setViewBoxBaseValue(const FloatRect& viewBox) { m_viewBox = viewBox; }
+
+    // Custom animated 'preserveAspectRatio' property.
+    PassRefPtr<SVGAnimatedPreserveAspectRatio> preserveAspectRatioAnimated()
+    {
+        return static_pointer_cast<SVGAnimatedPreserveAspectRatio>(lookupOrCreatePreserveAspectRatioWrapper(this));
+    }
+
+    SVGPreserveAspectRatio& preserveAspectRatio() { return m_preserveAspectRatio; }
+    SVGPreserveAspectRatio preserveAspectRatioBaseValue() const { return m_preserveAspectRatio; }
+    void setPreserveAspectRatioBaseValue(const SVGPreserveAspectRatio& preserveAspectRatio) { m_preserveAspectRatio = preserveAspectRatio; }
+
+private:
+    SVGViewSpec(SVGElement*);
+
+    static const SVGPropertyInfo* transformPropertyInfo();
+    static const SVGPropertyInfo* viewBoxPropertyInfo();
+    static const SVGPropertyInfo* preserveAspectRatioPropertyInfo();
+
+    static const AtomicString& transformIdentifier();
+    static const AtomicString& viewBoxIdentifier();
+    static const AtomicString& preserveAspectRatioIdentifier();
+
+    static PassRefPtr<SVGAnimatedProperty> lookupOrCreateTransformWrapper(void* contextElement);
+    static PassRefPtr<SVGAnimatedProperty> lookupOrCreateViewBoxWrapper(void* contextElement);
+    static PassRefPtr<SVGAnimatedProperty> lookupOrCreatePreserveAspectRatioWrapper(void* contextElement);
+
+    SVGElement* m_contextElement;
+    SVGZoomAndPanType m_zoomAndPan;
 
     SVGTransformList m_transform;
+    FloatRect m_viewBox;
+    SVGPreserveAspectRatio m_preserveAspectRatio;
     String m_viewTargetString;
-    SVGZoomAndPanType m_zoomAndPan;
 };
 
 } // namespace WebCore
diff --git a/Source/WebCore/svg/SVGViewSpec.idl b/Source/WebCore/svg/SVGViewSpec.idl
index e4ba46b..ec545d1 100644
--- a/Source/WebCore/svg/SVGViewSpec.idl
+++ b/Source/WebCore/svg/SVGViewSpec.idl
@@ -25,16 +25,26 @@
 
 module svg {
 
+    // SVGViewSpec intentionally doesn't inherit from SVGZoomAndPan & SVGFitToViewBox on the IDLs.
+    // It would require that any of those classes would be RefCounted, and we want to avoid that.
     interface [
-        Conditional=SVG
-    ] SVGViewSpec : SVGZoomAndPan, SVGFitToViewBox
-    {
+        Conditional=SVG,
+        JSGenerateToJSObject
+    ] SVGViewSpec {
           readonly attribute SVGTransformList transform;
-          readonly attribute SVGElement       viewTarget;
-          readonly attribute DOMString        viewBoxString;
-          readonly attribute DOMString        preserveAspectRatioString;
-          readonly attribute DOMString        transformString;
-          readonly attribute DOMString        viewTargetString;
+          readonly attribute SVGElement viewTarget;
+          readonly attribute DOMString viewBoxString;
+          readonly attribute DOMString preserveAspectRatioString;
+          readonly attribute DOMString transformString;
+          readonly attribute DOMString viewTargetString;
+
+          // SVGZoomAndPan
+          attribute unsigned short zoomAndPan
+              setter raises(DOMException);
+
+          // SVGFitToViewBox
+          readonly attribute SVGAnimatedRect viewBox;
+          readonly attribute SVGAnimatedPreserveAspectRatio preserveAspectRatio;
     };
 
 }
diff --git a/Source/WebCore/svg/properties/SVGAnimatedProperty.h b/Source/WebCore/svg/properties/SVGAnimatedProperty.h
index c64bac5..6dfdac6 100644
--- a/Source/WebCore/svg/properties/SVGAnimatedProperty.h
+++ b/Source/WebCore/svg/properties/SVGAnimatedProperty.h
@@ -36,6 +36,8 @@
     const QualifiedName& attributeName() const { return m_attributeName; }
     AnimatedPropertyType animatedPropertyType() const { return m_animatedPropertyType; }
     bool isAnimating() const { return m_isAnimating; }
+    bool isReadOnly() const { return m_isReadOnly; }
+    void setIsReadOnly() { m_isReadOnly = true; }
 
     void commitChange()
     {
@@ -66,66 +68,33 @@
         ASSERT(!m_isAnimating);
     }
 
-    // lookupOrCreateWrapper & helper methods.
-    template<typename TearOffType, typename PropertyType, bool isDerivedFromSVGElement>
-    struct LookupOrCreateHelper;
-
-    template<typename TearOffType, typename PropertyType>
-    struct LookupOrCreateHelper<TearOffType, PropertyType, false> {
-        static PassRefPtr<TearOffType> lookupOrCreateWrapper(void*, const SVGPropertyInfo*, PropertyType&)
-        {
-            ASSERT_NOT_REACHED();
-            return PassRefPtr<TearOffType>();
-        }
-    };
-
-    template<typename TearOffType, typename PropertyType>
-    struct LookupOrCreateHelper<TearOffType, PropertyType, true> {
-        static PassRefPtr<TearOffType> lookupOrCreateWrapper(SVGElement* element, const SVGPropertyInfo* info, PropertyType& property)
-        {
-            ASSERT(info);
-            SVGAnimatedPropertyDescription key(element, info->propertyIdentifier);
-            RefPtr<SVGAnimatedProperty> wrapper = animatedPropertyCache()->get(key);
-            if (!wrapper) {
-                wrapper = TearOffType::create(element, info->attributeName, info->animatedPropertyType, property);
-                animatedPropertyCache()->set(key, wrapper.get());
-            }
-            return static_pointer_cast<TearOffType>(wrapper);
-        }
-    };
-
-    template<typename OwnerType, typename TearOffType, typename PropertyType, bool isDerivedFromSVGElement>
+    template<typename OwnerType, typename TearOffType, typename PropertyType>
     static PassRefPtr<TearOffType> lookupOrCreateWrapper(OwnerType* element, const SVGPropertyInfo* info, PropertyType& property)
     {
-        return LookupOrCreateHelper<TearOffType, PropertyType, isDerivedFromSVGElement>::lookupOrCreateWrapper(element, info, property);
+        ASSERT(info);
+        SVGAnimatedPropertyDescription key(element, info->propertyIdentifier);
+        RefPtr<SVGAnimatedProperty> wrapper = animatedPropertyCache()->get(key);
+        if (!wrapper) {
+            wrapper = TearOffType::create(element, info->attributeName, info->animatedPropertyType, property);
+            if (info->animatedPropertyState == PropertyIsReadOnly)
+                wrapper->setIsReadOnly();
+            animatedPropertyCache()->set(key, wrapper.get());
+        }
+        return static_pointer_cast<TearOffType>(wrapper);
     }
 
-    // lookupWrapper & helper methods.
-    template<typename TearOffType, bool isDerivedFromSVGElement>
-    struct LookupHelper;
+    template<typename OwnerType, typename TearOffType>
+    static TearOffType* lookupWrapper(OwnerType* element, const SVGPropertyInfo* info)
+    {
+        ASSERT(info);
+        SVGAnimatedPropertyDescription key(element, info->propertyIdentifier);
+        return static_cast<TearOffType*>(animatedPropertyCache()->get(key));
+    }
 
-    template<typename TearOffType>
-    struct LookupHelper<TearOffType, false> {
-        static TearOffType* lookupWrapper(const void*, const SVGPropertyInfo*)
-        {
-            return 0;
-        }
-    };
-
-    template<typename TearOffType>
-    struct LookupHelper<TearOffType, true> {
-        static TearOffType* lookupWrapper(const SVGElement* element, const SVGPropertyInfo* info)
-        {
-            ASSERT(info);
-            SVGAnimatedPropertyDescription key(const_cast<SVGElement*>(element), info->propertyIdentifier);
-            return static_cast<TearOffType*>(animatedPropertyCache()->get(key));
-        }
-    };
-
-    template<typename OwnerType, typename TearOffType, bool isDerivedFromSVGElement>
+    template<typename OwnerType, typename TearOffType>
     static TearOffType* lookupWrapper(const OwnerType* element, const SVGPropertyInfo* info)
     {
-        return LookupHelper<TearOffType, isDerivedFromSVGElement>::lookupWrapper(element, info);
+        return lookupWrapper<OwnerType, TearOffType>(const_cast<OwnerType*>(element), info);
     }
 
 protected:
@@ -134,6 +103,7 @@
         , m_attributeName(attributeName)
         , m_animatedPropertyType(animatedPropertyType)
         , m_isAnimating(false)
+        , m_isReadOnly(false)
     {
     }
 
@@ -150,6 +120,7 @@
 
 protected:
     bool m_isAnimating;
+    bool m_isReadOnly;
 };
 
 }
diff --git a/Source/WebCore/svg/properties/SVGAnimatedPropertyMacros.h b/Source/WebCore/svg/properties/SVGAnimatedPropertyMacros.h
index 2b69c13..2adb8b6 100644
--- a/Source/WebCore/svg/properties/SVGAnimatedPropertyMacros.h
+++ b/Source/WebCore/svg/properties/SVGAnimatedPropertyMacros.h
@@ -23,30 +23,13 @@
 #define SVGAnimatedPropertyMacros_h
 
 #if ENABLE(SVG)
+#include "SVGAnimatedProperty.h"
 #include "SVGAttributeToPropertyMap.h"
 #include "SVGPropertyTraits.h"
 #include <wtf/StdLibExtras.h>
 
 namespace WebCore {
 
-// IsDerivedFromSVGElement implementation
-template<typename OwnerType>
-struct IsDerivedFromSVGElement {
-    static const bool value = true;
-};
-
-class SVGTests;
-template<>
-struct IsDerivedFromSVGElement<SVGTests> {
-    static const bool value = false;
-};
-
-class SVGViewSpec;
-template<>
-struct IsDerivedFromSVGElement<SVGViewSpec> {
-    static const bool value = false;
-};
-
 // SVGSynchronizableAnimatedProperty implementation
 template<typename PropertyType>
 struct SVGSynchronizableAnimatedProperty {
@@ -70,6 +53,22 @@
     {
     }
 
+    void synchronize(SVGElement* ownerElement, const QualifiedName& attrName, const AtomicString& value)
+    {
+        // If the attribute already exists on the element, we change the
+        // Attribute directly to avoid a call to Element::attributeChanged
+        // that could cause the SVGElement to erroneously reset its properties.
+        // svg/dom/SVGStringList-basics.xhtml exercises this behavior.
+        ElementAttributeData* attributeData = ownerElement->ensureUpdatedAttributeData();
+        Attribute* old = attributeData->getAttributeItem(attrName);
+        if (old && value.isNull())
+            attributeData->removeAttribute(old->name(), ownerElement);
+        else if (!old && !value.isNull())
+            attributeData->addAttribute(Attribute(attrName, value), ownerElement);
+        else if (old && !value.isNull())
+            old->setValue(value);
+    }
+
     PropertyType value;
     bool shouldSynchronize : 1;
 };
@@ -102,6 +101,7 @@
 const SVGPropertyInfo* OwnerType::LowerProperty##PropertyInfo() { \
     DEFINE_STATIC_LOCAL(const SVGPropertyInfo, s_propertyInfo, \
                         (AnimatedPropertyTypeEnum, \
+                         PropertyIsReadWrite, \
                          DOMAttribute, \
                          SVGDOMAttributeIdentifier, \
                          &OwnerType::synchronize##UpperProperty, \
@@ -124,7 +124,7 @@
     static const SVGPropertyInfo* LowerProperty##PropertyInfo(); \
     PropertyType& LowerProperty() const \
     { \
-        if (TearOffType* wrapper = SVGAnimatedProperty::lookupWrapper<UseOwnerType, TearOffType, IsDerivedFromSVGElement<UseOwnerType>::value>(this, LowerProperty##PropertyInfo())) { \
+        if (TearOffType* wrapper = SVGAnimatedProperty::lookupWrapper<UseOwnerType, TearOffType>(this, LowerProperty##PropertyInfo())) { \
             if (wrapper->isAnimating()) \
                 return wrapper->currentAnimatedValue(); \
         } \
@@ -153,14 +153,14 @@
         if (!m_##LowerProperty.shouldSynchronize) \
             return; \
         AtomicString value(SVGPropertyTraits<PropertyType>::toString(m_##LowerProperty.value)); \
-        SVGAnimatedPropertySynchronizer<IsDerivedFromSVGElement<UseOwnerType>::value>::synchronize(this, LowerProperty##PropertyInfo()->attributeName, value); \
+        m_##LowerProperty.synchronize(this, LowerProperty##PropertyInfo()->attributeName, value); \
     } \
 \
     static PassRefPtr<SVGAnimatedProperty> lookupOrCreate##UpperProperty##Wrapper(void* maskedOwnerType) \
     { \
         ASSERT(maskedOwnerType); \
         UseOwnerType* ownerType = static_cast<UseOwnerType*>(maskedOwnerType); \
-        return SVGAnimatedProperty::lookupOrCreateWrapper<UseOwnerType, TearOffType, PropertyType, IsDerivedFromSVGElement<UseOwnerType>::value>(ownerType, LowerProperty##PropertyInfo(), ownerType->m_##LowerProperty.value); \
+        return SVGAnimatedProperty::lookupOrCreateWrapper<UseOwnerType, TearOffType, PropertyType>(ownerType, LowerProperty##PropertyInfo(), ownerType->m_##LowerProperty.value); \
     } \
 \
     static void synchronize##UpperProperty(void* maskedOwnerType) \
@@ -179,7 +179,7 @@
 DECLARE_ANIMATED_PROPERTY(TearOffType, PropertyType, UpperProperty, LowerProperty) \
 void detachAnimated##UpperProperty##ListWrappers(unsigned newListSize) \
 { \
-    if (TearOffType* wrapper = SVGAnimatedProperty::lookupWrapper<UseOwnerType, TearOffType, IsDerivedFromSVGElement<UseOwnerType>::value>(this, LowerProperty##PropertyInfo())) \
+    if (TearOffType* wrapper = SVGAnimatedProperty::lookupWrapper<UseOwnerType, TearOffType>(this, LowerProperty##PropertyInfo())) \
         wrapper->detachListWrappers(newListSize); \
 }
 
diff --git a/Source/WebCore/svg/properties/SVGAnimatedPropertySynchronizer.h b/Source/WebCore/svg/properties/SVGAnimatedPropertySynchronizer.h
deleted file mode 100644
index 887bc18..0000000
--- a/Source/WebCore/svg/properties/SVGAnimatedPropertySynchronizer.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) Research In Motion Limited 2010. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#ifndef SVGAnimatedPropertySynchronizer_h
-#define SVGAnimatedPropertySynchronizer_h
-
-#if ENABLE(SVG)
-#include "SVGElement.h"
-
-namespace WebCore {
-
-// Helper template used for synchronizing SVG <-> XML properties
-template<bool isDerivedFromSVGElement>
-struct SVGAnimatedPropertySynchronizer;
-
-template<>
-struct SVGAnimatedPropertySynchronizer<true> {
-    static void synchronize(SVGElement* ownerElement, const QualifiedName& attrName, const AtomicString& value)
-    {
-        // If the attribute already exists on the element, we change the
-        // Attribute directly to avoid a call to Element::attributeChanged
-        // that could cause the SVGElement to erroneously reset its properties.
-        // svg/dom/SVGStringList-basics.xhtml exercises this behavior.
-        ElementAttributeData* attributeData = ownerElement->ensureUpdatedAttributeData();
-        Attribute* old = attributeData->getAttributeItem(attrName);
-        if (old && value.isNull())
-            attributeData->removeAttribute(old->name(), ownerElement);
-        else if (!old && !value.isNull())
-            attributeData->addAttribute(Attribute(attrName, value), ownerElement);
-        else if (old && !value.isNull())
-            old->setValue(value);
-    }
-};
-
-template<>
-struct SVGAnimatedPropertySynchronizer<false> {
-    static void synchronize(void*, const QualifiedName&, const AtomicString&)
-    {
-        // no-op, for types not inheriting from Element, thus nothing to synchronize
-    }
-};
-
-};
-
-#endif
-#endif
diff --git a/Source/WebCore/svg/properties/SVGAttributeToPropertyMap.h b/Source/WebCore/svg/properties/SVGAttributeToPropertyMap.h
index 8e4cd57..3203c4d 100644
--- a/Source/WebCore/svg/properties/SVGAttributeToPropertyMap.h
+++ b/Source/WebCore/svg/properties/SVGAttributeToPropertyMap.h
@@ -21,15 +21,13 @@
 #define SVGAttributeToPropertyMap_h
 
 #if ENABLE(SVG)
-#include "QualifiedName.h"
-#include "SVGAnimatedPropertySynchronizer.h"
+#include "SVGPropertyInfo.h"
 #include <wtf/HashMap.h>
 
 namespace WebCore {
 
 class SVGAnimatedProperty;
 class SVGElement;
-struct SVGPropertyInfo;
 
 class SVGAttributeToPropertyMap {
 public:
diff --git a/Source/WebCore/svg/properties/SVGListProperty.h b/Source/WebCore/svg/properties/SVGListProperty.h
index db3def7..aed4ad4 100644
--- a/Source/WebCore/svg/properties/SVGListProperty.h
+++ b/Source/WebCore/svg/properties/SVGListProperty.h
@@ -415,8 +415,6 @@
         return newItem.release();
     }
 
-    virtual SVGPropertyRole role() const { return m_role; }
-
     PropertyType& values()
     {
         ASSERT(m_values);
diff --git a/Source/WebCore/svg/properties/SVGListPropertyTearOff.h b/Source/WebCore/svg/properties/SVGListPropertyTearOff.h
index 415df82..c3bba4b 100644
--- a/Source/WebCore/svg/properties/SVGListPropertyTearOff.h
+++ b/Source/WebCore/svg/properties/SVGListPropertyTearOff.h
@@ -37,6 +37,7 @@
     typedef SVGAnimatedListPropertyTearOff<PropertyType> AnimatedListPropertyTearOff;
     typedef typename SVGAnimatedListPropertyTearOff<PropertyType>::ListWrapperCache ListWrapperCache;
 
+    using Base::m_role;
     using Base::m_values;
     using Base::m_wrappers;
 
@@ -115,6 +116,15 @@
     {
     }
 
+    virtual bool isReadOnly() const
+    {
+        if (m_role == AnimValRole)
+            return true;
+        if (m_animatedProperty && m_animatedProperty->isReadOnly())
+            return true;
+        return false;
+    }
+
     virtual void commitChange()
     {
         ASSERT(m_values);
diff --git a/Source/WebCore/svg/properties/SVGPathSegListPropertyTearOff.h b/Source/WebCore/svg/properties/SVGPathSegListPropertyTearOff.h
index 3fccebf..4f41af3 100644
--- a/Source/WebCore/svg/properties/SVGPathSegListPropertyTearOff.h
+++ b/Source/WebCore/svg/properties/SVGPathSegListPropertyTearOff.h
@@ -126,6 +126,17 @@
 
     SVGPathElement* contextElement() const;
 
+    using Base::m_role;
+
+    virtual bool isReadOnly() const
+    {
+        if (m_role == AnimValRole)
+            return true;
+        if (m_animatedProperty && m_animatedProperty->isReadOnly())
+            return true;
+        return false;
+    }
+
     virtual void commitChange()
     {
         ASSERT(m_values);
diff --git a/Source/WebCore/svg/properties/SVGProperty.h b/Source/WebCore/svg/properties/SVGProperty.h
index 609e264..69394e3 100644
--- a/Source/WebCore/svg/properties/SVGProperty.h
+++ b/Source/WebCore/svg/properties/SVGProperty.h
@@ -35,7 +35,7 @@
 public:
     virtual ~SVGProperty() { }
 
-    virtual SVGPropertyRole role() const = 0;
+    virtual bool isReadOnly() const = 0;
     virtual void commitChange() = 0;
 };
 
diff --git a/Source/WebCore/svg/properties/SVGPropertyInfo.h b/Source/WebCore/svg/properties/SVGPropertyInfo.h
index 5793128..c2f7334 100644
--- a/Source/WebCore/svg/properties/SVGPropertyInfo.h
+++ b/Source/WebCore/svg/properties/SVGPropertyInfo.h
@@ -28,6 +28,11 @@
 
 class SVGAnimatedProperty;
 
+enum AnimatedPropertyState {
+    PropertyIsReadWrite,
+    PropertyIsReadOnly
+};
+
 enum AnimatedPropertyType {
     AnimatedAngle,
     AnimatedBoolean,
@@ -53,10 +58,11 @@
     typedef void (*SynchronizeProperty)(void*);
     typedef PassRefPtr<SVGAnimatedProperty> (*LookupOrCreateWrapperForAnimatedProperty)(void*);
 
-    SVGPropertyInfo(AnimatedPropertyType newType, const QualifiedName& newAttributeName,
+    SVGPropertyInfo(AnimatedPropertyType newType, AnimatedPropertyState newState, const QualifiedName& newAttributeName,
                     const AtomicString& newPropertyIdentifier, SynchronizeProperty newSynchronizeProperty,
                     LookupOrCreateWrapperForAnimatedProperty newLookupOrCreateWrapperForAnimatedProperty)
         : animatedPropertyType(newType)
+        , animatedPropertyState(newState)
         , attributeName(newAttributeName)
         , propertyIdentifier(newPropertyIdentifier)
         , synchronizeProperty(newSynchronizeProperty)
@@ -65,6 +71,7 @@
     }
 
     AnimatedPropertyType animatedPropertyType;
+    AnimatedPropertyState animatedPropertyState;
     const QualifiedName& attributeName;
     const AtomicString& propertyIdentifier;
     SynchronizeProperty synchronizeProperty;
diff --git a/Source/WebCore/svg/properties/SVGPropertyTearOff.h b/Source/WebCore/svg/properties/SVGPropertyTearOff.h
index c7739ef..07dbd10 100644
--- a/Source/WebCore/svg/properties/SVGPropertyTearOff.h
+++ b/Source/WebCore/svg/properties/SVGPropertyTearOff.h
@@ -96,7 +96,14 @@
         m_animatedProperty->commitChange();
     }
 
-    virtual SVGPropertyRole role() const { return m_role; }
+    virtual bool isReadOnly() const
+    {
+        if (m_role == AnimValRole)
+            return true;
+        if (m_animatedProperty && m_animatedProperty->isReadOnly())
+            return true;
+        return false;
+    }
 
 protected:
     SVGPropertyTearOff(SVGAnimatedProperty* animatedProperty, SVGPropertyRole role, PropertyType& value)
diff --git a/Source/WebCore/svg/properties/SVGStaticListPropertyTearOff.h b/Source/WebCore/svg/properties/SVGStaticListPropertyTearOff.h
index 8635378..b39aaf3 100644
--- a/Source/WebCore/svg/properties/SVGStaticListPropertyTearOff.h
+++ b/Source/WebCore/svg/properties/SVGStaticListPropertyTearOff.h
@@ -33,6 +33,7 @@
     typedef typename SVGPropertyTraits<PropertyType>::ListItemType ListItemType;
     typedef SVGPropertyTearOff<ListItemType> ListItemTearOff;
 
+    using Base::m_role;
     using Base::m_values;
 
     static PassRefPtr<SVGStaticListPropertyTearOff<PropertyType> > create(SVGElement* contextElement, PropertyType& values)
@@ -84,6 +85,11 @@
     {
     }
 
+    virtual bool isReadOnly() const
+    {
+        return m_role == AnimValRole;
+    }
+
     virtual void commitChange()
     {
         ASSERT(m_values);
diff --git a/Source/WebKit/mac/ChangeLog b/Source/WebKit/mac/ChangeLog
index cdb03ef..ced7d88 100644
--- a/Source/WebKit/mac/ChangeLog
+++ b/Source/WebKit/mac/ChangeLog
@@ -1,3 +1,12 @@
+2012-05-29  Nikolas Zimmermann  <nzimmermann@rim.com>
+
+        SVGViewSpec DOM bindings aka SVGSVGElement.currentView is unimplemented
+        https://bugs.webkit.org/show_bug.cgi?id=15495
+
+        Reviewed by Rob Buis.
+
+        * MigrateHeaders.make: Copy DOMSVGViewSpec*.h headers.
+
 2012-05-25  Jesus Sanchez-Palencia  <jesus.palencia@openbossa.org>
 
         WebKitTestRunner needs to support layoutTestController.setJavaScriptProfilingEnabled
diff --git a/Source/WebKit/mac/MigrateHeaders.make b/Source/WebKit/mac/MigrateHeaders.make
index fd6a1f5..163d3fa 100644
--- a/Source/WebKit/mac/MigrateHeaders.make
+++ b/Source/WebKit/mac/MigrateHeaders.make
@@ -463,6 +463,8 @@
     $(INTERNAL_HEADERS_DIR)/DOMSVGUseElementInternal.h \
     $(PRIVATE_HEADERS_DIR)/DOMSVGViewElement.h \
     $(INTERNAL_HEADERS_DIR)/DOMSVGViewElementInternal.h \
+    $(PRIVATE_HEADERS_DIR)/DOMSVGViewSpec.h \
+    $(INTERNAL_HEADERS_DIR)/DOMSVGViewSpecInternal.h \
     $(PRIVATE_HEADERS_DIR)/DOMSVGZoomAndPan.h \
     $(PRIVATE_HEADERS_DIR)/DOMSVGZoomEvent.h \
     $(INTERNAL_HEADERS_DIR)/DOMSVGZoomEventInternal.h \