| Index: Source/core/html/canvas/CanvasRenderingContext2D.cpp
|
| diff --git a/Source/core/html/canvas/CanvasRenderingContext2D.cpp b/Source/core/html/canvas/CanvasRenderingContext2D.cpp
|
| index 1c92df5400c91c95558a8266871c7923bbed128c..625cf00d7e23d9c0c2d17669d5c9f17abf6bbdd5 100644
|
| --- a/Source/core/html/canvas/CanvasRenderingContext2D.cpp
|
| +++ b/Source/core/html/canvas/CanvasRenderingContext2D.cpp
|
| @@ -37,7 +37,6 @@
|
| #include "bindings/v8/ExceptionMessages.h"
|
| #include "bindings/v8/ExceptionState.h"
|
| #include "bindings/v8/ExceptionStatePlaceholder.h"
|
| -#include "core/accessibility/AXObjectCache.h"
|
| #include "core/css/CSSFontSelector.h"
|
| #include "core/css/parser/BisonCSSParser.h"
|
| #include "core/css/StylePropertySet.h"
|
| @@ -168,6 +167,7 @@ void CanvasRenderingContext2D::trace(Visitor* visitor)
|
| #if ENABLE(OILPAN)
|
| visitor->trace(m_stateStack);
|
| visitor->trace(m_fetchedFonts);
|
| + visitor->trace(m_hitRegionManager);
|
| #endif
|
| CanvasRenderingContext::trace(visitor);
|
| }
|
| @@ -1244,6 +1244,8 @@ void CanvasRenderingContext2D::clearRect(float x, float y, float width, float he
|
| context->setCompositeOperation(CompositeSourceOver);
|
| }
|
| context->clearRect(rect);
|
| + if (m_hitRegionManager)
|
| + m_hitRegionManager->removeHitRegionsInRect(rect, state().m_transform);
|
| if (saved)
|
| context->restore();
|
|
|
| @@ -2356,4 +2358,89 @@ void CanvasRenderingContext2D::drawFocusRing(const Path& path)
|
| didDraw(dirtyRect);
|
| }
|
|
|
| +void CanvasRenderingContext2D::addHitRegion(ExceptionState& exceptionState)
|
| +{
|
| + addHitRegion(Dictionary(), exceptionState);
|
| +}
|
| +
|
| +void CanvasRenderingContext2D::addHitRegion(const Dictionary& options, ExceptionState& exceptionState)
|
| +{
|
| + HitRegionOptions passOptions;
|
| +
|
| + options.getWithUndefinedOrNullCheck("id", passOptions.id);
|
| + options.getWithUndefinedOrNullCheck("control", passOptions.control);
|
| + if (passOptions.id.isEmpty() && !passOptions.control) {
|
| + exceptionState.throwDOMException(NotSupportedError, "Both id and control are null.");
|
| + return;
|
| + }
|
| +
|
| + FloatRect clipBounds;
|
| + GraphicsContext* context = drawingContext();
|
| +
|
| + if (m_path.isEmpty() || !context || !state().m_invertibleCTM
|
| + || !context->getTransformedClipBounds(&clipBounds)) {
|
| + exceptionState.throwDOMException(NotSupportedError, "The specified path has no pixels.");
|
| + return;
|
| + }
|
| +
|
| + Path specifiedPath = m_path;
|
| + specifiedPath.transform(state().m_transform);
|
| +
|
| + if (context->isClipMode()) {
|
| + FloatRect specifiedBounds = specifiedPath.boundingRect();
|
| +
|
| + if (!specifiedBounds.intersects(clipBounds)
|
| + || !specifiedPath.intersectPath(context->getCurrentClipPath())
|
| + || specifiedPath.isEmpty()) {
|
| + exceptionState.throwDOMException(NotSupportedError, "The specified path has no pixels.");
|
| + return;
|
| + }
|
| + }
|
| +
|
| + passOptions.path = specifiedPath;
|
| + addHitRegionInternal(passOptions, exceptionState);
|
| +}
|
| +
|
| +void CanvasRenderingContext2D::addHitRegionInternal(const HitRegionOptions& options, ExceptionState& exceptionState)
|
| +{
|
| + if (!m_hitRegionManager)
|
| + m_hitRegionManager = HitRegionManager::create();
|
| +
|
| + // Remove previous region (with id or control)
|
| + m_hitRegionManager->removeHitRegionById(options.id);
|
| + m_hitRegionManager->removeHitRegionByControl(options.control.get());
|
| +
|
| + RefPtrWillBeRawPtr<HitRegion> hitRegion = HitRegion::create(options);
|
| + hitRegion->updateAccessibility(canvas());
|
| + m_hitRegionManager->addHitRegion(hitRegion.release());
|
| +}
|
| +
|
| +void CanvasRenderingContext2D::removeHitRegion(const String& id)
|
| +{
|
| + if (m_hitRegionManager)
|
| + m_hitRegionManager->removeHitRegionById(id);
|
| +}
|
| +
|
| +void CanvasRenderingContext2D::clearHitRegions()
|
| +{
|
| + if (m_hitRegionManager)
|
| + m_hitRegionManager->removeAllHitRegions();
|
| +}
|
| +
|
| +HitRegion* CanvasRenderingContext2D::hitRegionAtPoint(const LayoutPoint& point)
|
| +{
|
| + if (m_hitRegionManager)
|
| + return m_hitRegionManager->getHitRegionAtPoint(point);
|
| +
|
| + return 0;
|
| +}
|
| +
|
| +unsigned CanvasRenderingContext2D::hitRegionsCount() const
|
| +{
|
| + if (m_hitRegionManager)
|
| + return m_hitRegionManager->getHitRegionsCount();
|
| +
|
| + return 0;
|
| +}
|
| +
|
| } // namespace WebCore
|
|
|