825b58b301bb08357dba25e8ce4d59b36b886e7c
[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 void WebAccessibilityObject::colorValue(int& r, int& g, int& b) const
502 {
503     if (isDetached())
504         return;
505
506     m_private->colorValue(r, g, b);
507 }
508
509 double WebAccessibilityObject::estimatedLoadingProgress() const
510 {
511     if (isDetached())
512         return 0.0;
513
514     return m_private->estimatedLoadingProgress();
515 }
516
517 WebString WebAccessibilityObject::helpText() const
518 {
519     if (isDetached())
520         return WebString();
521
522     return m_private->helpText();
523 }
524
525 int WebAccessibilityObject::headingLevel() const
526 {
527     if (isDetached())
528         return 0;
529
530     return m_private->headingLevel();
531 }
532
533 int WebAccessibilityObject::hierarchicalLevel() const
534 {
535     if (isDetached())
536         return 0;
537
538     return m_private->hierarchicalLevel();
539 }
540
541 WebAccessibilityObject WebAccessibilityObject::hitTest(const WebPoint& point) const
542 {
543     if (isDetached())
544         return WebAccessibilityObject();
545
546     IntPoint contentsPoint = m_private->documentFrameView()->windowToContents(point);
547     RefPtr<AccessibilityObject> hit = m_private->accessibilityHitTest(contentsPoint);
548
549     if (hit)
550         return WebAccessibilityObject(hit);
551
552     if (m_private->boundingBoxRect().contains(contentsPoint))
553         return *this;
554
555     return WebAccessibilityObject();
556 }
557
558 WebString WebAccessibilityObject::keyboardShortcut() const
559 {
560     if (isDetached())
561         return WebString();
562
563     String accessKey = m_private->accessKey();
564     if (accessKey.isNull())
565         return WebString();
566
567     DEFINE_STATIC_LOCAL(String, modifierString, ());
568     if (modifierString.isNull()) {
569         unsigned modifiers = EventHandler::accessKeyModifiers();
570         // Follow the same order as Mozilla MSAA implementation:
571         // Ctrl+Alt+Shift+Meta+key. MSDN states that keyboard shortcut strings
572         // should not be localized and defines the separator as "+".
573         StringBuilder modifierStringBuilder;
574         if (modifiers & PlatformEvent::CtrlKey)
575             modifierStringBuilder.appendLiteral("Ctrl+");
576         if (modifiers & PlatformEvent::AltKey)
577             modifierStringBuilder.appendLiteral("Alt+");
578         if (modifiers & PlatformEvent::ShiftKey)
579             modifierStringBuilder.appendLiteral("Shift+");
580         if (modifiers & PlatformEvent::MetaKey)
581             modifierStringBuilder.appendLiteral("Win+");
582         modifierString = modifierStringBuilder.toString();
583     }
584
585     return String(modifierString + accessKey);
586 }
587
588 bool WebAccessibilityObject::performDefaultAction() const
589 {
590     if (isDetached())
591         return false;
592
593     return m_private->performDefaultAction();
594 }
595
596 bool WebAccessibilityObject::increment() const
597 {
598     if (isDetached())
599         return false;
600
601     if (canIncrement()) {
602         m_private->increment();
603         return true;
604     }
605     return false;
606 }
607
608 bool WebAccessibilityObject::decrement() const
609 {
610     if (isDetached())
611         return false;
612
613     if (canDecrement()) {
614         m_private->decrement();
615         return true;
616     }
617     return false;
618 }
619
620 bool WebAccessibilityObject::press() const
621 {
622     if (isDetached())
623         return false;
624
625     return m_private->press();
626 }
627
628 WebAccessibilityRole WebAccessibilityObject::roleValue() const
629 {
630     if (isDetached())
631         return WebKit::WebAccessibilityRoleUnknown;
632
633     return static_cast<WebAccessibilityRole>(m_private->roleValue());
634 }
635
636 unsigned WebAccessibilityObject::selectionEnd() const
637 {
638     if (isDetached())
639         return 0;
640
641     return m_private->selectedTextRange().start + m_private->selectedTextRange().length;
642 }
643
644 unsigned WebAccessibilityObject::selectionStart() const
645 {
646     if (isDetached())
647         return 0;
648
649     return m_private->selectedTextRange().start;
650 }
651
652 unsigned WebAccessibilityObject::selectionEndLineNumber() const
653 {
654     if (isDetached())
655         return 0;
656
657     VisiblePosition position = m_private->visiblePositionForIndex(selectionEnd());
658     int lineNumber = m_private->lineForPosition(position);
659     if (lineNumber < 0)
660         return 0;
661     return lineNumber;
662 }
663
664 unsigned WebAccessibilityObject::selectionStartLineNumber() const
665 {
666     if (isDetached())
667         return 0;
668
669     VisiblePosition position = m_private->visiblePositionForIndex(selectionStart());
670     int lineNumber = m_private->lineForPosition(position);
671     if (lineNumber < 0)
672         return 0;
673     return lineNumber;
674 }
675
676 void WebAccessibilityObject::setFocused(bool on) const
677 {
678     if (!isDetached())
679         m_private->setFocused(on);
680 }
681
682 void WebAccessibilityObject::setSelectedTextRange(int selectionStart, int selectionEnd) const
683 {
684     if (isDetached())
685         return;
686
687     m_private->setSelectedTextRange(PlainTextRange(selectionStart, selectionEnd - selectionStart));
688 }
689
690 WebString WebAccessibilityObject::stringValue() const
691 {
692     if (isDetached())
693         return WebString();
694
695     return m_private->stringValue();
696 }
697
698 WebString WebAccessibilityObject::title() const
699 {
700     if (isDetached())
701         return WebString();
702
703     return m_private->title();
704 }
705
706 WebAccessibilityObject WebAccessibilityObject::titleUIElement() const
707 {
708     if (isDetached())
709         return WebAccessibilityObject();
710
711     if (!m_private->exposesTitleUIElement())
712         return WebAccessibilityObject();
713
714     return WebAccessibilityObject(m_private->titleUIElement());
715 }
716
717 WebURL WebAccessibilityObject::url() const
718 {
719     if (isDetached())
720         return WebURL();
721     
722     return m_private->url();
723 }
724
725 bool WebAccessibilityObject::supportsRangeValue() const
726 {
727     if (isDetached())
728         return false;
729
730     return m_private->supportsRangeValue();
731 }
732
733 WebString WebAccessibilityObject::valueDescription() const
734 {
735     if (isDetached())
736         return WebString();
737
738     return m_private->valueDescription();
739 }
740
741 float WebAccessibilityObject::valueForRange() const
742 {
743     if (isDetached())
744         return 0.0;
745
746     return m_private->valueForRange();
747 }
748
749 float WebAccessibilityObject::maxValueForRange() const
750 {
751     if (isDetached())
752         return 0.0;
753
754     return m_private->maxValueForRange();
755 }
756
757 float WebAccessibilityObject::minValueForRange() const
758 {
759     if (isDetached())
760         return 0.0;
761
762     return m_private->minValueForRange();
763 }
764
765 WebNode WebAccessibilityObject::node() const
766 {
767     if (isDetached())
768         return WebNode();
769
770     Node* node = m_private->node();
771     if (!node)
772         return WebNode();
773
774     return WebNode(node);
775 }
776
777 WebDocument WebAccessibilityObject::document() const
778 {
779     if (isDetached())
780         return WebDocument();
781
782     Document* document = m_private->document();
783     if (!document)
784         return WebDocument();
785
786     return WebDocument(document);
787 }
788
789 bool WebAccessibilityObject::hasComputedStyle() const
790 {
791     if (isDetached())
792         return false;
793
794     Document* document = m_private->document();
795     if (document)
796         document->updateStyleIfNeeded();
797
798     Node* node = m_private->node();
799     if (!node)
800         return false;
801
802     return node->computedStyle();
803 }
804
805 WebString WebAccessibilityObject::computedStyleDisplay() const
806 {
807     if (isDetached())
808         return WebString();
809
810     Document* document = m_private->document();
811     if (document)
812         document->updateStyleIfNeeded();
813
814     Node* node = m_private->node();
815     if (!node)
816         return WebString();
817
818     RenderStyle* renderStyle = node->computedStyle();
819     if (!renderStyle)
820         return WebString();
821
822     return WebString(CSSPrimitiveValue::create(renderStyle->display())->getStringValue());
823 }
824
825 bool WebAccessibilityObject::accessibilityIsIgnored() const
826 {
827     if (isDetached())
828         return false;
829
830     return m_private->accessibilityIsIgnored();
831 }
832
833 bool WebAccessibilityObject::lineBreaks(WebVector<int>& result) const
834 {
835     if (isDetached())
836         return false;
837
838     Vector<int> lineBreaksVector;
839     m_private->lineBreaks(lineBreaksVector);
840
841     size_t vectorSize = lineBreaksVector.size();
842     WebVector<int> lineBreaksWebVector(vectorSize);
843     for (size_t i = 0; i< vectorSize; i++)
844         lineBreaksWebVector[i] = lineBreaksVector[i];
845     result.swap(lineBreaksWebVector);
846
847     return true;
848 }
849
850 unsigned WebAccessibilityObject::columnCount() const
851 {
852     if (isDetached())
853         return false;
854
855     if (!m_private->isAccessibilityTable())
856         return 0;
857
858     return static_cast<WebCore::AccessibilityTable*>(m_private.get())->columnCount();
859 }
860
861 unsigned WebAccessibilityObject::rowCount() const
862 {
863     if (isDetached())
864         return false;
865
866     if (!m_private->isAccessibilityTable())
867         return 0;
868
869     return static_cast<WebCore::AccessibilityTable*>(m_private.get())->rowCount();
870 }
871
872 WebAccessibilityObject WebAccessibilityObject::cellForColumnAndRow(unsigned column, unsigned row) const
873 {
874     if (isDetached())
875         return WebAccessibilityObject();
876
877     if (!m_private->isAccessibilityTable())
878         return WebAccessibilityObject();
879
880     WebCore::AccessibilityTableCell* cell = static_cast<WebCore::AccessibilityTable*>(m_private.get())->cellForColumnAndRow(column, row);
881     return WebAccessibilityObject(static_cast<WebCore::AccessibilityObject*>(cell));
882 }
883
884 unsigned WebAccessibilityObject::cellColumnIndex() const
885 {
886     if (isDetached())
887         return 0;
888
889     if (!m_private->isTableCell())
890        return 0;
891
892     pair<int, int> columnRange;
893     static_cast<WebCore::AccessibilityTableCell*>(m_private.get())->columnIndexRange(columnRange);
894     return columnRange.first;
895 }
896
897 unsigned WebAccessibilityObject::cellColumnSpan() const
898 {
899     if (isDetached())
900         return 0;
901
902     if (!m_private->isTableCell())
903        return 0;
904
905     pair<int, int> columnRange;
906     static_cast<WebCore::AccessibilityTableCell*>(m_private.get())->columnIndexRange(columnRange);
907     return columnRange.second;
908 }
909
910 unsigned WebAccessibilityObject::cellRowIndex() const
911 {
912     if (isDetached())
913         return 0;
914
915     if (!m_private->isTableCell())
916        return 0;
917
918     pair<int, int> rowRange;
919     static_cast<WebCore::AccessibilityTableCell*>(m_private.get())->rowIndexRange(rowRange);
920     return rowRange.first;
921 }
922
923 unsigned WebAccessibilityObject::cellRowSpan() const
924 {
925     if (isDetached())
926         return 0;
927
928     if (!m_private->isTableCell())
929        return 0;
930
931     pair<int, int> rowRange;
932     static_cast<WebCore::AccessibilityTableCell*>(m_private.get())->rowIndexRange(rowRange);
933     return rowRange.second;
934 }
935
936 void WebAccessibilityObject::scrollToMakeVisible() const
937 {
938     if (!isDetached())
939         m_private->scrollToMakeVisible();
940 }
941
942 void WebAccessibilityObject::scrollToMakeVisibleWithSubFocus(const WebRect& subfocus) const
943 {
944     if (!isDetached())
945         m_private->scrollToMakeVisibleWithSubFocus(subfocus);
946 }
947
948 void WebAccessibilityObject::scrollToGlobalPoint(const WebPoint& point) const
949 {
950     if (!isDetached())
951         m_private->scrollToGlobalPoint(point);
952 }
953
954 WebAccessibilityObject::WebAccessibilityObject(const WTF::PassRefPtr<WebCore::AccessibilityObject>& object)
955     : m_private(object)
956 {
957 }
958
959 WebAccessibilityObject& WebAccessibilityObject::operator=(const WTF::PassRefPtr<WebCore::AccessibilityObject>& object)
960 {
961     m_private = object;
962     return *this;
963 }
964
965 WebAccessibilityObject::operator WTF::PassRefPtr<WebCore::AccessibilityObject>() const
966 {
967     return m_private.get();
968 }
969
970 } // namespace WebKit