AccessibilityUIElementWin.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765
  1. /*
  2. * Copyright (C) 2008 Apple 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
  6. * are met:
  7. * 1. Redistributions of source code must retain the above copyright
  8. * notice, this list of conditions and the following disclaimer.
  9. * 2. Redistributions in binary form must reproduce the above copyright
  10. * notice, this list of conditions and the following disclaimer in the
  11. * documentation and/or other materials provided with the distribution.
  12. *
  13. * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
  14. * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  15. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  16. * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
  17. * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  18. * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  19. * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  20. * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  21. * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  22. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  23. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  24. */
  25. #include "config.h"
  26. #include "AccessibilityUIElement.h"
  27. #include "AccessibilityController.h"
  28. #include "DumpRenderTree.h"
  29. #include "FrameLoadDelegate.h"
  30. #include <JavaScriptCore/JSStringRef.h>
  31. #include <comutil.h>
  32. #include <tchar.h>
  33. #include <string>
  34. using std::wstring;
  35. static COMPtr<IAccessibleComparable> comparableObject(IAccessible* accessible)
  36. {
  37. COMPtr<IServiceProvider> serviceProvider(Query, accessible);
  38. if (!serviceProvider)
  39. return 0;
  40. COMPtr<IAccessibleComparable> comparable;
  41. serviceProvider->QueryService(SID_AccessibleComparable, __uuidof(IAccessibleComparable), reinterpret_cast<void**>(&comparable));
  42. return comparable;
  43. }
  44. AccessibilityUIElement::AccessibilityUIElement(PlatformUIElement element)
  45. : m_element(element)
  46. {
  47. }
  48. AccessibilityUIElement::AccessibilityUIElement(const AccessibilityUIElement& other)
  49. : m_element(other.m_element)
  50. {
  51. }
  52. AccessibilityUIElement::~AccessibilityUIElement()
  53. {
  54. }
  55. bool AccessibilityUIElement::isEqual(AccessibilityUIElement* otherElement)
  56. {
  57. COMPtr<IAccessibleComparable> comparable = comparableObject(m_element.get());
  58. COMPtr<IAccessibleComparable> otherComparable = comparableObject(otherElement->m_element.get());
  59. if (!comparable || !otherComparable)
  60. return false;
  61. BOOL isSame = FALSE;
  62. if (FAILED(comparable->isSameObject(otherComparable.get(), &isSame)))
  63. return false;
  64. return isSame;
  65. }
  66. void AccessibilityUIElement::getLinkedUIElements(Vector<AccessibilityUIElement>&)
  67. {
  68. }
  69. void AccessibilityUIElement::getDocumentLinks(Vector<AccessibilityUIElement>&)
  70. {
  71. }
  72. void AccessibilityUIElement::getChildren(Vector<AccessibilityUIElement>& children)
  73. {
  74. long childCount;
  75. if (FAILED(m_element->get_accChildCount(&childCount)))
  76. return;
  77. for (long i = 0; i < childCount; ++i)
  78. children.append(getChildAtIndex(i));
  79. }
  80. void AccessibilityUIElement::getChildrenWithRange(Vector<AccessibilityUIElement>& elementVector, unsigned location, unsigned length)
  81. {
  82. long childCount;
  83. unsigned appendedCount = 0;
  84. if (FAILED(m_element->get_accChildCount(&childCount)))
  85. return;
  86. for (long i = location; i < childCount && appendedCount < length; ++i, ++appendedCount)
  87. elementVector.append(getChildAtIndex(i));
  88. }
  89. int AccessibilityUIElement::childrenCount()
  90. {
  91. long childCount;
  92. m_element->get_accChildCount(&childCount);
  93. return childCount;
  94. }
  95. int AccessibilityUIElement::rowCount()
  96. {
  97. // FIXME: implement
  98. return 0;
  99. }
  100. int AccessibilityUIElement::columnCount()
  101. {
  102. // FIXME: implement
  103. return 0;
  104. }
  105. AccessibilityUIElement AccessibilityUIElement::elementAtPoint(int x, int y)
  106. {
  107. return 0;
  108. }
  109. AccessibilityUIElement AccessibilityUIElement::linkedUIElementAtIndex(unsigned index)
  110. {
  111. // FIXME: implement
  112. return 0;
  113. }
  114. AccessibilityUIElement AccessibilityUIElement::getChildAtIndex(unsigned index)
  115. {
  116. COMPtr<IDispatch> child;
  117. VARIANT vChild;
  118. ::VariantInit(&vChild);
  119. V_VT(&vChild) = VT_I4;
  120. // In MSAA, index 0 is the object itself.
  121. V_I4(&vChild) = index + 1;
  122. if (FAILED(m_element->get_accChild(vChild, &child)))
  123. return 0;
  124. return COMPtr<IAccessible>(Query, child);
  125. }
  126. unsigned AccessibilityUIElement::indexOfChild(AccessibilityUIElement* element)
  127. {
  128. // FIXME: implement
  129. return 0;
  130. }
  131. JSStringRef AccessibilityUIElement::allAttributes()
  132. {
  133. return JSStringCreateWithCharacters(0, 0);
  134. }
  135. JSStringRef AccessibilityUIElement::attributesOfLinkedUIElements()
  136. {
  137. return JSStringCreateWithCharacters(0, 0);
  138. }
  139. JSStringRef AccessibilityUIElement::attributesOfDocumentLinks()
  140. {
  141. return JSStringCreateWithCharacters(0, 0);
  142. }
  143. AccessibilityUIElement AccessibilityUIElement::titleUIElement()
  144. {
  145. COMPtr<IAccessible> platformElement = platformUIElement();
  146. COMPtr<IAccessibleComparable> comparable = comparableObject(platformElement.get());
  147. if (!comparable)
  148. return 0;
  149. VARIANT value;
  150. ::VariantInit(&value);
  151. _bstr_t titleUIElementAttributeKey(L"AXTitleUIElementAttribute");
  152. if (FAILED(comparable->get_attribute(titleUIElementAttributeKey, &value))) {
  153. ::VariantClear(&value);
  154. return 0;
  155. }
  156. if (V_VT(&value) == VT_EMPTY) {
  157. ::VariantClear(&value);
  158. return 0;
  159. }
  160. ASSERT(V_VT(&value) == VT_UNKNOWN);
  161. if (V_VT(&value) != VT_UNKNOWN) {
  162. ::VariantClear(&value);
  163. return 0;
  164. }
  165. COMPtr<IAccessible> titleElement(Query, value.punkVal);
  166. if (value.punkVal)
  167. value.punkVal->Release();
  168. ::VariantClear(&value);
  169. return titleElement;
  170. }
  171. AccessibilityUIElement AccessibilityUIElement::parentElement()
  172. {
  173. COMPtr<IDispatch> parent;
  174. m_element->get_accParent(&parent);
  175. COMPtr<IAccessible> parentAccessible(Query, parent);
  176. return parentAccessible;
  177. }
  178. JSStringRef AccessibilityUIElement::attributesOfChildren()
  179. {
  180. return JSStringCreateWithCharacters(0, 0);
  181. }
  182. JSStringRef AccessibilityUIElement::parameterizedAttributeNames()
  183. {
  184. return JSStringCreateWithCharacters(0, 0);
  185. }
  186. static VARIANT& self()
  187. {
  188. static VARIANT vSelf;
  189. static bool haveInitialized;
  190. if (!haveInitialized) {
  191. ::VariantInit(&vSelf);
  192. V_VT(&vSelf) = VT_I4;
  193. V_I4(&vSelf) = CHILDID_SELF;
  194. }
  195. return vSelf;
  196. }
  197. JSStringRef AccessibilityUIElement::role()
  198. {
  199. if (!m_element)
  200. return JSStringCreateWithCharacters(0, 0);
  201. VARIANT vRole;
  202. if (FAILED(m_element->get_accRole(self(), &vRole)))
  203. return JSStringCreateWithCharacters(0, 0);
  204. ASSERT(V_VT(&vRole) == VT_I4 || V_VT(&vRole) == VT_BSTR);
  205. wstring result;
  206. if (V_VT(&vRole) == VT_I4) {
  207. unsigned roleTextLength = ::GetRoleText(V_I4(&vRole), 0, 0) + 1;
  208. Vector<TCHAR> roleText(roleTextLength);
  209. ::GetRoleText(V_I4(&vRole), roleText.data(), roleTextLength);
  210. result = roleText.data();
  211. } else if (V_VT(&vRole) == VT_BSTR)
  212. result = wstring(V_BSTR(&vRole), ::SysStringLen(V_BSTR(&vRole)));
  213. ::VariantClear(&vRole);
  214. return JSStringCreateWithCharacters(result.data(), result.length());
  215. }
  216. JSStringRef AccessibilityUIElement::subrole()
  217. {
  218. return 0;
  219. }
  220. JSStringRef AccessibilityUIElement::roleDescription()
  221. {
  222. return 0;
  223. }
  224. JSStringRef AccessibilityUIElement::title()
  225. {
  226. BSTR titleBSTR;
  227. if (FAILED(m_element->get_accName(self(), &titleBSTR)) || !titleBSTR)
  228. return JSStringCreateWithCharacters(0, 0);
  229. wstring title(titleBSTR, SysStringLen(titleBSTR));
  230. ::SysFreeString(titleBSTR);
  231. return JSStringCreateWithCharacters(title.data(), title.length());
  232. }
  233. JSStringRef AccessibilityUIElement::description()
  234. {
  235. BSTR descriptionBSTR;
  236. if (FAILED(m_element->get_accDescription(self(), &descriptionBSTR)) || !descriptionBSTR)
  237. return JSStringCreateWithCharacters(0, 0);
  238. wstring description(descriptionBSTR, SysStringLen(descriptionBSTR));
  239. ::SysFreeString(descriptionBSTR);
  240. return JSStringCreateWithCharacters(description.data(), description.length());
  241. }
  242. JSStringRef AccessibilityUIElement::stringValue()
  243. {
  244. return JSStringCreateWithCharacters(0, 0);
  245. }
  246. JSStringRef AccessibilityUIElement::language()
  247. {
  248. return JSStringCreateWithCharacters(0, 0);
  249. }
  250. JSStringRef AccessibilityUIElement::helpText() const
  251. {
  252. return 0;
  253. }
  254. double AccessibilityUIElement::x()
  255. {
  256. long x, y, width, height;
  257. if (FAILED(m_element->accLocation(&x, &y, &width, &height, self())))
  258. return 0;
  259. return x;
  260. }
  261. double AccessibilityUIElement::y()
  262. {
  263. long x, y, width, height;
  264. if (FAILED(m_element->accLocation(&x, &y, &width, &height, self())))
  265. return 0;
  266. return y;
  267. }
  268. double AccessibilityUIElement::width()
  269. {
  270. long x, y, width, height;
  271. if (FAILED(m_element->accLocation(&x, &y, &width, &height, self())))
  272. return 0;
  273. return width;
  274. }
  275. double AccessibilityUIElement::height()
  276. {
  277. long x, y, width, height;
  278. if (FAILED(m_element->accLocation(&x, &y, &width, &height, self())))
  279. return 0;
  280. return height;
  281. }
  282. double AccessibilityUIElement::clickPointX()
  283. {
  284. return 0;
  285. }
  286. double AccessibilityUIElement::clickPointY()
  287. {
  288. return 0;
  289. }
  290. JSStringRef AccessibilityUIElement::valueDescription()
  291. {
  292. return 0;
  293. }
  294. static DWORD accessibilityState(COMPtr<IAccessible> element)
  295. {
  296. VARIANT state;
  297. element->get_accState(self(), &state);
  298. ASSERT(V_VT(&state) == VT_I4);
  299. DWORD result = state.lVal;
  300. VariantClear(&state);
  301. return result;
  302. }
  303. bool AccessibilityUIElement::isFocused() const
  304. {
  305. // FIXME: implement
  306. return false;
  307. }
  308. bool AccessibilityUIElement::isSelected() const
  309. {
  310. DWORD state = accessibilityState(m_element);
  311. return (state & STATE_SYSTEM_SELECTED) == STATE_SYSTEM_SELECTED;
  312. }
  313. int AccessibilityUIElement::hierarchicalLevel() const
  314. {
  315. return 0;
  316. }
  317. bool AccessibilityUIElement::ariaIsGrabbed() const
  318. {
  319. return false;
  320. }
  321. JSStringRef AccessibilityUIElement::ariaDropEffects() const
  322. {
  323. return 0;
  324. }
  325. bool AccessibilityUIElement::isExpanded() const
  326. {
  327. return false;
  328. }
  329. bool AccessibilityUIElement::isChecked() const
  330. {
  331. VARIANT vState;
  332. if (FAILED(m_element->get_accState(self(), &vState)))
  333. return false;
  334. return vState.lVal & STATE_SYSTEM_CHECKED;
  335. }
  336. JSStringRef AccessibilityUIElement::orientation() const
  337. {
  338. return 0;
  339. }
  340. double AccessibilityUIElement::intValue() const
  341. {
  342. BSTR valueBSTR;
  343. if (FAILED(m_element->get_accValue(self(), &valueBSTR)) || !valueBSTR)
  344. return 0;
  345. wstring value(valueBSTR, SysStringLen(valueBSTR));
  346. ::SysFreeString(valueBSTR);
  347. TCHAR* ignored;
  348. return _tcstod(value.data(), &ignored);
  349. }
  350. double AccessibilityUIElement::minValue()
  351. {
  352. return 0;
  353. }
  354. double AccessibilityUIElement::maxValue()
  355. {
  356. return 0;
  357. }
  358. bool AccessibilityUIElement::isPressActionSupported()
  359. {
  360. return false;
  361. }
  362. bool AccessibilityUIElement::isIncrementActionSupported()
  363. {
  364. return false;
  365. }
  366. bool AccessibilityUIElement::isDecrementActionSupported()
  367. {
  368. return false;
  369. }
  370. bool AccessibilityUIElement::isEnabled()
  371. {
  372. DWORD state = accessibilityState(m_element);
  373. return (state & STATE_SYSTEM_UNAVAILABLE) != STATE_SYSTEM_UNAVAILABLE;
  374. }
  375. bool AccessibilityUIElement::isRequired() const
  376. {
  377. return false;
  378. }
  379. int AccessibilityUIElement::insertionPointLineNumber()
  380. {
  381. return 0;
  382. }
  383. JSStringRef AccessibilityUIElement::attributesOfColumnHeaders()
  384. {
  385. return JSStringCreateWithCharacters(0, 0);
  386. }
  387. JSStringRef AccessibilityUIElement::attributesOfRowHeaders()
  388. {
  389. return JSStringCreateWithCharacters(0, 0);
  390. }
  391. JSStringRef AccessibilityUIElement::attributesOfColumns()
  392. {
  393. return JSStringCreateWithCharacters(0, 0);
  394. }
  395. JSStringRef AccessibilityUIElement::attributesOfRows()
  396. {
  397. return JSStringCreateWithCharacters(0, 0);
  398. }
  399. JSStringRef AccessibilityUIElement::attributesOfVisibleCells()
  400. {
  401. return JSStringCreateWithCharacters(0, 0);
  402. }
  403. JSStringRef AccessibilityUIElement::attributesOfHeader()
  404. {
  405. return JSStringCreateWithCharacters(0, 0);
  406. }
  407. int AccessibilityUIElement::indexInTable()
  408. {
  409. return 0;
  410. }
  411. JSStringRef AccessibilityUIElement::rowIndexRange()
  412. {
  413. return JSStringCreateWithCharacters(0, 0);
  414. }
  415. JSStringRef AccessibilityUIElement::columnIndexRange()
  416. {
  417. return JSStringCreateWithCharacters(0, 0);
  418. }
  419. int AccessibilityUIElement::lineForIndex(int)
  420. {
  421. return 0;
  422. }
  423. JSStringRef AccessibilityUIElement::boundsForRange(unsigned location, unsigned length)
  424. {
  425. return JSStringCreateWithCharacters(0, 0);
  426. }
  427. JSStringRef AccessibilityUIElement::stringForRange(unsigned, unsigned)
  428. {
  429. return JSStringCreateWithCharacters(0, 0);
  430. }
  431. JSStringRef AccessibilityUIElement::attributedStringForRange(unsigned, unsigned)
  432. {
  433. return JSStringCreateWithCharacters(0, 0);
  434. }
  435. bool AccessibilityUIElement::attributedStringRangeIsMisspelled(unsigned, unsigned)
  436. {
  437. return false;
  438. }
  439. AccessibilityUIElement AccessibilityUIElement::uiElementForSearchPredicate(JSContextRef context, AccessibilityUIElement* startElement, bool isDirectionNext, JSValueRef searchKey, JSStringRef searchText, bool visibleOnly)
  440. {
  441. return 0;
  442. }
  443. AccessibilityUIElement AccessibilityUIElement::cellForColumnAndRow(unsigned column, unsigned row)
  444. {
  445. return 0;
  446. }
  447. JSStringRef AccessibilityUIElement::selectedTextRange()
  448. {
  449. return JSStringCreateWithCharacters(0, 0);
  450. }
  451. void AccessibilityUIElement::setSelectedTextRange(unsigned location, unsigned length)
  452. {
  453. }
  454. JSStringRef AccessibilityUIElement::stringAttributeValue(JSStringRef attribute)
  455. {
  456. // FIXME: implement
  457. return JSStringCreateWithCharacters(0, 0);
  458. }
  459. double AccessibilityUIElement::numberAttributeValue(JSStringRef attribute)
  460. {
  461. // FIXME: implement
  462. return 0;
  463. }
  464. bool AccessibilityUIElement::boolAttributeValue(JSStringRef attribute)
  465. {
  466. // FIXME: implement
  467. return false;
  468. }
  469. bool AccessibilityUIElement::isAttributeSettable(JSStringRef attribute)
  470. {
  471. return false;
  472. }
  473. bool AccessibilityUIElement::isAttributeSupported(JSStringRef attribute)
  474. {
  475. return false;
  476. }
  477. void AccessibilityUIElement::increment()
  478. {
  479. }
  480. void AccessibilityUIElement::decrement()
  481. {
  482. }
  483. void AccessibilityUIElement::showMenu()
  484. {
  485. ASSERT(hasPopup());
  486. m_element->accDoDefaultAction(self());
  487. }
  488. void AccessibilityUIElement::press()
  489. {
  490. // FIXME: implement
  491. }
  492. AccessibilityUIElement AccessibilityUIElement::disclosedRowAtIndex(unsigned index)
  493. {
  494. return 0;
  495. }
  496. AccessibilityUIElement AccessibilityUIElement::ariaOwnsElementAtIndex(unsigned index)
  497. {
  498. return 0;
  499. }
  500. AccessibilityUIElement AccessibilityUIElement::ariaFlowToElementAtIndex(unsigned index)
  501. {
  502. return 0;
  503. }
  504. AccessibilityUIElement AccessibilityUIElement::selectedRowAtIndex(unsigned index)
  505. {
  506. return 0;
  507. }
  508. AccessibilityUIElement AccessibilityUIElement::rowAtIndex(unsigned index)
  509. {
  510. return 0;
  511. }
  512. AccessibilityUIElement AccessibilityUIElement::disclosedByRow()
  513. {
  514. return 0;
  515. }
  516. JSStringRef AccessibilityUIElement::accessibilityValue() const
  517. {
  518. BSTR valueBSTR;
  519. if (FAILED(m_element->get_accValue(self(), &valueBSTR)) || !valueBSTR)
  520. return JSStringCreateWithCharacters(0, 0);
  521. wstring value(valueBSTR, SysStringLen(valueBSTR));
  522. ::SysFreeString(valueBSTR);
  523. return JSStringCreateWithCharacters(value.data(), value.length());
  524. }
  525. JSStringRef AccessibilityUIElement::documentEncoding()
  526. {
  527. return JSStringCreateWithCharacters(0, 0);
  528. }
  529. JSStringRef AccessibilityUIElement::documentURI()
  530. {
  531. return JSStringCreateWithCharacters(0, 0);
  532. }
  533. JSStringRef AccessibilityUIElement::url()
  534. {
  535. // FIXME: implement
  536. return JSStringCreateWithCharacters(0, 0);
  537. }
  538. bool AccessibilityUIElement::addNotificationListener(JSObjectRef functionCallback)
  539. {
  540. if (!functionCallback)
  541. return false;
  542. sharedFrameLoadDelegate->accessibilityController()->winAddNotificationListener(m_element, functionCallback);
  543. return true;
  544. }
  545. void AccessibilityUIElement::removeNotificationListener()
  546. {
  547. // FIXME: implement
  548. }
  549. bool AccessibilityUIElement::isFocusable() const
  550. {
  551. // FIXME: implement
  552. return false;
  553. }
  554. bool AccessibilityUIElement::isSelectable() const
  555. {
  556. DWORD state = accessibilityState(m_element);
  557. return (state & STATE_SYSTEM_SELECTABLE) == STATE_SYSTEM_SELECTABLE;
  558. }
  559. bool AccessibilityUIElement::isMultiSelectable() const
  560. {
  561. DWORD multiSelectable = STATE_SYSTEM_EXTSELECTABLE | STATE_SYSTEM_MULTISELECTABLE;
  562. DWORD state = accessibilityState(m_element);
  563. return (state & multiSelectable) == multiSelectable;
  564. }
  565. bool AccessibilityUIElement::isSelectedOptionActive() const
  566. {
  567. // FIXME: implement
  568. return false;
  569. }
  570. bool AccessibilityUIElement::isVisible() const
  571. {
  572. DWORD state = accessibilityState(m_element);
  573. return (state & STATE_SYSTEM_INVISIBLE) != STATE_SYSTEM_INVISIBLE;
  574. }
  575. bool AccessibilityUIElement::isOffScreen() const
  576. {
  577. DWORD state = accessibilityState(m_element);
  578. return (state & STATE_SYSTEM_OFFSCREEN) == STATE_SYSTEM_OFFSCREEN;
  579. }
  580. bool AccessibilityUIElement::isCollapsed() const
  581. {
  582. DWORD state = accessibilityState(m_element);
  583. return (state & STATE_SYSTEM_COLLAPSED) == STATE_SYSTEM_COLLAPSED;
  584. }
  585. bool AccessibilityUIElement::isIgnored() const
  586. {
  587. // FIXME: implement
  588. return false;
  589. }
  590. bool AccessibilityUIElement::hasPopup() const
  591. {
  592. DWORD state = accessibilityState(m_element);
  593. return (state & STATE_SYSTEM_HASPOPUP) == STATE_SYSTEM_HASPOPUP;
  594. }
  595. void AccessibilityUIElement::takeFocus()
  596. {
  597. m_element->accSelect(SELFLAG_TAKEFOCUS, self());
  598. }
  599. void AccessibilityUIElement::takeSelection()
  600. {
  601. m_element->accSelect(SELFLAG_TAKESELECTION, self());
  602. }
  603. void AccessibilityUIElement::addSelection()
  604. {
  605. m_element->accSelect(SELFLAG_ADDSELECTION, self());
  606. }
  607. void AccessibilityUIElement::removeSelection()
  608. {
  609. m_element->accSelect(SELFLAG_REMOVESELECTION, self());
  610. }
  611. void AccessibilityUIElement::scrollToMakeVisible()
  612. {
  613. // FIXME: implement
  614. }
  615. void AccessibilityUIElement::scrollToMakeVisibleWithSubFocus(int x, int y, int width, int height)
  616. {
  617. // FIXME: implement
  618. }
  619. void AccessibilityUIElement::scrollToGlobalPoint(int x, int y)
  620. {
  621. // FIXME: implement
  622. }