| <html> |
| <head> |
| <script src="../../resources/testharness.js"></script> |
| <script src="../../resources/testharnessreport.js"></script> |
| </head> |
| <body> |
| <span>Tests that canvas 2d context supports 'direction' attribute: <span id="supported"></span></span> |
| <div> |
| <span>Tests that context.direction is 'ltr' with parent element having unspecified direction: <span id="result1"></span></span><br> |
| <canvas id="canvas1" width=400 height=20 style="border:1px solid black"></canvas> |
| </div> |
| <div dir="rtl"> |
| <span>Tests that context.direction is 'rtl' with parent element having direction as rtl: <span id="result2"></span></span><br> |
| <canvas id="canvas2" width=400 height=20 style="border:1px solid black"></canvas> |
| </div> |
| <div> |
| <span>Tests that context.direction is overridden by 'rtl' with parent element having unspecified direction: <span id="result3"></span></span><br> |
| <canvas id="canvas3" width=400 height=20 style="border:1px solid black"></canvas> |
| </div> |
| <div dir="rtl"> |
| <span>Tests that context.direction is overridden by 'ltr' with parent element having direction as rtl: <span id="result4"></span></span><br> |
| <canvas id="canvas4" width=400 height=20 style="border:1px solid black"></canvas> |
| </div> |
| <div> |
| <span>Tests that context.direction is overridden by 'inherit' with parent element having unspecified direction: <span id="result5"></span></span><br> |
| <canvas id="canvas5" width=400 height=20 style="border:1px solid black"></canvas> |
| </div> |
| <div dir="rtl"> |
| <span>Tests that context.direction is overridden by 'inherit' with parent element having direction as rtl: <span id="result6"></span></span><br> |
| <canvas id="canvas6" width=400 height=20 style="border:1px solid black"></canvas> |
| </div> |
| <div> |
| <span>Tests that context.reset sets the direction as ltr<span id="result7"></span></span><br> |
| <canvas id="canvas7" width=400 height=20 style="border:1px solid black"></canvas> |
| </div> |
| <div dir="rtl"> |
| <span>Tests that context.reset sets the direction as rtl<span id="result8"></span></span><br> |
| <canvas id="canvas8" width=400 height=20 style="border:1px solid black"></canvas> |
| </div> |
| <div> |
| <span>Tests that change in element's dir attribute is reflected in context.direction as rtl: <span id="result9"></span></span><br> |
| <canvas id="canvas9" width=400 height=20 style="border:1px solid black"></canvas> |
| </div> |
| <div dir="rtl"> |
| <span>Tests that change in element's dir attribute is reflected in context.direction as ltr: <span id="result10"></span></span><br> |
| <canvas id="canvas10" width=400 height=20 style="border:1px solid black"></canvas> |
| </div> |
| <div> |
| <span>Tests that context.direction reflects the valid direction after save/restore context operations: <span id="result11"></span></span><br> |
| <canvas id="canvas11" style="border:1px solid black"></canvas> |
| </div> |
| <div id="results"> |
| </div> |
| <script> |
| var fontSettings = "12px 'Arial'"; |
| |
| function verifyDrawText(canvasId, text, expectedDirection) |
| { |
| var canvasElement = document.getElementById(canvasId); |
| var ctx = canvasElement.getContext('2d'); |
| var width = canvasElement.width/2; |
| var height = canvasElement.height; |
| assert_equals(ctx.direction, expectedDirection); |
| ctx.moveTo(width, 0); |
| ctx.lineTo(width, height); |
| ctx.stroke(); |
| ctx.font = fontSettings; |
| ctx.fillText(text, width, height/2); |
| } |
| |
| function verifyDrawTextWithSpecifiedDirection(testItem) |
| { |
| var canvasElement = document.getElementById(testItem['canvasId']); |
| var ctx = canvasElement.getContext('2d'); |
| var width = canvasElement.width/2; |
| var height = canvasElement.height; |
| var currentDirection = ctx.direction; |
| ctx.direction = testItem['direction']; |
| assert_not_equals(currentDirection, null); |
| assert_equals(ctx.direction, testItem['expectedDirection']); |
| ctx.moveTo(width, 0); |
| ctx.lineTo(width, height); |
| ctx.stroke(); |
| ctx.font = fontSettings; |
| ctx.fillText(testItem['text'], width, height/2); |
| } |
| |
| function verifyDirectionAfterReset(testItem) |
| { |
| var canvasElement = document.getElementById(testItem['canvasId']); |
| var width = canvasElement.width/2; |
| var height = canvasElement.height; |
| var ctx = canvasElement.getContext('2d'); |
| ctx.direction = testItem['direction']; |
| ctx.moveTo(width, 0); |
| ctx.lineTo(width, height); |
| ctx.stroke(); |
| ctx.font = fontSettings; |
| ctx.fillText(testItem['text'], width, height/2); |
| canvasElement.width = canvasElement.width + 1; |
| assert_equals(ctx.direction, testItem['expectedDirection']); |
| document.body.removeChild(canvasElement.parentElement); |
| } |
| |
| function verifyDirectionAfterAttributeChange(testItem) |
| { |
| var canvasElement = document.getElementById(testItem['canvasId']); |
| var ctx = canvasElement.getContext('2d'); |
| var width = canvasElement.width/2; |
| var height = canvasElement.height; |
| |
| if (testItem['forParentElement']) |
| canvasElement.parentElement.dir = testItem['newDirection']; |
| else |
| canvasElement.dir = testItem['newDirection']; |
| assert_equals(ctx.direction, testItem['newDirection']); |
| ctx.moveTo(width, 0); |
| ctx.lineTo(width, height); |
| ctx.stroke(); |
| ctx.font = fontSettings; |
| ctx.fillText(testItem['text'], width, height/2); |
| } |
| |
| function verifyDirectionAcrossSaveRestores(canvasId, testVector) |
| { |
| var canvasElement = document.getElementById(canvasId); |
| var ctx = canvasElement.getContext('2d'); |
| var width = canvasElement.width/2; |
| var height = 0; |
| ctx.moveTo(width, 0); |
| ctx.lineTo(width, canvasElement.height); |
| ctx.stroke(); |
| ctx.font = fontSettings; |
| var testVectorLength = testVector.length; |
| var i = 0; |
| for (; i < testVector.length; ++i) { |
| height += 20; |
| ctx.direction = testVector[i].direction; |
| ctx.fillText(testVector[i].text, width, height); |
| if (i != testVectorLength - 1) |
| ctx.save(); |
| } |
| var validDirectionCount = 0; |
| for (--i; i > 0; --i) { |
| ctx.restore(); |
| if (ctx.direction == testVector[i - 1].direction) |
| validDirectionCount++; |
| } |
| assert_equals(validDirectionCount, testVectorLength - 1); |
| } |
| |
| function verifyInvalidDirection(direction) |
| { |
| var ctx = document.createElement('canvas').getContext('2d'); |
| var currentDirection = ctx.direction; |
| ctx.direction = direction; |
| assert_equals(ctx.direction, currentDirection); |
| } |
| |
| test(function(t) { |
| |
| var newCanvasElement = document.createElement('canvas'); |
| assert_not_equals(newCanvasElement.getContext('2d').direction, null); |
| |
| var drawTextTests = [ |
| ['DrawTextTest1', 'canvas1', 'Left-to-Right text', 'ltr'], |
| ['DrawTextTest2', 'canvas2', 'Right-to-Left text', 'rtl'], |
| ]; |
| generate_tests(verifyDrawText, drawTextTests); |
| |
| var drawTextWithSpecifiedDirectionTests = [ |
| ['DrawTextWithSpecifiedDirectionTest1', |
| {canvasId: 'canvas3', text: 'Right-to-Left text', direction: 'rtl', expectedDirection: 'rtl'}], |
| ['DrawTextWithSpecifiedDirectionTest2', |
| {canvasId: 'canvas4', text: 'Left-to-Right text', direction: 'ltr', expectedDirection: 'ltr'}], |
| ['DrawTextWithSpecifiedDirectionTest3', |
| {canvasId: 'canvas5', text: 'Left-to-Right text', direction: 'inherit', expectedDirection: 'ltr'}], |
| ['DrawTextWithSpecifiedDirectionTest4', |
| {canvasId: 'canvas6', text: 'Right-to-Left text', direction: 'inherit', expectedDirection: 'rtl'}], |
| ]; |
| generate_tests(verifyDrawTextWithSpecifiedDirection, drawTextWithSpecifiedDirectionTests); |
| |
| var directionAfterResetTests = [ |
| ['DirectionAfterResetTest1', |
| {canvasId: 'canvas7', text: 'Right-to-Left', direction: 'rtl', expectedDirection: 'ltr'}], |
| ['DirectionAfterResetTest2', |
| {canvasId: 'canvas8', text: 'Right-to-Left', direction: 'ltr', expectedDirection: 'rtl'}], |
| ]; |
| generate_tests(verifyDirectionAfterReset, directionAfterResetTests); |
| |
| var directionAfterAttributeChangeTests = [ |
| ['DirectionAfterResetTest3', |
| {canvasId: 'canvas9', text: 'Right-to-Left text', newDirection: 'rtl', forParentElement: true}], |
| ['DirectionAfterResetTest4', |
| {canvasId: 'canvas10', text: 'Left-to-Right text', newDirection: 'ltr', forParentElement: false}], |
| ]; |
| generate_tests(verifyDirectionAfterAttributeChange, directionAfterAttributeChangeTests); |
| |
| verifyDirectionAcrossSaveRestores('canvas11', |
| [{ text: 'Left-to-Right text', direction: 'ltr' }, |
| { text: 'Right-to-Left text', direction: 'rtl' }, |
| { text: 'Right-to-Left text', direction: 'rtl' }, |
| { text: 'Left-to-Right text', direction: 'ltr' }, |
| { text: 'Right-to-Left text', direction: 'rtl' }, |
| { text: 'Right-to-Left text', direction: 'rtl' }]); |
| var invalidDirectionTests = [ |
| ['InvalidDirectionTestRTL', 'RTL'], |
| ['InvalidDirectionTestLTR', 'LTR'], |
| ['InvalidDirectionTestINHERIT', 'INHERIT'], |
| ]; |
| generate_tests(verifyInvalidDirection, invalidDirectionTests); |
| }, "Verify that canvas 2d context supports 'direction' attribute."); |
| </script> |