diff options
author | Eirik Aavitsland <eirik.aavitsland@qt.io> | 2018-08-10 13:25:11 +0200 |
---|---|---|
committer | Eirik Aavitsland <eirik.aavitsland@qt.io> | 2018-08-20 13:59:12 +0000 |
commit | 907c2db46915eedac02f2a5a26291d2ce19282f9 (patch) | |
tree | 633734fcfacb6b48e626fdd0ee74baf20d2a221a /tests | |
parent | bb80aeee1fb19445889210ec913046d0ca385721 (diff) | |
download | qtsvg-907c2db46915eedac02f2a5a26291d2ce19282f9.tar.gz |
Fix parsing of forward referrals in use elements
SVG <use> elements may refer to a node that is defined later in the
file. The parser would then fail to resolve the link. Implement
delayed link resolution in the parser to handle such cases.
Task-number: QTBUG-69694
Change-Id: I94ffb3511dbd0fac822bb56991415b2d99ccf90e
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/qsvgrenderer/tst_qsvgrenderer.cpp | 45 |
1 files changed, 40 insertions, 5 deletions
diff --git a/tests/auto/qsvgrenderer/tst_qsvgrenderer.cpp b/tests/auto/qsvgrenderer/tst_qsvgrenderer.cpp index a8fc9de..5e13bee 100644 --- a/tests/auto/qsvgrenderer/tst_qsvgrenderer.cpp +++ b/tests/auto/qsvgrenderer/tst_qsvgrenderer.cpp @@ -1261,32 +1261,36 @@ void tst_QSvgRenderer::testStopOffsetOpacity() void tst_QSvgRenderer::testUseElement() { static const char *svgs[] = { - //Use referring to non group node (1) + // 0 - Use referring to non group node (1) "<svg viewBox = \"0 0 200 200\">" " <polygon points=\"20,20 50,120 100,10 40,80 50,80\"/>" " <polygon points=\"20,80 50,180 100,70 40,140 50,140\" fill= \"red\" stroke = \"blue\" fill-opacity = \"0.7\" fill-rule = \"evenodd\" stroke-width = \"3\"/>" "</svg>", + // 1 "<svg viewBox = \"0 0 200 200\">" " <polygon id = \"usedPolyline\" points=\"20,20 50,120 100,10 40,80 50,80\"/>" " <use y = \"60\" xlink:href = \"#usedPolyline\" fill= \"red\" stroke = \"blue\" fill-opacity = \"0.7\" fill-rule = \"evenodd\" stroke-width = \"3\"/>" "</svg>", + // 2 "<svg viewBox = \"0 0 200 200\">" " <polygon id = \"usedPolyline\" points=\"20,20 50,120 100,10 40,80 50,80\"/>" " <g fill = \" red\" fill-opacity =\"0.2\">" "<use y = \"60\" xlink:href = \"#usedPolyline\" stroke = \"blue\" fill-opacity = \"0.7\" fill-rule = \"evenodd\" stroke-width = \"3\"/>" "</g>" "</svg>", + // 3 "<svg viewBox = \"0 0 200 200\">" " <polygon id = \"usedPolyline\" points=\"20,20 50,120 100,10 40,80 50,80\"/>" " <g stroke-width = \"3\" stroke = \"yellow\">" " <use y = \"60\" xlink:href = \"#usedPolyline\" fill = \" red\" stroke = \"blue\" fill-opacity = \"0.7\" fill-rule = \"evenodd\"/>" " </g>" "</svg>", - //Use referring to non group node (2) + // 4 - Use referring to non group node (2) "<svg viewBox = \"0 0 200 200\">" " <polygon points=\"20,20 50,120 100,10 40,80 50,80\" fill = \"green\" fill-rule = \"nonzero\" stroke = \"purple\" stroke-width = \"4\" stroke-dasharray = \"1,1,3,1\" stroke-offset = \"3\" stroke-miterlimit = \"6\" stroke-linecap = \"butt\" stroke-linejoin = \"round\"/>" " <polygon points=\"20,80 50,180 100,70 40,140 50,140\" fill= \"red\" stroke = \"blue\" fill-opacity = \"0.7\" fill-rule = \"evenodd\" stroke-width = \"3\" stroke-dasharray = \"1,1,1,1\" stroke-offset = \"5\" stroke-miterlimit = \"3\" stroke-linecap = \"butt\" stroke-linejoin = \"square\"/>" "</svg>", + // 5 "<svg viewBox = \"0 0 200 200\">" " <g fill = \"green\" fill-rule = \"nonzero\" stroke = \"purple\" stroke-width = \"4\" stroke-dasharray = \"1,1,3,1\" stroke-offset = \"3\" stroke-miterlimit = \"6\" stroke-linecap = \"butt\" stroke-linejoin = \"round\">" " <polygon id = \"usedPolyline\" points=\"20,20 50,120 100,10 40,80 50,80\" />" @@ -1295,6 +1299,7 @@ void tst_QSvgRenderer::testUseElement() " <use y = \"60\" xlink:href = \"#usedPolyline\" fill-opacity = \"0.7\" fill= \"red\" stroke = \"blue\" fill-rule = \"evenodd\"/>" " </g>" "</svg>", + // 6 "<svg viewBox = \"0 0 200 200\">" " <g fill = \"green\" fill-rule = \"nonzero\" stroke = \"purple\" stroke-width = \"4\" stroke-dasharray = \"1,1,3,1\" stroke-offset = \"3\" stroke-miterlimit = \"6\" stroke-linecap = \"butt\" stroke-linejoin = \"round\">" " <polygon id = \"usedPolyline\" points=\"20,20 50,120 100,10 40,80 50,80\" />" @@ -1303,7 +1308,7 @@ void tst_QSvgRenderer::testUseElement() " <use y = \"60\" xlink:href = \"#usedPolyline\" fill= \"red\" stroke = \"blue\" fill-opacity = \"0.7\" fill-rule = \"evenodd\" />" " </g>" "</svg>", - //Use referring to group node + // 7 - Use referring to group node "<svg viewBox = \"0 0 200 200\">" " <g>" " <circle cx=\"0\" cy=\"0\" r=\"100\" fill = \"red\" fill-opacity = \"0.6\"/>" @@ -1311,6 +1316,7 @@ void tst_QSvgRenderer::testUseElement() " <circle fill=\"#a6ce39\" cx=\"0\" cy=\"0\" r=\"33\" fill-opacity = \"0.5\"/>" " </g>" "</svg>", + // 8 "<svg viewBox = \"0 0 200 200\">" " <defs>" " <g id=\"usedG\">" @@ -1321,6 +1327,7 @@ void tst_QSvgRenderer::testUseElement() " </defs>" " <use xlink:href =\"#usedG\" fill = \"red\" fill-opacity =\"0.5\"/>" "</svg>", + // 9 "<svg viewBox = \"0 0 200 200\">" " <defs>" " <g fill = \"blue\" fill-opacity = \"0.3\">" @@ -1335,16 +1342,40 @@ void tst_QSvgRenderer::testUseElement() " <use xlink:href =\"#usedG\" />" " </g>" "</svg>", - // Self referral, should be ignored + // 10 - Self referral, should be ignored "<svg><g id=\"0\"><use xlink:href=\"#0\" /></g></svg>", + // 11 "<svg width=\"200\" height=\"200\">" " <rect width=\"100\" height=\"50\"/>" "</svg>", + // 12 "<svg width=\"200\" height=\"200\">" " <g id=\"0\"><use xlink:href=\"#0\" /><rect width=\"100\" height=\"50\"/></g>" "</svg>", + // 13 "<svg width=\"200\" height=\"200\">" " <g id=\"0\"><g><use xlink:href=\"#0\" /><rect width=\"100\" height=\"50\"/></g></g>" + "</svg>", + // 14 (undefined) + "<svg width=\"200\" height=\"200\">" + " <rect width=\"100\" height=\"50\"/>" + " <use x=\"100\" y=\"100\" opacity=\"0.5\" xlink:href=\"#nosuch\" />" + "</svg>", + // 15 - Forward references + "<svg viewBox = \"0 0 200 200\">" + " <use y = \"60\" xlink:href = \"#usedPolyline\" fill= \"red\" stroke = \"blue\" fill-opacity = \"0.7\" fill-rule = \"evenodd\" stroke-width = \"3\"/>" + " <polygon id = \"usedPolyline\" points=\"20,20 50,120 100,10 40,80 50,80\"/>" + "</svg>", + // 16 + "<svg viewBox = \"0 0 200 200\">" + " <use xlink:href =\"#usedG\" fill = \"red\" fill-opacity =\"0.5\"/>" + " <defs>" + " <g id=\"usedG\">" + " <circle cx=\"0\" cy=\"0\" r=\"100\" fill-opacity = \"0.6\"/>" + " <rect x = \"10\" y = \"10\" width = \"30\" height = \"30\"/>" + " <circle fill=\"#a6ce39\" cx=\"0\" cy=\"0\" r=\"33\" />" + " </g>" + " </defs>" "</svg>" }; @@ -1373,8 +1404,12 @@ void tst_QSvgRenderer::testUseElement() } } else if (i > 7 && i < 10) { QCOMPARE(images[8], images[i]); - } else if (i > 11) { + } else if (i > 11 && i < 15) { QCOMPARE(images[11], images[i]); + } else if (i == 15) { + QCOMPARE(images[0], images[i]); + } else if (i == 16) { + QCOMPARE(images[8], images[i]); } } } |