| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc.
All rights reserved. | 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc.
All rights reserved. |
| 3 * Copyright (C) 2008, 2010 Nokia Corporation and/or its subsidiary(-ies) | 3 * Copyright (C) 2008, 2010 Nokia Corporation and/or its subsidiary(-ies) |
| 4 * Copyright (C) 2007 Alp Toker <alp@atoker.com> | 4 * Copyright (C) 2007 Alp Toker <alp@atoker.com> |
| 5 * Copyright (C) 2008 Eric Seidel <eric@webkit.org> | 5 * Copyright (C) 2008 Eric Seidel <eric@webkit.org> |
| 6 * Copyright (C) 2008 Dirk Schulze <krit@webkit.org> | 6 * Copyright (C) 2008 Dirk Schulze <krit@webkit.org> |
| 7 * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved. | 7 * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved. |
| 8 * Copyright (C) 2012, 2013 Intel Corporation. All rights reserved. | 8 * Copyright (C) 2012, 2013 Intel Corporation. All rights reserved. |
| 9 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved. | 9 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved. |
| 10 * | 10 * |
| (...skipping 2263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2274 void CanvasRenderingContext2D::drawFocusIfNeeded(Path2D* path2d, Element* elemen
t) | 2274 void CanvasRenderingContext2D::drawFocusIfNeeded(Path2D* path2d, Element* elemen
t) |
| 2275 { | 2275 { |
| 2276 drawFocusIfNeededInternal(path2d->path(), element); | 2276 drawFocusIfNeededInternal(path2d->path(), element); |
| 2277 } | 2277 } |
| 2278 | 2278 |
| 2279 void CanvasRenderingContext2D::drawFocusIfNeededInternal(const Path& path, Eleme
nt* element) | 2279 void CanvasRenderingContext2D::drawFocusIfNeededInternal(const Path& path, Eleme
nt* element) |
| 2280 { | 2280 { |
| 2281 if (!focusRingCallIsValid(path, element)) | 2281 if (!focusRingCallIsValid(path, element)) |
| 2282 return; | 2282 return; |
| 2283 | 2283 |
| 2284 updateFocusRingAccessibility(path, element); | |
| 2285 // Note: we need to check document->focusedElement() rather than just callin
g | 2284 // Note: we need to check document->focusedElement() rather than just callin
g |
| 2286 // element->focused(), because element->focused() isn't updated until after | 2285 // element->focused(), because element->focused() isn't updated until after |
| 2287 // focus events fire. | 2286 // focus events fire. |
| 2288 if (element->document().focusedElement() == element) | 2287 if (element->document().focusedElement() == element) |
| 2289 drawFocusRing(path); | 2288 drawFocusRing(path); |
| 2290 } | 2289 } |
| 2291 | 2290 |
| 2292 bool CanvasRenderingContext2D::drawCustomFocusRing(Element* element) | 2291 bool CanvasRenderingContext2D::drawCustomFocusRing(Element* element) |
| 2293 { | 2292 { |
| 2294 if (!focusRingCallIsValid(m_path, element)) | 2293 if (!focusRingCallIsValid(m_path, element)) |
| 2295 return false; | 2294 return false; |
| 2296 | 2295 |
| 2297 updateFocusRingAccessibility(m_path, element); | |
| 2298 | |
| 2299 // Return true if the application should draw the focus ring. The spec allow
s us to | 2296 // Return true if the application should draw the focus ring. The spec allow
s us to |
| 2300 // override this for accessibility, but currently Blink doesn't take advanta
ge of this. | 2297 // override this for accessibility, but currently Blink doesn't take advanta
ge of this. |
| 2301 return element->focused(); | 2298 return element->focused(); |
| 2302 } | 2299 } |
| 2303 | 2300 |
| 2304 bool CanvasRenderingContext2D::focusRingCallIsValid(const Path& path, Element* e
lement) | 2301 bool CanvasRenderingContext2D::focusRingCallIsValid(const Path& path, Element* e
lement) |
| 2305 { | 2302 { |
| 2306 ASSERT(element); | 2303 ASSERT(element); |
| 2307 if (!state().m_invertibleCTM) | 2304 if (!state().m_invertibleCTM) |
| 2308 return false; | 2305 return false; |
| 2309 if (path.isEmpty()) | 2306 if (path.isEmpty()) |
| 2310 return false; | 2307 return false; |
| 2311 if (!element->isDescendantOf(canvas())) | 2308 if (!element->isDescendantOf(canvas())) |
| 2312 return false; | 2309 return false; |
| 2313 | 2310 |
| 2314 return true; | 2311 return true; |
| 2315 } | 2312 } |
| 2316 | 2313 |
| 2317 void CanvasRenderingContext2D::updateFocusRingAccessibility(const Path& path, El
ement* element) | |
| 2318 { | |
| 2319 if (!canvas()->renderer()) | |
| 2320 return; | |
| 2321 | |
| 2322 // If accessibility is already enabled in this frame, associate this path's | |
| 2323 // bounding box with the accessible object. Do this even if the element | |
| 2324 // isn't focused because assistive technology might try to explore the objec
t's | |
| 2325 // location before it gets focus. | |
| 2326 if (AXObjectCache* axObjectCache = element->document().existingAXObjectCache
()) { | |
| 2327 if (AXObject* obj = axObjectCache->getOrCreate(element)) { | |
| 2328 // Get the bounding rect and apply transformations. | |
| 2329 FloatRect bounds = path.boundingRect(); | |
| 2330 AffineTransform ctm = state().m_transform; | |
| 2331 FloatRect transformedBounds = ctm.mapRect(bounds); | |
| 2332 LayoutRect elementRect = LayoutRect(transformedBounds); | |
| 2333 | |
| 2334 // Offset by the canvas rect and set the bounds of the accessible el
ement. | |
| 2335 IntRect canvasRect = canvas()->renderer()->absoluteBoundingBoxRect()
; | |
| 2336 elementRect.moveBy(canvasRect.location()); | |
| 2337 obj->setElementRect(elementRect); | |
| 2338 | |
| 2339 // Set the bounds of any ancestor accessible elements, up to the can
vas element, | |
| 2340 // otherwise this element will appear to not be within its parent el
ement. | |
| 2341 obj = obj->parentObject(); | |
| 2342 while (obj && obj->node() != canvas()) { | |
| 2343 obj->setElementRect(elementRect); | |
| 2344 obj = obj->parentObject(); | |
| 2345 } | |
| 2346 } | |
| 2347 } | |
| 2348 } | |
| 2349 | |
| 2350 void CanvasRenderingContext2D::drawFocusRing(const Path& path) | 2314 void CanvasRenderingContext2D::drawFocusRing(const Path& path) |
| 2351 { | 2315 { |
| 2352 GraphicsContext* c = drawingContext(); | 2316 GraphicsContext* c = drawingContext(); |
| 2353 if (!c) | 2317 if (!c) |
| 2354 return; | 2318 return; |
| 2355 | 2319 |
| 2356 // These should match the style defined in html.css. | 2320 // These should match the style defined in html.css. |
| 2357 Color focusRingColor = RenderTheme::theme().focusRingColor(); | 2321 Color focusRingColor = RenderTheme::theme().focusRingColor(); |
| 2358 const int focusRingWidth = 5; | 2322 const int focusRingWidth = 5; |
| 2359 const int focusRingOutline = 0; | 2323 const int focusRingOutline = 0; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2370 c->setAlphaAsFloat(1.0); | 2334 c->setAlphaAsFloat(1.0); |
| 2371 c->clearShadow(); | 2335 c->clearShadow(); |
| 2372 c->setCompositeOperation(CompositeSourceOver, blink::WebBlendModeNormal); | 2336 c->setCompositeOperation(CompositeSourceOver, blink::WebBlendModeNormal); |
| 2373 c->drawFocusRing(path, focusRingWidth, focusRingOutline, focusRingColor); | 2337 c->drawFocusRing(path, focusRingWidth, focusRingOutline, focusRingColor); |
| 2374 c->restore(); | 2338 c->restore(); |
| 2375 | 2339 |
| 2376 didDraw(dirtyRect); | 2340 didDraw(dirtyRect); |
| 2377 } | 2341 } |
| 2378 | 2342 |
| 2379 } // namespace WebCore | 2343 } // namespace WebCore |
| OLD | NEW |