| 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 |