OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <atlbase.h> | 5 #include <atlbase.h> |
6 #include <atlcom.h> | 6 #include <atlcom.h> |
7 #include <limits.h> | 7 #include <limits.h> |
8 #include <oleacc.h> | 8 #include <oleacc.h> |
9 #include <stdint.h> | 9 #include <stdint.h> |
10 | 10 |
(...skipping 1420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1431 if (state & (1 << ui::AX_STATE_COLLAPSED)) | 1431 if (state & (1 << ui::AX_STATE_COLLAPSED)) |
1432 msaa_state |= STATE_SYSTEM_COLLAPSED; | 1432 msaa_state |= STATE_SYSTEM_COLLAPSED; |
1433 if (state & (1 << ui::AX_STATE_DEFAULT)) | 1433 if (state & (1 << ui::AX_STATE_DEFAULT)) |
1434 msaa_state |= STATE_SYSTEM_DEFAULT; | 1434 msaa_state |= STATE_SYSTEM_DEFAULT; |
1435 if (state & (1 << ui::AX_STATE_EXPANDED)) | 1435 if (state & (1 << ui::AX_STATE_EXPANDED)) |
1436 msaa_state |= STATE_SYSTEM_EXPANDED; | 1436 msaa_state |= STATE_SYSTEM_EXPANDED; |
1437 if (state & (1 << ui::AX_STATE_FOCUSABLE)) | 1437 if (state & (1 << ui::AX_STATE_FOCUSABLE)) |
1438 msaa_state |= STATE_SYSTEM_FOCUSABLE; | 1438 msaa_state |= STATE_SYSTEM_FOCUSABLE; |
1439 if (state & (1 << ui::AX_STATE_HASPOPUP)) | 1439 if (state & (1 << ui::AX_STATE_HASPOPUP)) |
1440 msaa_state |= STATE_SYSTEM_HASPOPUP; | 1440 msaa_state |= STATE_SYSTEM_HASPOPUP; |
1441 | 1441 if (state & (1 << ui::AX_STATE_HOVERED)) |
| 1442 msaa_state |= STATE_SYSTEM_HOTTRACKED; |
1442 if (state & (1 << ui::AX_STATE_INVISIBLE) || | 1443 if (state & (1 << ui::AX_STATE_INVISIBLE) || |
1443 GetData().role == ui::AX_ROLE_IGNORED) { | 1444 GetData().role == ui::AX_ROLE_IGNORED) { |
1444 msaa_state |= STATE_SYSTEM_INVISIBLE; | 1445 msaa_state |= STATE_SYSTEM_INVISIBLE; |
1445 } | 1446 } |
1446 if (state & (1 << ui::AX_STATE_LINKED)) | 1447 if (state & (1 << ui::AX_STATE_LINKED)) |
1447 msaa_state |= STATE_SYSTEM_LINKED; | 1448 msaa_state |= STATE_SYSTEM_LINKED; |
1448 if (state & (1 << ui::AX_STATE_OFFSCREEN)) | 1449 if (state & (1 << ui::AX_STATE_OFFSCREEN)) |
1449 msaa_state |= STATE_SYSTEM_OFFSCREEN; | 1450 msaa_state |= STATE_SYSTEM_OFFSCREEN; |
1450 if (state & (1 << ui::AX_STATE_PROTECTED)) | 1451 if (state & (1 << ui::AX_STATE_PROTECTED)) |
1451 msaa_state |= STATE_SYSTEM_PROTECTED; | 1452 msaa_state |= STATE_SYSTEM_PROTECTED; |
1452 if (state & (1 << ui::AX_STATE_READ_ONLY)) | 1453 if (state & (1 << ui::AX_STATE_READ_ONLY)) |
1453 msaa_state |= STATE_SYSTEM_READONLY; | 1454 msaa_state |= STATE_SYSTEM_READONLY; |
1454 if (state & (1 << ui::AX_STATE_SELECTABLE)) | 1455 if (state & (1 << ui::AX_STATE_SELECTABLE)) |
1455 msaa_state |= STATE_SYSTEM_SELECTABLE; | 1456 msaa_state |= STATE_SYSTEM_SELECTABLE; |
1456 if (state & (1 << ui::AX_STATE_SELECTED)) | 1457 if (state & (1 << ui::AX_STATE_SELECTED)) |
1457 msaa_state |= STATE_SYSTEM_SELECTED; | 1458 msaa_state |= STATE_SYSTEM_SELECTED; |
1458 if (state & (1 << ui::AX_STATE_DISABLED)) | 1459 if (state & (1 << ui::AX_STATE_DISABLED)) |
1459 msaa_state |= STATE_SYSTEM_UNAVAILABLE; | 1460 msaa_state |= STATE_SYSTEM_UNAVAILABLE; |
1460 if (state & (1 << ui::AX_STATE_BUSY)) | |
1461 msaa_state |= STATE_SYSTEM_BUSY; | |
1462 if (state & (1 << ui::AX_STATE_VISITED)) | |
1463 msaa_state |= STATE_SYSTEM_TRAVERSED; | |
1464 | |
1465 if (state & (1 << ui::AX_STATE_MULTISELECTABLE)) { | |
1466 msaa_state |= STATE_SYSTEM_EXTSELECTABLE; | |
1467 msaa_state |= STATE_SYSTEM_MULTISELECTABLE; | |
1468 } | |
1469 | |
1470 // Expose whether or not the mouse is over an element, but suppress | |
1471 // this for tests because it can make the test results flaky depending | |
1472 // on the position of the mouse. | |
1473 if (delegate_->ShouldIgnoreHoveredStateForTesting()) { | |
1474 if (state & (1 << ui::AX_STATE_HOVERED)) | |
1475 msaa_state |= STATE_SYSTEM_HOTTRACKED; | |
1476 } | |
1477 | 1461 |
1478 // Checked state | 1462 // Checked state |
1479 const auto checked_state = static_cast<ui::AXCheckedState>( | 1463 const auto checked_state = static_cast<ui::AXCheckedState>( |
1480 GetIntAttribute(ui::AX_ATTR_CHECKED_STATE)); | 1464 GetIntAttribute(ui::AX_ATTR_CHECKED_STATE)); |
1481 switch (checked_state) { | 1465 switch (checked_state) { |
1482 case ui::AX_CHECKED_STATE_TRUE: | 1466 case ui::AX_CHECKED_STATE_TRUE: |
1483 msaa_state |= data.role == ui::AX_ROLE_TOGGLE_BUTTON | 1467 msaa_state |= data.role == ui::AX_ROLE_TOGGLE_BUTTON |
1484 ? STATE_SYSTEM_PRESSED | 1468 ? STATE_SYSTEM_PRESSED |
1485 : STATE_SYSTEM_CHECKED; | 1469 : STATE_SYSTEM_CHECKED; |
1486 break; | 1470 break; |
(...skipping 12 matching lines...) Expand all Loading... |
1499 // menu bars, when visible. | 1483 // menu bars, when visible. |
1500 // | 1484 // |
1501 // TODO(dmazzoni): this should probably check if focus is actually inside | 1485 // TODO(dmazzoni): this should probably check if focus is actually inside |
1502 // the menu bar, but we don't currently track focus inside menu pop-ups, | 1486 // the menu bar, but we don't currently track focus inside menu pop-ups, |
1503 // and Chrome only has one menu visible at a time so this works for now. | 1487 // and Chrome only has one menu visible at a time so this works for now. |
1504 if (data.role == ui::AX_ROLE_MENU_BAR && | 1488 if (data.role == ui::AX_ROLE_MENU_BAR && |
1505 !(state & (1 << ui::AX_STATE_INVISIBLE))) { | 1489 !(state & (1 << ui::AX_STATE_INVISIBLE))) { |
1506 msaa_state |= STATE_SYSTEM_FOCUSED; | 1490 msaa_state |= STATE_SYSTEM_FOCUSED; |
1507 } | 1491 } |
1508 | 1492 |
1509 switch (GetData().role) { | |
1510 case ui::AX_ROLE_ARTICLE: | |
1511 case ui::AX_ROLE_BUSY_INDICATOR: | |
1512 case ui::AX_ROLE_DEFINITION: | |
1513 case ui::AX_ROLE_DESCRIPTION_LIST: | |
1514 case ui::AX_ROLE_DESCRIPTION_LIST_TERM: | |
1515 case ui::AX_ROLE_IFRAME: | |
1516 case ui::AX_ROLE_IMAGE: | |
1517 case ui::AX_ROLE_IMAGE_MAP: | |
1518 case ui::AX_ROLE_LIST: | |
1519 case ui::AX_ROLE_LIST_ITEM: | |
1520 case ui::AX_ROLE_PROGRESS_INDICATOR: | |
1521 case ui::AX_ROLE_RULER: | |
1522 case ui::AX_ROLE_SCROLL_AREA: | |
1523 case ui::AX_ROLE_TABLE_HEADER_CONTAINER: | |
1524 case ui::AX_ROLE_TERM: | |
1525 case ui::AX_ROLE_TIMER: | |
1526 case ui::AX_ROLE_TOOLBAR: | |
1527 case ui::AX_ROLE_TOOLTIP: | |
1528 msaa_state |= STATE_SYSTEM_READONLY; | |
1529 break; | |
1530 | |
1531 case ui::AX_ROLE_DOCUMENT: | |
1532 case ui::AX_ROLE_ROOT_WEB_AREA: | |
1533 case ui::AX_ROLE_WEB_AREA: | |
1534 msaa_state |= STATE_SYSTEM_READONLY; | |
1535 msaa_state |= STATE_SYSTEM_FOCUSABLE; | |
1536 break; | |
1537 | |
1538 case ui::AX_ROLE_GRID: | |
1539 // TODO(aleventhal) this changed between ARIA 1.0 and 1.1, | |
1540 // need to determine whether grids/treegrids should really be readonly | |
1541 // or editable by default | |
1542 // msaa_state |= STATE_SYSTEM_READONLY; | |
1543 break; | |
1544 | |
1545 case ui::AX_ROLE_IMAGE_MAP_LINK: | |
1546 msaa_state |= STATE_SYSTEM_LINKED; | |
1547 msaa_state |= STATE_SYSTEM_READONLY; | |
1548 break; | |
1549 | |
1550 case ui::AX_ROLE_LINK: | |
1551 msaa_state |= STATE_SYSTEM_LINKED; | |
1552 break; | |
1553 | |
1554 case ui::AX_ROLE_LIST_BOX_OPTION: | |
1555 if (msaa_state & STATE_SYSTEM_SELECTABLE) { | |
1556 msaa_state |= STATE_SYSTEM_FOCUSABLE; | |
1557 } | |
1558 break; | |
1559 | |
1560 case ui::AX_ROLE_MENU_LIST_OPTION: | |
1561 if (msaa_state & STATE_SYSTEM_SELECTABLE) { | |
1562 msaa_state |= STATE_SYSTEM_FOCUSABLE; | |
1563 } | |
1564 break; | |
1565 | |
1566 case ui::AX_ROLE_TEXT_FIELD: | |
1567 case ui::AX_ROLE_SEARCH_BOX: | |
1568 if (state & (1 << ui::AX_STATE_READ_ONLY)) | |
1569 msaa_state |= STATE_SYSTEM_READONLY; | |
1570 break; | |
1571 default: | |
1572 break; | |
1573 } | |
1574 | |
1575 // Compute the final value of READONLY for MSAA. | |
1576 // | |
1577 // We always set the READONLY state for elements that have the | |
1578 // aria-readonly attribute and for a few roles (in the switch above), | |
1579 // including read-only text fields. | |
1580 // The majority of focusable controls should not have the read-only state set. | |
1581 if (state & (1 << ui::AX_STATE_FOCUSABLE) && | |
1582 GetData().role != ROLE_SYSTEM_DOCUMENT && | |
1583 GetData().role != ROLE_SYSTEM_TEXT) { | |
1584 msaa_state &= ~(STATE_SYSTEM_READONLY); | |
1585 } | |
1586 if (!(state & (1 << ui::AX_STATE_READ_ONLY))) | |
1587 msaa_state &= ~(STATE_SYSTEM_READONLY); | |
1588 | |
1589 if (GetData().GetBoolAttribute(ui::AX_ATTR_ARIA_READONLY)) | |
1590 msaa_state |= STATE_SYSTEM_READONLY; | |
1591 | |
1592 return msaa_state; | 1493 return msaa_state; |
1593 } | 1494 } |
1594 | 1495 |
1595 int AXPlatformNodeWin::MSAAEvent(ui::AXEvent event) { | 1496 int AXPlatformNodeWin::MSAAEvent(ui::AXEvent event) { |
1596 switch (event) { | 1497 switch (event) { |
1597 case ui::AX_EVENT_ALERT: | 1498 case ui::AX_EVENT_ALERT: |
1598 return EVENT_SYSTEM_ALERT; | 1499 return EVENT_SYSTEM_ALERT; |
1599 case ui::AX_EVENT_FOCUS: | 1500 case ui::AX_EVENT_FOCUS: |
1600 return EVENT_OBJECT_FOCUS; | 1501 return EVENT_OBJECT_FOCUS; |
1601 case ui::AX_EVENT_MENU_START: | 1502 case ui::AX_EVENT_MENU_START: |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1715 | 1616 |
1716 AXPlatformNodeBase* base = | 1617 AXPlatformNodeBase* base = |
1717 FromNativeViewAccessible(node->GetNativeViewAccessible()); | 1618 FromNativeViewAccessible(node->GetNativeViewAccessible()); |
1718 if (base && !IsDescendant(base)) | 1619 if (base && !IsDescendant(base)) |
1719 base = nullptr; | 1620 base = nullptr; |
1720 | 1621 |
1721 return static_cast<AXPlatformNodeWin*>(base); | 1622 return static_cast<AXPlatformNodeWin*>(base); |
1722 } | 1623 } |
1723 | 1624 |
1724 } // namespace ui | 1625 } // namespace ui |
OLD | NEW |