OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2014, Google Inc. All rights reserved. | 2 * Copyright (C) 2014, Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
181 return 0; | 181 return 0; |
182 | 182 |
183 AXID axID = m_widgetObjectMapping.get(widget); | 183 AXID axID = m_widgetObjectMapping.get(widget); |
184 ASSERT(!HashTraits<AXID>::isDeletedValue(axID)); | 184 ASSERT(!HashTraits<AXID>::isDeletedValue(axID)); |
185 if (!axID) | 185 if (!axID) |
186 return 0; | 186 return 0; |
187 | 187 |
188 return m_objects.get(axID); | 188 return m_objects.get(axID); |
189 } | 189 } |
190 | 190 |
191 AXObject* AXObjectCacheImpl::get(RenderObject* renderer) | 191 AXObject* AXObjectCacheImpl::get(LayoutObject* renderer) |
192 { | 192 { |
193 if (!renderer) | 193 if (!renderer) |
194 return 0; | 194 return 0; |
195 | 195 |
196 AXID axID = m_renderObjectMapping.get(renderer); | 196 AXID axID = m_layoutObjectMapping.get(renderer); |
197 ASSERT(!HashTraits<AXID>::isDeletedValue(axID)); | 197 ASSERT(!HashTraits<AXID>::isDeletedValue(axID)); |
198 if (!axID) | 198 if (!axID) |
199 return 0; | 199 return 0; |
200 | 200 |
201 return m_objects.get(axID); | 201 return m_objects.get(axID); |
202 } | 202 } |
203 | 203 |
204 AXObject* AXObjectCacheImpl::get(Node* node) | 204 AXObject* AXObjectCacheImpl::get(Node* node) |
205 { | 205 { |
206 if (!node) | 206 if (!node) |
207 return 0; | 207 return 0; |
208 | 208 |
209 AXID renderID = node->renderer() ? m_renderObjectMapping.get(node->renderer(
)) : 0; | 209 AXID renderID = node->renderer() ? m_layoutObjectMapping.get(node->renderer(
)) : 0; |
210 ASSERT(!HashTraits<AXID>::isDeletedValue(renderID)); | 210 ASSERT(!HashTraits<AXID>::isDeletedValue(renderID)); |
211 | 211 |
212 AXID nodeID = m_nodeObjectMapping.get(node); | 212 AXID nodeID = m_nodeObjectMapping.get(node); |
213 ASSERT(!HashTraits<AXID>::isDeletedValue(nodeID)); | 213 ASSERT(!HashTraits<AXID>::isDeletedValue(nodeID)); |
214 | 214 |
215 if (node->renderer() && nodeID && !renderID) { | 215 if (node->renderer() && nodeID && !renderID) { |
216 // This can happen if an AXNodeObject is created for a node that's not | 216 // This can happen if an AXNodeObject is created for a node that's not |
217 // rendered, but later something changes and it gets a renderer (like if
it's | 217 // rendered, but later something changes and it gets a renderer (like if
it's |
218 // reparented). | 218 // reparented). |
219 remove(nodeID); | 219 remove(nodeID); |
(...skipping 25 matching lines...) Expand all Loading... |
245 // FIXME: This probably belongs on Node. | 245 // FIXME: This probably belongs on Node. |
246 // FIXME: This should take a const char*, but one caller passes nullAtom. | 246 // FIXME: This should take a const char*, but one caller passes nullAtom. |
247 bool nodeHasRole(Node* node, const String& role) | 247 bool nodeHasRole(Node* node, const String& role) |
248 { | 248 { |
249 if (!node || !node->isElementNode()) | 249 if (!node || !node->isElementNode()) |
250 return false; | 250 return false; |
251 | 251 |
252 return equalIgnoringCase(toElement(node)->getAttribute(roleAttr), role); | 252 return equalIgnoringCase(toElement(node)->getAttribute(roleAttr), role); |
253 } | 253 } |
254 | 254 |
255 PassRefPtr<AXObject> AXObjectCacheImpl::createFromRenderer(RenderObject* rendere
r) | 255 PassRefPtr<AXObject> AXObjectCacheImpl::createFromRenderer(LayoutObject* rendere
r) |
256 { | 256 { |
257 // FIXME: How could renderer->node() ever not be an Element? | 257 // FIXME: How could renderer->node() ever not be an Element? |
258 Node* node = renderer->node(); | 258 Node* node = renderer->node(); |
259 | 259 |
260 // If the node is aria role="list" or the aria role is empty and its a | 260 // If the node is aria role="list" or the aria role is empty and its a |
261 // ul/ol/dl type (it shouldn't be a list if aria says otherwise). | 261 // ul/ol/dl type (it shouldn't be a list if aria says otherwise). |
262 if (node && ((nodeHasRole(node, "list") || nodeHasRole(node, "directory")) | 262 if (node && ((nodeHasRole(node, "list") || nodeHasRole(node, "directory")) |
263 || (nodeHasRole(node, nullAtom) && (isHTMLUListElement(*node) || isHTMLO
ListElement(*node) || isHTMLDListElement(*node))))) | 263 || (nodeHasRole(node, nullAtom) && (isHTMLUListElement(*node) || isHTMLO
ListElement(*node) || isHTMLDListElement(*node))))) |
264 return AXList::create(renderer, this); | 264 return AXList::create(renderer, this); |
265 | 265 |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
377 getAXID(newObj.get()); | 377 getAXID(newObj.get()); |
378 | 378 |
379 m_nodeObjectMapping.set(node, newObj->axObjectID()); | 379 m_nodeObjectMapping.set(node, newObj->axObjectID()); |
380 m_objects.set(newObj->axObjectID(), newObj); | 380 m_objects.set(newObj->axObjectID(), newObj); |
381 newObj->init(); | 381 newObj->init(); |
382 newObj->setLastKnownIsIgnoredValue(newObj->accessibilityIsIgnored()); | 382 newObj->setLastKnownIsIgnoredValue(newObj->accessibilityIsIgnored()); |
383 | 383 |
384 return newObj.get(); | 384 return newObj.get(); |
385 } | 385 } |
386 | 386 |
387 AXObject* AXObjectCacheImpl::getOrCreate(RenderObject* renderer) | 387 AXObject* AXObjectCacheImpl::getOrCreate(LayoutObject* renderer) |
388 { | 388 { |
389 if (!renderer) | 389 if (!renderer) |
390 return 0; | 390 return 0; |
391 | 391 |
392 if (AXObject* obj = get(renderer)) | 392 if (AXObject* obj = get(renderer)) |
393 return obj; | 393 return obj; |
394 | 394 |
395 RefPtr<AXObject> newObj = createFromRenderer(renderer); | 395 RefPtr<AXObject> newObj = createFromRenderer(renderer); |
396 | 396 |
397 // Will crash later if we have two objects for the same renderer. | 397 // Will crash later if we have two objects for the same renderer. |
398 ASSERT(!get(renderer)); | 398 ASSERT(!get(renderer)); |
399 | 399 |
400 getAXID(newObj.get()); | 400 getAXID(newObj.get()); |
401 | 401 |
402 m_renderObjectMapping.set(renderer, newObj->axObjectID()); | 402 m_layoutObjectMapping.set(renderer, newObj->axObjectID()); |
403 m_objects.set(newObj->axObjectID(), newObj); | 403 m_objects.set(newObj->axObjectID(), newObj); |
404 newObj->init(); | 404 newObj->init(); |
405 newObj->setLastKnownIsIgnoredValue(newObj->accessibilityIsIgnored()); | 405 newObj->setLastKnownIsIgnoredValue(newObj->accessibilityIsIgnored()); |
406 | 406 |
407 return newObj.get(); | 407 return newObj.get(); |
408 } | 408 } |
409 | 409 |
410 AXObject* AXObjectCacheImpl::getOrCreate(AbstractInlineTextBox* inlineTextBox) | 410 AXObject* AXObjectCacheImpl::getOrCreate(AbstractInlineTextBox* inlineTextBox) |
411 { | 411 { |
412 if (!inlineTextBox) | 412 if (!inlineTextBox) |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
495 obj->detach(); | 495 obj->detach(); |
496 removeAXID(obj); | 496 removeAXID(obj); |
497 | 497 |
498 // finally remove the object | 498 // finally remove the object |
499 if (!m_objects.take(axID)) | 499 if (!m_objects.take(axID)) |
500 return; | 500 return; |
501 | 501 |
502 ASSERT(m_objects.size() >= m_idsInUse.size()); | 502 ASSERT(m_objects.size() >= m_idsInUse.size()); |
503 } | 503 } |
504 | 504 |
505 void AXObjectCacheImpl::remove(RenderObject* renderer) | 505 void AXObjectCacheImpl::remove(LayoutObject* renderer) |
506 { | 506 { |
507 if (!renderer) | 507 if (!renderer) |
508 return; | 508 return; |
509 | 509 |
510 AXID axID = m_renderObjectMapping.get(renderer); | 510 AXID axID = m_layoutObjectMapping.get(renderer); |
511 remove(axID); | 511 remove(axID); |
512 m_renderObjectMapping.remove(renderer); | 512 m_layoutObjectMapping.remove(renderer); |
513 } | 513 } |
514 | 514 |
515 void AXObjectCacheImpl::remove(Node* node) | 515 void AXObjectCacheImpl::remove(Node* node) |
516 { | 516 { |
517 if (!node) | 517 if (!node) |
518 return; | 518 return; |
519 | 519 |
520 removeNodeForUse(node); | 520 removeNodeForUse(node); |
521 | 521 |
522 // This is all safe even if we didn't have a mapping. | 522 // This is all safe even if we didn't have a mapping. |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
628 } | 628 } |
629 node = node->parentNode(); | 629 node = node->parentNode(); |
630 } | 630 } |
631 } | 631 } |
632 | 632 |
633 void AXObjectCacheImpl::textChanged(Node* node) | 633 void AXObjectCacheImpl::textChanged(Node* node) |
634 { | 634 { |
635 textChanged(getOrCreate(node)); | 635 textChanged(getOrCreate(node)); |
636 } | 636 } |
637 | 637 |
638 void AXObjectCacheImpl::textChanged(RenderObject* renderer) | 638 void AXObjectCacheImpl::textChanged(LayoutObject* renderer) |
639 { | 639 { |
640 textChanged(getOrCreate(renderer)); | 640 textChanged(getOrCreate(renderer)); |
641 } | 641 } |
642 | 642 |
643 void AXObjectCacheImpl::textChanged(AXObject* obj) | 643 void AXObjectCacheImpl::textChanged(AXObject* obj) |
644 { | 644 { |
645 if (!obj) | 645 if (!obj) |
646 return; | 646 return; |
647 | 647 |
648 bool parentAlreadyExists = obj->parentObjectIfExists(); | 648 bool parentAlreadyExists = obj->parentObjectIfExists(); |
649 obj->textChanged(); | 649 obj->textChanged(); |
650 postNotification(obj, obj->document(), AXObjectCacheImpl::AXTextChanged, tru
e); | 650 postNotification(obj, obj->document(), AXObjectCacheImpl::AXTextChanged, tru
e); |
651 if (parentAlreadyExists) | 651 if (parentAlreadyExists) |
652 obj->notifyIfIgnoredValueChanged(); | 652 obj->notifyIfIgnoredValueChanged(); |
653 } | 653 } |
654 | 654 |
655 void AXObjectCacheImpl::updateCacheAfterNodeIsAttached(Node* node) | 655 void AXObjectCacheImpl::updateCacheAfterNodeIsAttached(Node* node) |
656 { | 656 { |
657 // Calling get() will update the AX object if we had an AXNodeObject but now
we need | 657 // Calling get() will update the AX object if we had an AXNodeObject but now
we need |
658 // an AXRenderObject, because it was reparented to a location outside of a c
anvas. | 658 // an AXRenderObject, because it was reparented to a location outside of a c
anvas. |
659 get(node); | 659 get(node); |
660 } | 660 } |
661 | 661 |
662 void AXObjectCacheImpl::childrenChanged(Node* node) | 662 void AXObjectCacheImpl::childrenChanged(Node* node) |
663 { | 663 { |
664 childrenChanged(get(node)); | 664 childrenChanged(get(node)); |
665 } | 665 } |
666 | 666 |
667 void AXObjectCacheImpl::childrenChanged(RenderObject* renderer) | 667 void AXObjectCacheImpl::childrenChanged(LayoutObject* renderer) |
668 { | 668 { |
669 childrenChanged(get(renderer)); | 669 childrenChanged(get(renderer)); |
670 } | 670 } |
671 | 671 |
672 void AXObjectCacheImpl::childrenChanged(AXObject* obj) | 672 void AXObjectCacheImpl::childrenChanged(AXObject* obj) |
673 { | 673 { |
674 if (!obj) | 674 if (!obj) |
675 return; | 675 return; |
676 | 676 |
677 obj->childrenChanged(); | 677 obj->childrenChanged(); |
(...skipping 12 matching lines...) Expand all Loading... |
690 continue; | 690 continue; |
691 | 691 |
692 if (!obj->axObjectCache()) | 692 if (!obj->axObjectCache()) |
693 continue; | 693 continue; |
694 | 694 |
695 #if ENABLE(ASSERT) | 695 #if ENABLE(ASSERT) |
696 // Make sure none of the render views are in the process of being layed
out. | 696 // Make sure none of the render views are in the process of being layed
out. |
697 // Notifications should only be sent after the renderer has finished | 697 // Notifications should only be sent after the renderer has finished |
698 if (obj->isAXRenderObject()) { | 698 if (obj->isAXRenderObject()) { |
699 AXRenderObject* renderObj = toAXRenderObject(obj); | 699 AXRenderObject* renderObj = toAXRenderObject(obj); |
700 RenderObject* renderer = renderObj->renderer(); | 700 LayoutObject* renderer = renderObj->renderer(); |
701 if (renderer && renderer->view()) | 701 if (renderer && renderer->view()) |
702 ASSERT(!renderer->view()->layoutState()); | 702 ASSERT(!renderer->view()->layoutState()); |
703 } | 703 } |
704 #endif | 704 #endif |
705 | 705 |
706 AXNotification notification = m_notificationsToPost[i].second; | 706 AXNotification notification = m_notificationsToPost[i].second; |
707 postPlatformNotification(obj, notification); | 707 postPlatformNotification(obj, notification); |
708 | 708 |
709 if (notification == AXChildrenChanged && obj->parentObjectIfExists() &&
obj->lastKnownIsIgnoredValue() != obj->accessibilityIsIgnored()) | 709 if (notification == AXChildrenChanged && obj->parentObjectIfExists() &&
obj->lastKnownIsIgnoredValue() != obj->accessibilityIsIgnored()) |
710 childrenChanged(obj->parentObject()); | 710 childrenChanged(obj->parentObject()); |
711 } | 711 } |
712 | 712 |
713 m_notificationsToPost.clear(); | 713 m_notificationsToPost.clear(); |
714 } | 714 } |
715 | 715 |
716 void AXObjectCacheImpl::postNotification(RenderObject* renderer, AXNotification
notification, bool postToElement) | 716 void AXObjectCacheImpl::postNotification(LayoutObject* renderer, AXNotification
notification, bool postToElement) |
717 { | 717 { |
718 if (!renderer) | 718 if (!renderer) |
719 return; | 719 return; |
720 | 720 |
721 m_modificationCount++; | 721 m_modificationCount++; |
722 | 722 |
723 // Get an accessibility object that already exists. One should not be create
d here | 723 // Get an accessibility object that already exists. One should not be create
d here |
724 // because a render update may be in progress and creating an AX object can
re-trigger a layout | 724 // because a render update may be in progress and creating an AX object can
re-trigger a layout |
725 RefPtr<AXObject> object = get(renderer); | 725 RefPtr<AXObject> object = get(renderer); |
726 while (!object && renderer) { | 726 while (!object && renderer) { |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
778 postNotification(node, AXObjectCacheImpl::AXCheckedStateChanged, true); | 778 postNotification(node, AXObjectCacheImpl::AXCheckedStateChanged, true); |
779 } | 779 } |
780 | 780 |
781 void AXObjectCacheImpl::selectedChildrenChanged(Node* node) | 781 void AXObjectCacheImpl::selectedChildrenChanged(Node* node) |
782 { | 782 { |
783 // postToElement is false so that you can pass in any child of an element an
d it will go up the parent tree | 783 // postToElement is false so that you can pass in any child of an element an
d it will go up the parent tree |
784 // to find the container which should send out the notification. | 784 // to find the container which should send out the notification. |
785 postNotification(node, AXSelectedChildrenChanged, false); | 785 postNotification(node, AXSelectedChildrenChanged, false); |
786 } | 786 } |
787 | 787 |
788 void AXObjectCacheImpl::selectedChildrenChanged(RenderObject* renderer) | 788 void AXObjectCacheImpl::selectedChildrenChanged(LayoutObject* renderer) |
789 { | 789 { |
790 // postToElement is false so that you can pass in any child of an element an
d it will go up the parent tree | 790 // postToElement is false so that you can pass in any child of an element an
d it will go up the parent tree |
791 // to find the container which should send out the notification. | 791 // to find the container which should send out the notification. |
792 postNotification(renderer, AXSelectedChildrenChanged, false); | 792 postNotification(renderer, AXSelectedChildrenChanged, false); |
793 } | 793 } |
794 | 794 |
795 void AXObjectCacheImpl::handleScrollbarUpdate(FrameView* view) | 795 void AXObjectCacheImpl::handleScrollbarUpdate(FrameView* view) |
796 { | 796 { |
797 if (!view) | 797 if (!view) |
798 return; | 798 return; |
799 | 799 |
800 // We don't want to create a scroll view from this method, only update an ex
isting one. | 800 // We don't want to create a scroll view from this method, only update an ex
isting one. |
801 if (AXObject* scrollViewObject = get(view)) { | 801 if (AXObject* scrollViewObject = get(view)) { |
802 m_modificationCount++; | 802 m_modificationCount++; |
803 scrollViewObject->updateChildrenIfNecessary(); | 803 scrollViewObject->updateChildrenIfNecessary(); |
804 } | 804 } |
805 } | 805 } |
806 | 806 |
807 void AXObjectCacheImpl::handleLayoutComplete(RenderObject* renderer) | 807 void AXObjectCacheImpl::handleLayoutComplete(LayoutObject* renderer) |
808 { | 808 { |
809 if (!renderer) | 809 if (!renderer) |
810 return; | 810 return; |
811 | 811 |
812 m_modificationCount++; | 812 m_modificationCount++; |
813 | 813 |
814 // Create the AXObject if it didn't yet exist - that's always safe at the en
d of a layout, and it | 814 // Create the AXObject if it didn't yet exist - that's always safe at the en
d of a layout, and it |
815 // allows an AX notification to be sent when a page has its first layout, ra
ther than when the | 815 // allows an AX notification to be sent when a page has its first layout, ra
ther than when the |
816 // document first loads. | 816 // document first loads. |
817 if (AXObject* obj = getOrCreate(renderer)) | 817 if (AXObject* obj = getOrCreate(renderer)) |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
869 postNotification(element, AXObjectCacheImpl::AXInvalidStatusChanged, tru
e); | 869 postNotification(element, AXObjectCacheImpl::AXInvalidStatusChanged, tru
e); |
870 else | 870 else |
871 postNotification(element, AXObjectCacheImpl::AXAriaAttributeChanged, tru
e); | 871 postNotification(element, AXObjectCacheImpl::AXAriaAttributeChanged, tru
e); |
872 } | 872 } |
873 | 873 |
874 void AXObjectCacheImpl::labelChanged(Element* element) | 874 void AXObjectCacheImpl::labelChanged(Element* element) |
875 { | 875 { |
876 textChanged(toHTMLLabelElement(element)->control()); | 876 textChanged(toHTMLLabelElement(element)->control()); |
877 } | 877 } |
878 | 878 |
879 void AXObjectCacheImpl::recomputeIsIgnored(RenderObject* renderer) | 879 void AXObjectCacheImpl::recomputeIsIgnored(LayoutObject* renderer) |
880 { | 880 { |
881 if (AXObject* obj = get(renderer)) | 881 if (AXObject* obj = get(renderer)) |
882 obj->notifyIfIgnoredValueChanged(); | 882 obj->notifyIfIgnoredValueChanged(); |
883 } | 883 } |
884 | 884 |
885 void AXObjectCacheImpl::inlineTextBoxesUpdated(RenderObject* renderer) | 885 void AXObjectCacheImpl::inlineTextBoxesUpdated(LayoutObject* renderer) |
886 { | 886 { |
887 if (!inlineTextBoxAccessibilityEnabled()) | 887 if (!inlineTextBoxAccessibilityEnabled()) |
888 return; | 888 return; |
889 | 889 |
890 // Only update if the accessibility object already exists and it's | 890 // Only update if the accessibility object already exists and it's |
891 // not already marked as dirty. | 891 // not already marked as dirty. |
892 if (AXObject* obj = get(renderer)) { | 892 if (AXObject* obj = get(renderer)) { |
893 if (!obj->needsToUpdateChildren()) { | 893 if (!obj->needsToUpdateChildren()) { |
894 obj->setNeedsToUpdateChildren(); | 894 obj->setNeedsToUpdateChildren(); |
895 postNotification(renderer, AXChildrenChanged, true); | 895 postNotification(renderer, AXChildrenChanged, true); |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1062 | 1062 |
1063 void AXObjectCacheImpl::handleScrollPositionChanged(FrameView* frameView) | 1063 void AXObjectCacheImpl::handleScrollPositionChanged(FrameView* frameView) |
1064 { | 1064 { |
1065 // Prefer to fire the scroll position changed event on the frame view's chil
d web area, if possible. | 1065 // Prefer to fire the scroll position changed event on the frame view's chil
d web area, if possible. |
1066 AXObject* targetAXObject = getOrCreate(frameView); | 1066 AXObject* targetAXObject = getOrCreate(frameView); |
1067 if (targetAXObject && !targetAXObject->children().isEmpty()) | 1067 if (targetAXObject && !targetAXObject->children().isEmpty()) |
1068 targetAXObject = targetAXObject->children()[0].get(); | 1068 targetAXObject = targetAXObject->children()[0].get(); |
1069 postPlatformNotification(targetAXObject, AXScrollPositionChanged); | 1069 postPlatformNotification(targetAXObject, AXScrollPositionChanged); |
1070 } | 1070 } |
1071 | 1071 |
1072 void AXObjectCacheImpl::handleScrollPositionChanged(RenderObject* renderObject) | 1072 void AXObjectCacheImpl::handleScrollPositionChanged(LayoutObject* layoutObject) |
1073 { | 1073 { |
1074 postPlatformNotification(getOrCreate(renderObject), AXScrollPositionChanged)
; | 1074 postPlatformNotification(getOrCreate(layoutObject), AXScrollPositionChanged)
; |
1075 } | 1075 } |
1076 | 1076 |
1077 const AtomicString& AXObjectCacheImpl::computedRoleForNode(Node* node) | 1077 const AtomicString& AXObjectCacheImpl::computedRoleForNode(Node* node) |
1078 { | 1078 { |
1079 AXObject* obj = getOrCreate(node); | 1079 AXObject* obj = getOrCreate(node); |
1080 if (!obj) | 1080 if (!obj) |
1081 return AXObject::roleName(UnknownRole); | 1081 return AXObject::roleName(UnknownRole); |
1082 return AXObject::roleName(obj->roleValue()); | 1082 return AXObject::roleName(obj->roleValue()); |
1083 } | 1083 } |
1084 | 1084 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1121 void AXObjectCacheImpl::setCanvasObjectBounds(Element* element, const LayoutRect
& rect) | 1121 void AXObjectCacheImpl::setCanvasObjectBounds(Element* element, const LayoutRect
& rect) |
1122 { | 1122 { |
1123 AXObject* obj = getOrCreate(element); | 1123 AXObject* obj = getOrCreate(element); |
1124 if (!obj) | 1124 if (!obj) |
1125 return; | 1125 return; |
1126 | 1126 |
1127 obj->setElementRect(rect); | 1127 obj->setElementRect(rect); |
1128 } | 1128 } |
1129 | 1129 |
1130 } // namespace blink | 1130 } // namespace blink |
OLD | NEW |