b920e4ec4fa0aaab78931d7eb79b83eb143e6e84
[WebKit-https.git] / Source / WebKit / chromium / src / WebAccessibilityObject.cpp
1 /*
2  * Copyright (C) 2009 Google Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
8  *     * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *     * Redistributions in binary form must reproduce the above
11  * copyright notice, this list of conditions and the following disclaimer
12  * in the documentation and/or other materials provided with the
13  * distribution.
14  *     * Neither the name of Google Inc. nor the names of its
15  * contributors may be used to endorse or promote products derived from
16  * this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30
31 #include "config.h"
32 #include "WebAccessibilityObject.h"
33
34 #include "AXObjectCache.h"
35 #include "AccessibilityObject.h"
36 #include "AccessibilityTable.h"
37 #include "AccessibilityTableCell.h"
38 #include "CSSPrimitiveValueMappings.h"
39 #include "Document.h"
40 #include "EventHandler.h"
41 #include "FrameView.h"
42 #include "HTMLNames.h"
43 #include "Node.h"
44 #include "PlatformKeyboardEvent.h"
45 #include "RenderStyle.h"
46 #include "WebDocument.h"
47 #include "WebNode.h"
48 #include <public/WebPoint.h>
49 #include <public/WebRect.h>
50 #include <public/WebString.h>
51 #include <public/WebURL.h>
52 #include <wtf/text/StringBuilder.h>
53
54 using namespace WebCore;
55
56 namespace WebKit {
57
58 void WebAccessibilityObject::reset()
59 {
60     m_private.reset();
61 }
62
63 void WebAccessibilityObject::assign(const WebKit::WebAccessibilityObject& other)
64 {
65     m_private = other.m_private;
66 }
67
68 bool WebAccessibilityObject::equals(const WebAccessibilityObject& n) const
69 {
70     return (m_private.get() == n.m_private.get());
71 }
72
73 // static
74 void WebAccessibilityObject::enableAccessibility()
75 {
76     AXObjectCache::enableAccessibility();
77 }
78
79 // static
80 bool WebAccessibilityObject::accessibilityEnabled()
81 {
82     return AXObjectCache::accessibilityEnabled();
83 }
84
85 bool WebAccessibilityObject::isDetached() const
86 {
87     if (m_private.isNull())
88         return true;
89
90     return m_private->isDetached();
91 }
92
93 int WebAccessibilityObject::axID() const
94 {
95     if (isDetached())
96         return -1;
97
98     return m_private->axObjectID();
99 }
100
101 bool WebAccessibilityObject::updateBackingStoreAndCheckValidity()
102 {
103     if (!isDetached())
104         m_private->updateBackingStore();
105     return !isDetached();
106 }
107
108 WebString WebAccessibilityObject::accessibilityDescription() const
109 {
110     if (isDetached())
111         return WebString();
112
113     return m_private->accessibilityDescription();
114 }
115
116 WebString WebAccessibilityObject::actionVerb() const
117 {
118     if (isDetached())
119         return WebString();
120
121     return m_private->actionVerb();
122 }
123
124 bool WebAccessibilityObject::canDecrement() const
125 {
126     if (isDetached())
127         return false;
128
129     return m_private->isSlider();
130 }
131
132 bool WebAccessibilityObject::canIncrement() const
133 {
134     if (isDetached())
135         return false;
136
137     return m_private->isSlider();
138 }
139
140 bool WebAccessibilityObject::canPress() const
141 {
142     if (isDetached())
143         return false;
144
145     return m_private->actionElement() || m_private->isButton() || m_private->isMenuRelated();
146 }
147
148 bool WebAccessibilityObject::canSetFocusAttribute() const
149 {
150     if (isDetached())
151         return false;
152
153     return m_private->canSetFocusAttribute();
154 }
155
156 bool WebAccessibilityObject::canSetValueAttribute() const
157 {
158     if (isDetached())
159         return false;
160
161     return m_private->canSetValueAttribute();
162 }
163
164 unsigned WebAccessibilityObject::childCount() const
165 {
166     if (isDetached())
167         return 0;
168
169     return m_private->children().size();
170 }
171
172 WebAccessibilityObject WebAccessibilityObject::childAt(unsigned index) const
173 {
174     if (isDetached())
175         return WebAccessibilityObject();
176
177     if (m_private->children().size() <= index)
178         return WebAccessibilityObject();
179
180     return WebAccessibilityObject(m_private->children()[index]);
181 }
182
183 WebAccessibilityObject WebAccessibilityObject::firstChild() const
184 {
185     if (isDetached())
186         return WebAccessibilityObject();
187
188     return WebAccessibilityObject(m_private->firstChild());
189 }
190
191 WebAccessibilityObject WebAccessibilityObject::focusedChild() const
192 {
193     if (isDetached())
194         return WebAccessibilityObject();
195
196     RefPtr<AccessibilityObject> focused = m_private->focusedUIElement();
197     if (m_private.get() == focused.get() || m_private.get() == focused->parentObject())
198         return WebAccessibilityObject(focused);
199
200     return WebAccessibilityObject();
201 }
202
203 WebAccessibilityObject WebAccessibilityObject::lastChild() const
204 {
205     if (isDetached())
206         return WebAccessibilityObject();
207
208     return WebAccessibilityObject(m_private->lastChild());
209 }
210
211
212 WebAccessibilityObject WebAccessibilityObject::nextSibling() const
213 {
214     if (isDetached())
215         return WebAccessibilityObject();
216
217     return WebAccessibilityObject(m_private->nextSibling());
218 }
219
220 WebAccessibilityObject WebAccessibilityObject::parentObject() const
221 {
222     if (isDetached())
223         return WebAccessibilityObject();
224
225     return WebAccessibilityObject(m_private->parentObject());
226 }
227
228
229 WebAccessibilityObject WebAccessibilityObject::previousSibling() const
230 {
231     if (isDetached())
232         return WebAccessibilityObject();
233
234     return WebAccessibilityObject(m_private->previousSibling());
235 }
236
237 bool WebAccessibilityObject::canSetSelectedAttribute() const
238 {
239     if (isDetached())
240         return 0;
241
242     return m_private->canSetSelectedAttribute();
243 }
244
245 bool WebAccessibilityObject::isAnchor() const
246 {
247     if (isDetached())
248         return 0;
249
250     return m_private->isAnchor();
251 }
252
253 bool WebAccessibilityObject::isAriaReadOnly() const
254 {
255     if (isDetached())
256         return 0;
257
258     return equalIgnoringCase(m_private->getAttribute(HTMLNames::aria_readonlyAttr), "true");
259 }
260
261 bool WebAccessibilityObject::isButtonStateMixed() const
262 {
263     if (isDetached())
264         return 0;
265
266     return m_private->checkboxOrRadioValue() == ButtonStateMixed;
267 }
268
269 bool WebAccessibilityObject::isChecked() const
270 {
271     if (isDetached())
272         return 0;
273
274     return m_private->isChecked();
275 }
276
277 bool WebAccessibilityObject::isCollapsed() const
278 {
279     if (isDetached())
280         return 0;
281
282     return m_private->isCollapsed();
283 }
284
285 bool WebAccessibilityObject::isControl() const
286 {
287     if (isDetached())
288         return 0;
289
290     return m_private->isControl();
291 }
292
293 bool WebAccessibilityObject::isEnabled() const
294 {
295     if (isDetached())
296         return 0;
297
298     return m_private->isEnabled();
299 }
300
301 bool WebAccessibilityObject::isFocused() const
302 {
303     if (isDetached())
304         return 0;
305
306     return m_private->isFocused();
307 }
308
309 bool WebAccessibilityObject::isHovered() const
310 {
311     if (isDetached())
312         return 0;
313
314     return m_private->isHovered();
315 }
316
317 bool WebAccessibilityObject::isIndeterminate() const
318 {
319     if (isDetached())
320         return 0;
321
322     return m_private->isIndeterminate();
323 }
324
325 bool WebAccessibilityObject::isLinked() const
326 {
327     if (isDetached())
328         return 0;
329
330     return m_private->isLinked();
331 }
332
333 bool WebAccessibilityObject::isLoaded() const
334 {
335     if (isDetached())
336         return 0;
337
338     return m_private->isLoaded();
339 }
340
341 bool WebAccessibilityObject::isMultiSelectable() const
342 {
343     if (isDetached())
344         return 0;
345
346     return m_private->isMultiSelectable();
347 }
348
349 bool WebAccessibilityObject::isOffScreen() const
350 {
351     if (isDetached())
352         return 0;
353
354     return m_private->isOffScreen();
355 }
356
357 bool WebAccessibilityObject::isPasswordField() const
358 {
359     if (isDetached())
360         return 0;
361
362     return m_private->isPasswordField();
363 }
364
365 bool WebAccessibilityObject::isPressed() const
366 {
367     if (isDetached())
368         return 0;
369
370     return m_private->isPressed();
371 }
372
373 bool WebAccessibilityObject::isReadOnly() const
374 {
375     if (isDetached())
376         return 0;
377
378     return m_private->isReadOnly();
379 }
380
381 bool WebAccessibilityObject::isRequired() const
382 {
383     if (isDetached())
384         return 0;
385
386     return m_private->isRequired();
387 }
388
389 bool WebAccessibilityObject::isSelected() const
390 {
391     if (isDetached())
392         return 0;
393
394     return m_private->isSelected();
395 }
396
397 bool WebAccessibilityObject::isSelectedOptionActive() const
398 {
399     if (isDetached())
400         return false;
401
402     return m_private->isSelectedOptionActive();
403 }
404
405 bool WebAccessibilityObject::isVertical() const
406 {
407     if (isDetached())
408         return 0;
409
410     return m_private->orientation() == AccessibilityOrientationVertical;
411 }
412
413 bool WebAccessibilityObject::isVisible() const
414 {
415     if (isDetached())
416         return 0;
417
418     return m_private->isVisible();
419 }
420
421 bool WebAccessibilityObject::isVisited() const
422 {
423     if (isDetached())
424         return 0;
425
426     return m_private->isVisited();
427 }
428
429 WebString WebAccessibilityObject::accessKey() const
430 {
431     if (isDetached())
432         return WebString();
433
434     return WebString(m_private->accessKey());
435 }
436
437 bool WebAccessibilityObject::ariaHasPopup() const
438 {
439     if (isDetached())
440         return 0;
441
442     return m_private->ariaHasPopup();
443 }
444
445 bool WebAccessibilityObject::ariaLiveRegionAtomic() const
446 {
447     if (isDetached())
448         return 0;
449
450     return m_private->ariaLiveRegionAtomic();
451 }
452
453 bool WebAccessibilityObject::ariaLiveRegionBusy() const
454 {
455     if (isDetached())
456         return 0;
457
458     return m_private->ariaLiveRegionBusy();
459 }
460
461 WebString WebAccessibilityObject::ariaLiveRegionRelevant() const
462 {
463     if (isDetached())
464         return WebString();
465
466     return m_private->ariaLiveRegionRelevant();
467 }
468
469 WebString WebAccessibilityObject::ariaLiveRegionStatus() const
470 {
471     if (isDetached())
472         return WebString();
473
474     return m_private->ariaLiveRegionStatus();
475 }
476
477 WebRect WebAccessibilityObject::boundingBoxRect() const
478 {
479     if (isDetached())
480         return WebRect();
481
482     return m_private->pixelSnappedBoundingBoxRect();
483 }
484
485 bool WebAccessibilityObject::canvasHasFallbackContent() const
486 {
487     if (isDetached())
488         return false;
489
490     return m_private->canvasHasFallbackContent();
491 }
492
493 WebPoint WebAccessibilityObject::clickPoint() const
494 {
495     if (isDetached())
496         return WebPoint();
497
498     return WebPoint(m_private->clickPoint());
499 }
500
501 double WebAccessibilityObject::estimatedLoadingProgress() const
502 {
503     if (isDetached())
504         return 0.0;
505
506     return m_private->estimatedLoadingProgress();
507 }
508
509 WebString WebAccessibilityObject::helpText() const
510 {
511     if (isDetached())
512         return WebString();
513
514     return m_private->helpText();
515 }
516
517 int WebAccessibilityObject::headingLevel() const
518 {
519     if (isDetached())
520         return 0;
521
522     return m_private->headingLevel();
523 }
524
525 int WebAccessibilityObject::hierarchicalLevel() const
526 {
527     if (isDetached())
528         return 0;
529
530     return m_private->hierarchicalLevel();
531 }
532
533 WebAccessibilityObject WebAccessibilityObject::hitTest(const WebPoint& point) const
534 {
535     if (isDetached())
536         return WebAccessibilityObject();
537
538     IntPoint contentsPoint = m_private->documentFrameView()->windowToContents(point);
539     RefPtr<AccessibilityObject> hit = m_private->accessibilityHitTest(contentsPoint);
540
541     if (hit)
542         return WebAccessibilityObject(hit);
543
544     if (m_private->boundingBoxRect().contains(contentsPoint))
545         return *this;
546
547     return WebAccessibilityObject();
548 }
549
550 WebString WebAccessibilityObject::keyboardShortcut() const
551 {
552     if (isDetached())
553         return WebString();
554
555     String accessKey = m_private->accessKey();
556     if (accessKey.isNull())
557         return WebString();
558
559     DEFINE_STATIC_LOCAL(String, modifierString, ());
560     if (modifierString.isNull()) {
561         unsigned modifiers = EventHandler::accessKeyModifiers();
562         // Follow the same order as Mozilla MSAA implementation:
563         // Ctrl+Alt+Shift+Meta+key. MSDN states that keyboard shortcut strings
564         // should not be localized and defines the separator as "+".
565         StringBuilder modifierStringBuilder;
566         if (modifiers & PlatformEvent::CtrlKey)
567             modifierStringBuilder.appendLiteral("Ctrl+");
568         if (modifiers & PlatformEvent::AltKey)
569             modifierStringBuilder.appendLiteral("Alt+");
570         if (modifiers & PlatformEvent::ShiftKey)
571             modifierStringBuilder.appendLiteral("Shift+");
572         if (modifiers & PlatformEvent::MetaKey)
573             modifierStringBuilder.appendLiteral("Win+");
574         modifierString = modifierStringBuilder.toString();
575     }
576
577     return String(modifierString + accessKey);
578 }
579
580 bool WebAccessibilityObject::performDefaultAction() const
581 {
582     if (isDetached())
583         return false;
584
585     return m_private->performDefaultAction();
586 }
587
588 bool WebAccessibilityObject::increment() const
589 {
590     if (isDetached())
591         return false;
592
593     if (canIncrement()) {
594         m_private->increment();
595         return true;
596     }
597     return false;
598 }
599
600 bool WebAccessibilityObject::decrement() const
601 {
602     if (isDetached())
603         return false;
604
605     if (canDecrement()) {
606         m_private->decrement();
607         return true;
608     }
609     return false;
610 }
611
612 bool WebAccessibilityObject::press() const
613 {
614     if (isDetached())
615         return false;
616
617     return m_private->press();
618 }
619
620 WebAccessibilityRole WebAccessibilityObject::roleValue() const
621 {
622     if (isDetached())
623         return WebKit::WebAccessibilityRoleUnknown;
624
625     return static_cast<WebAccessibilityRole>(m_private->roleValue());
626 }
627
628 unsigned WebAccessibilityObject::selectionEnd() const
629 {
630     if (isDetached())
631         return 0;
632
633     return m_private->selectedTextRange().start + m_private->selectedTextRange().length;
634 }
635
636 unsigned WebAccessibilityObject::selectionStart() const
637 {
638     if (isDetached())
639         return 0;
640
641     return m_private->selectedTextRange().start;
642 }
643
644 unsigned WebAccessibilityObject::selectionEndLineNumber() const
645 {
646     if (isDetached())
647         return 0;
648
649     VisiblePosition position = m_private->visiblePositionForIndex(selectionEnd());
650     int lineNumber = m_private->lineForPosition(position);
651     if (lineNumber < 0)
652         return 0;
653     return lineNumber;
654 }
655
656 unsigned WebAccessibilityObject::selectionStartLineNumber() const
657 {
658     if (isDetached())
659         return 0;
660
661     VisiblePosition position = m_private->visiblePositionForIndex(selectionStart());
662     int lineNumber = m_private->lineForPosition(position);
663     if (lineNumber < 0)
664         return 0;
665     return lineNumber;
666 }
667
668 void WebAccessibilityObject::setFocused(bool on) const
669 {
670     if (!isDetached())
671         m_private->setFocused(on);
672 }
673
674 void WebAccessibilityObject::setSelectedTextRange(int selectionStart, int selectionEnd) const
675 {
676     if (isDetached())
677         return;
678
679     m_private->setSelectedTextRange(PlainTextRange(selectionStart, selectionEnd - selectionStart));
680 }
681
682 WebString WebAccessibilityObject::stringValue() const
683 {
684     if (isDetached())
685         return WebString();
686
687     return m_private->stringValue();
688 }
689
690 WebString WebAccessibilityObject::title() const
691 {
692     if (isDetached())
693         return WebString();
694
695     return m_private->title();
696 }
697
698 WebAccessibilityObject WebAccessibilityObject::titleUIElement() const
699 {
700     if (isDetached())
701         return WebAccessibilityObject();
702
703     if (!m_private->exposesTitleUIElement())
704         return WebAccessibilityObject();
705
706     return WebAccessibilityObject(m_private->titleUIElement());
707 }
708
709 WebURL WebAccessibilityObject::url() const
710 {
711     if (isDetached())
712         return WebURL();
713     
714     return m_private->url();
715 }
716
717 bool WebAccessibilityObject::supportsRangeValue() const
718 {
719     if (isDetached())
720         return false;
721
722     return m_private->supportsRangeValue();
723 }
724
725 WebString WebAccessibilityObject::valueDescription() const
726 {
727     if (isDetached())
728         return WebString();
729
730     return m_private->valueDescription();
731 }
732
733 float WebAccessibilityObject::valueForRange() const
734 {
735     if (isDetached())
736         return 0.0;
737
738     return m_private->valueForRange();
739 }
740
741 float WebAccessibilityObject::maxValueForRange() const
742 {
743     if (isDetached())
744         return 0.0;
745
746     return m_private->maxValueForRange();
747 }
748
749 float WebAccessibilityObject::minValueForRange() const
750 {
751     if (isDetached())
752         return 0.0;
753
754     return m_private->minValueForRange();
755 }
756
757 WebNode WebAccessibilityObject::node() const
758 {
759     if (isDetached())
760         return WebNode();
761
762     Node* node = m_private->node();
763     if (!node)
764         return WebNode();
765
766     return WebNode(node);
767 }
768
769 WebDocument WebAccessibilityObject::document() const
770 {
771     if (isDetached())
772         return WebDocument();
773
774     Document* document = m_private->document();
775     if (!document)
776         return WebDocument();
777
778     return WebDocument(document);
779 }
780
781 bool WebAccessibilityObject::hasComputedStyle() const
782 {
783     if (isDetached())
784         return false;
785
786     Document* document = m_private->document();
787     if (document)
788         document->updateStyleIfNeeded();
789
790     Node* node = m_private->node();
791     if (!node)
792         return false;
793
794     return node->computedStyle();
795 }
796
797 WebString WebAccessibilityObject::computedStyleDisplay() const
798 {
799     if (isDetached())
800         return WebString();
801
802     Document* document = m_private->document();
803     if (document)
804         document->updateStyleIfNeeded();
805
806     Node* node = m_private->node();
807     if (!node)
808         return WebString();
809
810     RenderStyle* renderStyle = node->computedStyle();
811     if (!renderStyle)
812         return WebString();
813
814     return WebString(CSSPrimitiveValue::create(renderStyle->display())->getStringValue());
815 }
816
817 bool WebAccessibilityObject::accessibilityIsIgnored() const
818 {
819     if (isDetached())
820         return false;
821
822     return m_private->accessibilityIsIgnored();
823 }
824
825 bool WebAccessibilityObject::lineBreaks(WebVector<int>& result) const
826 {
827     if (isDetached())
828         return false;
829
830     Vector<int> lineBreaksVector;
831     m_private->lineBreaks(lineBreaksVector);
832
833     size_t vectorSize = lineBreaksVector.size();
834     WebVector<int> lineBreaksWebVector(vectorSize);
835     for (size_t i = 0; i< vectorSize; i++)
836         lineBreaksWebVector[i] = lineBreaksVector[i];
837     result.swap(lineBreaksWebVector);
838
839     return true;
840 }
841
842 unsigned WebAccessibilityObject::columnCount() const
843 {
844     if (isDetached())
845         return false;
846
847     if (!m_private->isAccessibilityTable())
848         return 0;
849
850     return static_cast<WebCore::AccessibilityTable*>(m_private.get())->columnCount();
851 }
852
853 unsigned WebAccessibilityObject::rowCount() const
854 {
855     if (isDetached())
856         return false;
857
858     if (!m_private->isAccessibilityTable())
859         return 0;
860
861     return static_cast<WebCore::AccessibilityTable*>(m_private.get())->rowCount();
862 }
863
864 WebAccessibilityObject WebAccessibilityObject::cellForColumnAndRow(unsigned column, unsigned row) const
865 {
866     if (isDetached())
867         return WebAccessibilityObject();
868
869     if (!m_private->isAccessibilityTable())
870         return WebAccessibilityObject();
871
872     WebCore::AccessibilityTableCell* cell = static_cast<WebCore::AccessibilityTable*>(m_private.get())->cellForColumnAndRow(column, row);
873     return WebAccessibilityObject(static_cast<WebCore::AccessibilityObject*>(cell));
874 }
875
876 unsigned WebAccessibilityObject::cellColumnIndex() const
877 {
878     if (isDetached())
879         return 0;
880
881     if (!m_private->isTableCell())
882        return 0;
883
884     pair<int, int> columnRange;
885     static_cast<WebCore::AccessibilityTableCell*>(m_private.get())->columnIndexRange(columnRange);
886     return columnRange.first;
887 }
888
889 unsigned WebAccessibilityObject::cellColumnSpan() const
890 {
891     if (isDetached())
892         return 0;
893
894     if (!m_private->isTableCell())
895        return 0;
896
897     pair<int, int> columnRange;
898     static_cast<WebCore::AccessibilityTableCell*>(m_private.get())->columnIndexRange(columnRange);
899     return columnRange.second;
900 }
901
902 unsigned WebAccessibilityObject::cellRowIndex() const
903 {
904     if (isDetached())
905         return 0;
906
907     if (!m_private->isTableCell())
908        return 0;
909
910     pair<int, int> rowRange;
911     static_cast<WebCore::AccessibilityTableCell*>(m_private.get())->rowIndexRange(rowRange);
912     return rowRange.first;
913 }
914
915 unsigned WebAccessibilityObject::cellRowSpan() const
916 {
917     if (isDetached())
918         return 0;
919
920     if (!m_private->isTableCell())
921        return 0;
922
923     pair<int, int> rowRange;
924     static_cast<WebCore::AccessibilityTableCell*>(m_private.get())->rowIndexRange(rowRange);
925     return rowRange.second;
926 }
927
928 void WebAccessibilityObject::scrollToMakeVisible() const
929 {
930     if (!isDetached())
931         m_private->scrollToMakeVisible();
932 }
933
934 void WebAccessibilityObject::scrollToMakeVisibleWithSubFocus(const WebRect& subfocus) const
935 {
936     if (!isDetached())
937         m_private->scrollToMakeVisibleWithSubFocus(subfocus);
938 }
939
940 void WebAccessibilityObject::scrollToGlobalPoint(const WebPoint& point) const
941 {
942     if (!isDetached())
943         m_private->scrollToGlobalPoint(point);
944 }
945
946 WebAccessibilityObject::WebAccessibilityObject(const WTF::PassRefPtr<WebCore::AccessibilityObject>& object)
947     : m_private(object)
948 {
949 }
950
951 WebAccessibilityObject& WebAccessibilityObject::operator=(const WTF::PassRefPtr<WebCore::AccessibilityObject>& object)
952 {
953     m_private = object;
954     return *this;
955 }
956
957 WebAccessibilityObject::operator WTF::PassRefPtr<WebCore::AccessibilityObject>() const
958 {
959     return m_private.get();
960 }
961
962 } // namespace WebKit