parent edba3f5b
default fillRule(nonzero):
PASS clickCanvas(1, 1) is 'nonzero'
PASS clickCanvas(99, 98) is 'nonzero'
PASS clickCanvas(21, 21) is 'nonzero'
PASS clickCanvas(50, 50) is 'nonzero'
fillRule = evenodd:
PASS clickCanvas(1, 1) is 'evenodd'
PASS clickCanvas(99, 98) is 'evenodd'
PASS clickCanvas(21, 21) is null
PASS clickCanvas(50, 50) is null
fillRule = nonzero:
PASS clickCanvas(1, 1) is 'nonzero'
PASS clickCanvas(99, 98) is 'nonzero'
PASS clickCanvas(21, 21) is 'nonzero'
PASS clickCanvas(50, 50) is 'nonzero'
fillRule = null, falls back to default (nonzero):
PASS clickCanvas(1, 1) is 'nonzero'
PASS clickCanvas(99, 98) is 'nonzero'
PASS clickCanvas(21, 21) is 'nonzero'
PASS clickCanvas(50, 50) is 'nonzero'
fillRule = undefined, falls back to default (nonzero):
PASS clickCanvas(1, 1) is 'nonzero'
PASS clickCanvas(99, 98) is 'nonzero'
PASS clickCanvas(21, 21) is 'nonzero'
PASS clickCanvas(50, 50) is 'nonzero'
PASS successfullyParsed is true
TEST COMPLETE
<!DOCTYPE html>
<html>
<head>
<title>Canvas Hit Regions: fillRule test</title>
<script src="../../resources/js-test.js"></script>
</head>
<body>
<canvas id="canvas" width="400" height="400">
</canvas>
<script>
var canvas = document.getElementById("canvas");
var context = canvas.getContext("2d");
function clickCanvas(x, y)
{
if (!window.eventSender)
return "This test requires eventSender";
var result = null;
function listener(event)
{
result = event.region;
}
var rect = canvas.getBoundingClientRect();
canvas.addEventListener("click", listener, false);
eventSender.mouseMoveTo(rect.left + x, rect.top + y);
eventSender.mouseDown();
eventSender.mouseUp();
canvas.removeEventListener("click", listener, false);
return result;
}
context.rect(20, 20, 60, 60);
context.rect(0, 0, 100, 100);
context.addHitRegion({
id : "nonzero"
// default fillRule
});
debug("default fillRule(nonzero):");
shouldBe("clickCanvas(1, 1)", "'nonzero'");
shouldBe("clickCanvas(99, 98)", "'nonzero'");
shouldBe("clickCanvas(21, 21)", "'nonzero'");
shouldBe("clickCanvas(50, 50)", "'nonzero'");
debug("");
context.removeHitRegion("nonzero");
context.addHitRegion({
id : "evenodd",
fillRule : "evenodd"
});
debug("fillRule = evenodd:");
shouldBe("clickCanvas(1, 1)", "'evenodd'");
shouldBe("clickCanvas(99, 98)", "'evenodd'");
shouldBe("clickCanvas(21, 21)", "null");
shouldBe("clickCanvas(50, 50)", "null");
debug("");
context.removeHitRegion("evenodd");
context.addHitRegion({
id : "nonzero",
fillRule : "nonzero"
});
debug("fillRule = nonzero:");
shouldBe("clickCanvas(1, 1)", "'nonzero'");
shouldBe("clickCanvas(99, 98)", "'nonzero'");
shouldBe("clickCanvas(21, 21)", "'nonzero'");
shouldBe("clickCanvas(50, 50)", "'nonzero'");
debug("");
context.removeHitRegion("nonzero");
context.addHitRegion({
id : "nonzero",
fillRule : null
});
debug("fillRule = null, falls back to default (nonzero):");
shouldBe("clickCanvas(1, 1)", "'nonzero'");
shouldBe("clickCanvas(99, 98)", "'nonzero'");
shouldBe("clickCanvas(21, 21)", "'nonzero'");
shouldBe("clickCanvas(50, 50)", "'nonzero'");
debug("");
context.removeHitRegion("nonzero");
context.addHitRegion({
id : "nonzero",
fillRule : undefined
});
debug("fillRule = undefined, falls back to default (nonzero):");
shouldBe("clickCanvas(1, 1)", "'nonzero'");
shouldBe("clickCanvas(99, 98)", "'nonzero'");
shouldBe("clickCanvas(21, 21)", "'nonzero'");
shouldBe("clickCanvas(50, 50)", "'nonzero'");
debug("");
</script>
</body>
</html>
...@@ -2394,6 +2394,14 @@ void CanvasRenderingContext2D::addHitRegion(const Dictionary& options, Exception ...@@ -2394,6 +2394,14 @@ void CanvasRenderingContext2D::addHitRegion(const Dictionary& options, Exception
} }
passOptions.path = specifiedPath; passOptions.path = specifiedPath;
String fillRuleString;
options.getWithUndefinedOrNullCheck("fillRule", fillRuleString);
if (fillRuleString.isEmpty() || fillRuleString != "evenodd")
passOptions.fillRule = RULE_NONZERO;
else
passOptions.fillRule = RULE_EVENODD;
addHitRegionInternal(passOptions, exceptionState); addHitRegionInternal(passOptions, exceptionState);
} }
......
...@@ -14,6 +14,7 @@ HitRegion::HitRegion(const HitRegionOptions& options) ...@@ -14,6 +14,7 @@ HitRegion::HitRegion(const HitRegionOptions& options)
: m_id(options.id) : m_id(options.id)
, m_control(options.control) , m_control(options.control)
, m_path(options.path) , m_path(options.path)
, m_fillRule(options.fillRule)
{ {
} }
...@@ -41,7 +42,7 @@ void HitRegion::updateAccessibility(Element* canvas) ...@@ -41,7 +42,7 @@ void HitRegion::updateAccessibility(Element* canvas)
bool HitRegion::contains(const LayoutPoint& point) const bool HitRegion::contains(const LayoutPoint& point) const
{ {
return m_path.contains(point, RULE_NONZERO); return m_path.contains(point, m_fillRule);
} }
void HitRegion::removePixels(const Path& clearArea) void HitRegion::removePixels(const Path& clearArea)
......
...@@ -24,6 +24,7 @@ public: ...@@ -24,6 +24,7 @@ public:
String id; String id;
RefPtrWillBeMember<Element> control; RefPtrWillBeMember<Element> control;
Path path; Path path;
WindRule fillRule;
}; };
class HitRegion FINAL : public RefCountedWillBeGarbageCollectedFinalized<HitRegion> { class HitRegion FINAL : public RefCountedWillBeGarbageCollectedFinalized<HitRegion> {
...@@ -43,6 +44,7 @@ public: ...@@ -43,6 +44,7 @@ public:
const String& id() const { return m_id; } const String& id() const { return m_id; }
const Path& path() const { return m_path; } const Path& path() const { return m_path; }
Element* control() const { return m_control.get(); } Element* control() const { return m_control.get(); }
WindRule fillRule() const { return m_fillRule; }
void trace(Visitor*); void trace(Visitor*);
...@@ -52,6 +54,7 @@ private: ...@@ -52,6 +54,7 @@ private:
String m_id; String m_id;
RefPtrWillBeMember<Element> m_control; RefPtrWillBeMember<Element> m_control;
Path m_path; Path m_path;
WindRule m_fillRule;
}; };
class HitRegionManager FINAL : public NoBaseWillBeGarbageCollected<HitRegionManager> { class HitRegionManager FINAL : public NoBaseWillBeGarbageCollected<HitRegionManager> {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment