{"action":"created","comment":{"url":"https://api.github.com/repos/nvaccess/nvda/pulls/comments/77956052","id":77956052,"diff_hunk":"@@ -0,0 +1,330 @@\n+#A part of NonVisual Desktop Access (NVDA)\r\n+#This file is covered by the GNU General Public License.\r\n+#See the file COPYING for more details.\r\n+#Copyright (C) 2015-2016 NV Access Limited\r\n+\r\n+from ctypes import byref\r\n+from comtypes import COMError\r\n+from comtypes.automation import VARIANT\r\n+import winUser\r\n+import UIAHandler\r\n+from UIAUtils import *\r\n+import treeInterceptorHandler\r\n+import cursorManager\r\n+import textInfos\r\n+import browseMode\r\n+from NVDAObjects.UIA import UIA\r\n+\r\n+class UIATextRangeQuickNavItem(browseMode.TextInfoQuickNavItem):\r\n+\r\n+\tdef __init__(self,itemType,document,UIAElementOrRange):\r\n+\t\tif isinstance(UIAElementOrRange,UIAHandler.IUIAutomationElement):\r\n+\t\t\tUIATextRange=document.rootNVDAObject.UIATextPattern.rangeFromChild(UIAElementOrRange)\r\n+\t\t\tself._UIAElement=UIAElementOrRange\r\n+\t\telif isinstance(UIAElementOrRange,UIAHandler.IUIAutomationTextRange):\r\n+\t\t\tUIATextRange=UIAElementOrRange\r\n+\t\t\tself._UIAElement=None\r\n+\t\telse:\r\n+\t\t\traise ValueError(\"Invalid UIAElementOrRange\")\r\n+\t\ttextInfo=document.TextInfo(document,None,_rangeObj=UIATextRange)\r\n+\t\tsuper(UIATextRangeQuickNavItem,self).__init__(itemType,document,textInfo)\r\n+\r\n+\t@property\r\n+\tdef obj(self):\r\n+\t\tif self._UIAElement:\r\n+\t\t\tUIAElement=self._UIAElement.buildUpdatedCache(UIAHandler.handler.baseCacheRequest)\r\n+\t\t\treturn UIA(UIAElement=UIAElement)\r\n+\t\treturn self.textInfo.NVDAObjectAtStart\r\n+\r\n+\t@property\r\n+\tdef label(self):\r\n+\t\tif self.itemType==\"landmark\":\r\n+\t\t\tobj=self.obj\r\n+\t\t\tname=obj.name\r\n+\t\t\tlandmarkType=obj.UIAElement.getCurrentPropertyValue(UIAHandler.UIA_LocalizedLandmarkTypePropertyId)\r\n+\t\t\treturn \" \".join(x for x in (name,landmarkType) if x)\r\n+\t\treturn super(UIATextRangeQuickNavItem,self).label\r\n+\r\n+class HeadingUIATextInfoQuickNavItem(browseMode.TextInfoQuickNavItem):\r\n+\r\n+\tdef __init__(self,itemType,document,position,level=0):\r\n+\t\tsuper(HeadingUIATextInfoQuickNavItem,self).__init__(itemType,document,position)\r\n+\t\tself.level=level\r\n+\r\n+\tdef isChild(self,parent):\r\n+\t\tif not isinstance(parent,HeadingUIATextInfoQuickNavItem):\r\n+\t\t\treturn False\r\n+\t\treturn self.level>parent.level\r\n+\r\n+def UIAHeadingQuicknavIterator(itemType,document,position,direction=\"next\"):\r\n+\tif position:\r\n+\t\tcurPosition=position\r\n+\telse:\r\n+\t\tcurPosition=document.makeTextInfo(textInfos.POSITION_LAST if direction==\"previous\" else textInfos.POSITION_FIRST)\r\n+\tstop=False\r\n+\tfirstLoop=True\r\n+\twhile not stop:\r\n+\t\ttempInfo=curPosition.copy()\r\n+\t\ttempInfo.expand(textInfos.UNIT_CHARACTER)\r\n+\t\tstyleIDValue=getUIATextAttributeValueFromRange(tempInfo._rangeObj,UIAHandler.UIA_StyleIdAttributeId)\r\n+\t\tif (UIAHandler.StyleId_Heading1<=styleIDValue<=UIAHandler.StyleId_Heading9):\r\n+\t\t\tfoundLevel=(styleIDValue-UIAHandler.StyleId_Heading1)+1\r\n+\t\t\twantedLevel=int(itemType[7:]) if len(itemType)>7 else None\r\n+\t\t\tif not wantedLevel or wantedLevel==foundLevel: \r\n+\t\t\t\tif not firstLoop or not position:\r\n+\t\t\t\t\ttempInfo.expand(textInfos.UNIT_PARAGRAPH)\r\n+\t\t\t\t\tyield HeadingUIATextInfoQuickNavItem(itemType,document,tempInfo,level=foundLevel)\r\n+\t\tstop=(curPosition.move(textInfos.UNIT_PARAGRAPH,1 if direction==\"next\" else -1)==0)\r\n+\t\tfirstLoop=False\r\n+\r\n+def UIAControlQuicknavIterator(itemType,document,position,UIACondition,direction=\"next\"):\r\n+\t# A part from the condition given, we must always match on the root of the document so we know when to stop walking\r\n+\truntimeID=VARIANT()\r\n+\tdocument.rootNVDAObject.UIAElement._IUIAutomationElement__com_GetCurrentPropertyValue(UIAHandler.UIA_RuntimeIdPropertyId,byref(runtimeID))\r\n+\tUIACondition=UIAHandler.handler.clientObject.createOrCondition(UIAHandler.handler.clientObject.createPropertyCondition(UIAHandler.UIA_RuntimeIdPropertyId,runtimeID),UIACondition)\r\n+\tif not position:\r\n+\t\t# All items are requested (such as for elements list)\r\n+\t\telements=document.rootNVDAObject.UIAElement.findAll(UIAHandler.TreeScope_Descendants,UIACondition)\r\n+\t\tif elements:\r\n+\t\t\tfor index in xrange(elements.length):\r\n+\t\t\t\telement=elements.getElement(index)\r\n+\t\t\t\ttry:\r\n+\t\t\t\t\telementRange=document.rootNVDAObject.UIATextPattern.rangeFromChild(element)\r\n+\t\t\t\texcept COMError:\r\n+\t\t\t\t\telementRange=None\r\n+\t\t\t\tif elementRange:\r\n+\t\t\t\t\tyield UIATextRangeQuickNavItem(itemType,document,elementRange)\r\n+\t\treturn\r\n+\tif direction==\"up\":\r\n+\t\twalker=UIAHandler.handler.clientObject.createTreeWalker(UIACondition)\r\n+\t\t# some implementations (Edge, Word) do not correctly  class embedded objects (graphics, checkboxes) as being the enclosing element, even when the range is completely within them. Rather, they still list the object in getChildren.\r\n+\t\t# Thus we must check getChildren before getEnclosingElement.\r\n+\t\ttempRange=position._rangeObj.clone()\r\n+\t\ttempRange.expandToEnclosingUnit(UIAHandler.TextUnit_Character)\r\n+\t\tchildren=tempRange.getChildren()\r\n+\t\tif children.length==1:\r\n+\t\t\telement=children.getElement(0)\r\n+\t\telse:\r\n+\t\t\telement=position._rangeObj.getEnclosingElement()\r\n+\t\telement=walker.normalizeElement(element)\r\n+\t\tif element and not UIAHandler.handler.clientObject.compareElements(element,document.rootNVDAObject.UIAElement) and not UIAHandler.handler.clientObject.compareElements(element,UIAHandler.handler.rootElement):\r\n+\t\t\tyield UIATextRangeQuickNavItem(itemType,document,element)\r\n+\t\treturn\r\n+\telif direction==\"previous\":\r\n+\t\t# Fetching items previous to the given position.\r\n+\t\t# When getting children of a UIA text range, Edge will incorrectly include a child that starts at the end of the range. \r\n+\t\t# Therefore move back by one character to stop this.\r\n+\t\ttoPosition=position._rangeObj.clone()\r\n+\t\ttoPosition.move(UIAHandler.TextUnit_Character,-1)\r\n+\t\tchild=toPosition.getEnclosingElement()\r\n+\t\tchildRange=document.rootNVDAObject.UIATextPattern.rangeFromChild(child)\r\n+\t\ttoPosition.MoveEndpointByRange(UIAHandler.TextPatternRangeEndpoint_Start,childRange,UIAHandler.TextPatternRangeEndpoint_Start)\r\n+\t\t# Fetch the last child of this text range.\r\n+\t\t# But if its own range extends beyond the end of our position:\r\n+\t\t# We know that the child is not the deepest descendant,\r\n+\t\t# And therefore we Limit our children fetching range to the start of this child,\r\n+\t\t# And fetch the last child again.\r\n+\t\tzoomedOnce=False\r\n+\t\twhile True:\r\n+\t\t\tchildren=toPosition.getChildren()\r\n+\t\t\tlength=children.length\r\n+\t\t\tif length==0:\r\n+\t\t\t\tif zoomedOnce:\r\n+\t\t\t\t\tchild=toPosition.getEnclosingElement()\r\n+\t\t\t\tbreak\r\n+\t\t\tchild=children.getElement(length-1)\r\n+\t\t\ttry:\r\n+\t\t\t\tchildRange=document.rootNVDAObject.UIATextPattern.rangeFromChild(child)\r\n+\t\t\texcept COMError:\r\n+\t\t\t\treturn\r\n+\t\t\tif childRange.CompareEndpoints(UIAHandler.TextPatternRangeEndpoint_End,position._rangeObj,UIAHandler.TextPatternRangeEndpoint_End)>0 and childRange.CompareEndpoints(UIAHandler.TextPatternRangeEndpoint_Start,toPosition,UIAHandler.TextPatternRangeEndpoint_Start)>0:\r\n+\t\t\t\ttoPosition.MoveEndpointByRange(UIAHandler.TextPatternRangeEndpoint_Start,childRange,UIAHandler.TextPatternRangeEndpoint_Start)\r\n+\t\t\t\tzoomedOnce=True\r\n+\t\t\t\tcontinue\r\n+\t\t\tbreak\r\n+\t\tif not child or UIAHandler.handler.clientObject.compareElements(child,document.rootNVDAObject.UIAElement):\r\n+\t\t\t# We're on the document itself -- probably nothing in it.\r\n+\t\t\treturn\r\n+\t\t# Work out if this child is previous to our position or not.\r\n+\t\t# If it isn't, then we know we still need to move parent or previous before it is safe to emit an item.\r\n+\t\ttry:\r\n+\t\t\tchildRange=document.rootNVDAObject.UIATextPattern.rangeFromChild(child)\r\n+\t\texcept COMError:\r\n+\t\t\treturn\r\n+\t\tgonePreviousOnce=childRange.CompareEndpoints(UIAHandler.TextPatternRangeEndpoint_End,position._rangeObj,UIAHandler.TextPatternRangeEndpoint_Start)<=0\r\n+\t\twalker=UIAHandler.handler.clientObject.createTreeWalker(UIACondition)\r\n+\t\tcurElement=child\r\n+\t\t# Start traversing from this child backward through the document, emitting items for valid elements.\r\n+\t\tcurElementMatchedCondition=False\r\n+\t\tgoneParent=False\r\n+\t\twhile curElement:\r\n+\t\t\tif gonePreviousOnce and not goneParent: \r\n+\t\t\t\tlastChild=getDeepestLastChildUIAElementInWalker(curElement,walker)\r\n+\t\t\t\tif lastChild:\r\n+\t\t\t\t\tcurElement=lastChild\r\n+\t\t\t\t\tcurElementMatchedCondition=True\r\n+\t\t\t\telif not curElementMatchedCondition and isUIAElementInWalker(curElement,walker):\r\n+\t\t\t\t\tcurElementMatchedCondition=True\r\n+\t\t\t\tif curElementMatchedCondition:\r\n+\t\t\t\t\tyield UIATextRangeQuickNavItem(itemType,document,curElement)\r\n+\t\t\tpreviousSibling=walker.getPreviousSiblingElement(curElement)\r\n+\t\t\tif previousSibling:\r\n+\t\t\t\tgonePreviousOnce=True\r\n+\t\t\t\tgoneParent=False\r\n+\t\t\t\tcurElement=previousSibling\r\n+\t\t\t\tcurElementMatchedCondition=True\r\n+\t\t\t\tcontinue\r\n+\t\t\tparent=walker.getParentElement(curElement)\r\n+\t\t\tif parent and not UIAHandler.handler.clientObject.compareElements(document.rootNVDAObject.UIAElement,parent):\r\n+\t\t\t\tcurElement=parent\r\n+\t\t\t\tgoneParent=True\r\n+\t\t\t\tcurElementMatchedCondition=True\r\n+\t\t\t\tif gonePreviousOnce:\r\n+\t\t\t\t\tyield UIATextRangeQuickNavItem(itemType,document,curElement)\r\n+\t\t\t\tcontinue\r\n+\t\t\tcurElement=None\r\n+\telse: # direction is next\r\n+\t\t# Fetching items after the given position.\r\n+\t\t# Extend the end of the range forward to the end of the document so that we will be able to fetch children from this point onwards. \r\n+\t\t# Fetch the first child of this text range.\r\n+\t\t# But if its own range extends before the start of our position:\r\n+\t\t# We know that the child is not the deepest descendant,\r\n+\t\t# And therefore we Limit our children fetching range to the end of this child,\r\n+\t\t# And fetch the first child again.\r\n+\t\tchild=position._rangeObj.getEnclosingElement()\r\n+\t\tchildRange=document.rootNVDAObject.UIATextPattern.rangeFromChild(child)\r\n+\t\ttoPosition=position._rangeObj.clone()\r\n+\t\ttoPosition.MoveEndpointByRange(UIAHandler.TextPatternRangeEndpoint_End,childRange,UIAHandler.TextPatternRangeEndpoint_End)\r\n+\t\tzoomedOnce=False\r\n+\t\twhile True:\r\n+\t\t\tchildren=toPosition.getChildren()\r\n+\t\t\tlength=children.length\r\n+\t\t\tif length==0:\r\n+\t\t\t\tif zoomedOnce:\r\n+\t\t\t\t\tchild=toPosition.getEnclosingElement()\r\n+\t\t\t\tbreak\r\n+\t\t\tchild=children.getElement(0)\r\n+\t\t\ttry:\r\n+\t\t\t\tchildRange=document.rootNVDAObject.UIATextPattern.rangeFromChild(child)\r\n+\t\t\texcept COMError:\r\n+\t\t\t\treturn\r\n+\t\t\tif childRange.CompareEndpoints(UIAHandler.TextPatternRangeEndpoint_Start,position._rangeObj,UIAHandler.TextPatternRangeEndpoint_Start)<0 and childRange.CompareEndpoints(UIAHandler.TextPatternRangeEndpoint_End,toPosition,UIAHandler.TextPatternRangeEndpoint_End)<0:\r\n+\t\t\t\ttoPosition.MoveEndpointByRange(UIAHandler.TextPatternRangeEndpoint_End,childRange,UIAHandler.TextPatternRangeEndpoint_End)\r\n+\t\t\t\tzoomedOnce=True\r\n+\t\t\t\tcontinue\r\n+\t\t\tbreak\r\n+\t\t# Work out if this child is after our position or not.\r\n+\t\tif not child or UIAHandler.handler.clientObject.compareElements(child,document.rootNVDAObject.UIAElement):\r\n+\t\t\t# We're on the document itself -- probably nothing in it.\r\n+\t\t\treturn\r\n+\t\ttry:\r\n+\t\t\tchildRange=document.rootNVDAObject.UIATextPattern.rangeFromChild(child)\r\n+\t\texcept COMError:\r\n+\t\t\treturn\r\n+\t\tgoneNextOnce=childRange.CompareEndpoints(UIAHandler.TextPatternRangeEndpoint_Start,position._rangeObj,UIAHandler.TextPatternRangeEndpoint_Start)>0\r\n+\t\twalker=UIAHandler.handler.clientObject.createTreeWalker(UIACondition)\r\n+\t\tcurElement=child\r\n+\t\t# If we are already past our position, and this is a valid child\r\n+\t\t# Then we can emit an item already\r\n+\t\tif goneNextOnce and isUIAElementInWalker(curElement,walker):\r\n+\t\t\tyield UIATextRangeQuickNavItem(itemType,document,curElement)\r\n+\t\t# Start traversing from this child forwards through the document, emitting items for valid elements.\r\n+\t\twhile curElement:\r\n+\t\t\tfirstChild=walker.getFirstChildElement(curElement) if goneNextOnce else None\r\n+\t\t\tif firstChild:\r\n+\t\t\t\tcurElement=firstChild\r\n+\t\t\t\tyield UIATextRangeQuickNavItem(itemType,document,curElement)\r\n+\t\t\telse:\r\n+\t\t\t\tnextSibling=None\r\n+\t\t\t\twhile not nextSibling:\r\n+\t\t\t\t\tnextSibling=walker.getNextSiblingElement(curElement)\r\n+\t\t\t\t\tif not nextSibling:\r\n+\t\t\t\t\t\tparent=walker.getParentElement(curElement)\r\n+\t\t\t\t\t\tif parent and not UIAHandler.handler.clientObject.compareElements(document.rootNVDAObject.UIAElement,parent):\r\n+\t\t\t\t\t\t\tcurElement=parent\r\n+\t\t\t\t\t\telse:\r\n+\t\t\t\t\t\t\treturn\r\n+\t\t\t\tcurElement=nextSibling\r\n+\t\t\t\tgoneNextOnce=True\r\n+\t\t\t\tyield UIATextRangeQuickNavItem(itemType,document,curElement)\r\n+\r\n+class UIABrowseModeDocumentTextInfo(browseMode.BrowseModeDocumentTextInfo,treeInterceptorHandler.RootProxyTextInfo):\r\n+\tpass\r\n+\r\n+class UIABrowseModeDocument(browseMode.BrowseModeDocumentTreeInterceptor):\r\n+\r\n+\tTextInfo=UIABrowseModeDocumentTextInfo\r\n+\r\n+\tdef _iterNodesByType(self,nodeType,direction=\"next\",pos=None):\r\n+\t\tif nodeType.startswith(\"heading\"):\r\n+\t\t\treturn UIAHeadingQuicknavIterator(nodeType,self,pos,direction=direction)\r\n+\t\telif nodeType==\"link\":\r\n+\t\t\tcondition=UIAHandler.handler.clientObject.createPropertyCondition(UIAHandler.UIA_ControlTypePropertyId,UIAHandler.UIA_HyperlinkControlTypeId)\r\n+\t\t\treturn UIAControlQuicknavIterator(nodeType,self,pos,condition,direction)\r\n+\t\telif nodeType==\"checkBox\":\r\n+\t\t\tcondition=UIAHandler.handler.clientObject.createPropertyCondition(UIAHandler.UIA_ControlTypePropertyId,UIAHandler.UIA_CheckBoxControlTypeId)\r\n+\t\t\treturn UIAControlQuicknavIterator(nodeType,self,pos,condition,direction)\r\n+\t\telif nodeType==\"radioButton\":\r\n+\t\t\tcondition=UIAHandler.handler.clientObject.createPropertyCondition(UIAHandler.UIA_ControlTypePropertyId,UIAHandler.UIA_RadioButtonControlTypeId)\r\n+\t\t\treturn UIAControlQuicknavIterator(nodeType,self,pos,condition,direction)\r\n+\t\telif nodeType==\"comboBox\":\r\n+\t\t\tcondition=UIAHandler.handler.clientObject.createPropertyCondition(UIAHandler.UIA_ControlTypePropertyId,UIAHandler.UIA_ComboBoxControlTypeId)\r\n+\t\t\treturn UIAControlQuicknavIterator(nodeType,self,pos,condition,direction)\r\n+\t\telif nodeType==\"graphic\":\r\n+\t\t\tcondition=UIAHandler.handler.clientObject.createPropertyCondition(UIAHandler.UIA_ControlTypePropertyId,UIAHandler.UIA_ImageControlTypeId)\r\n+\t\t\treturn UIAControlQuicknavIterator(nodeType,self,pos,condition,direction)\r\n+\t\telif nodeType==\"table\":\r\n+\t\t\tcondition=UIAHandler.handler.clientObject.createPropertyCondition(UIAHandler.UIA_ControlTypePropertyId,UIAHandler.UIA_TableControlTypeId)\r\n+\t\t\treturn UIAControlQuicknavIterator(nodeType,self,pos,condition,direction)\r\n+\t\telif nodeType==\"separator\":\r\n+\t\t\tcondition=UIAHandler.handler.clientObject.createPropertyCondition(UIAHandler.UIA_ControlTypePropertyId,UIAHandler.UIA_SeparatorControlTypeId)\r\n+\t\t\treturn UIAControlQuicknavIterator(nodeType,self,pos,condition,direction)\r\n+\t\telif nodeType==\"focusable\":\r\n+\t\t\tcondition=UIAHandler.handler.clientObject.createPropertyCondition(UIAHandler.UIA_IsKeyboardFocusablePropertyId,True)\r\n+\t\t\treturn UIAControlQuicknavIterator(nodeType,self,pos,condition,direction)\r\n+\t\telif nodeType==\"list\":\r\n+\t\t\tcondition=createUIAMultiPropertyCondition({UIAHandler.UIA_ControlTypePropertyId:UIAHandler.UIA_ListControlTypeId,UIAHandler.UIA_IsKeyboardFocusablePropertyId:False})\r\n+\t\t\treturn UIAControlQuicknavIterator(nodeType,self,pos,condition,direction)\r\n+\t\telif nodeType==\"container\":\r\n+\t\t\tcondition=createUIAMultiPropertyCondition({UIAHandler.UIA_ControlTypePropertyId:UIAHandler.UIA_ListControlTypeId,UIAHandler.UIA_IsKeyboardFocusablePropertyId:False},{UIAHandler.UIA_ControlTypePropertyId:UIAHandler.UIA_TableControlTypeId})\r\n+\t\t\treturn UIAControlQuicknavIterator(nodeType,self,pos,condition,direction)\r\n+\t\telif nodeType==\"edit\":\r\n+\t\t\tcondition=createUIAMultiPropertyCondition({UIAHandler.UIA_ControlTypePropertyId:UIAHandler.UIA_EditControlTypeId,UIAHandler.UIA_ValueIsReadOnlyPropertyId:False})\r","path":"source/UIABrowseMode.py","position":292,"original_position":292,"commit_id":"30721d110234731e198a96fbf862b2c02b315665","original_commit_id":"30721d110234731e198a96fbf862b2c02b315665","user":{"login":"derekriemer","id":5350077,"avatar_url":"https://avatars.githubusercontent.com/u/5350077?v=3","gravatar_id":"","url":"https://api.github.com/users/derekriemer","html_url":"https://github.com/derekriemer","followers_url":"https://api.github.com/users/derekriemer/followers","following_url":"https://api.github.com/users/derekriemer/following{/other_user}","gists_url":"https://api.github.com/users/derekriemer/gists{/gist_id}","starred_url":"https://api.github.com/users/derekriemer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/derekriemer/subscriptions","organizations_url":"https://api.github.com/users/derekriemer/orgs","repos_url":"https://api.github.com/users/derekriemer/repos","events_url":"https://api.github.com/users/derekriemer/events{/privacy}","received_events_url":"https://api.github.com/users/derekriemer/received_events","type":"User","site_admin":false},"body":"Hi:\r\nI don't think there's a reliable heuristic for doing this, but I was experimenting with google.com, and NVDA doesn't move to the editable combo with e.\r\n1. go to google.com in edge.\r\n2. Type e. \r\n3. type c.\r\nTechnically, we might be able to do some ugly heuristic that says if there's a combobox with an aria-autocomplete we should let return it in the iterator, but I'm not sure if this is semantically correct, and/or if this is just downright wrong.","created_at":"2016-09-08T07:15:43Z","updated_at":"2016-09-08T07:15:43Z","html_url":"https://github.com/nvaccess/nvda/pull/6271#discussion_r77956052","pull_request_url":"https://api.github.com/repos/nvaccess/nvda/pulls/6271","_links":{"self":{"href":"https://api.github.com/repos/nvaccess/nvda/pulls/comments/77956052"},"html":{"href":"https://github.com/nvaccess/nvda/pull/6271#discussion_r77956052"},"pull_request":{"href":"https://api.github.com/repos/nvaccess/nvda/pulls/6271"}}},"pull_request":{"url":"https://api.github.com/repos/nvaccess/nvda/pulls/6271","id":81427545,"html_url":"https://github.com/nvaccess/nvda/pull/6271","diff_url":"https://github.com/nvaccess/nvda/pull/6271.diff","patch_url":"https://github.com/nvaccess/nvda/pull/6271.patch","issue_url":"https://api.github.com/repos/nvaccess/nvda/issues/6271","number":6271,"state":"open","locked":false,"title":"Initial support for Windows 10 anniversary versions of both Microsoft Edge and Windows 10 Mail.","user":{"login":"michaelDCurran","id":14154141,"avatar_url":"https://avatars.githubusercontent.com/u/14154141?v=3","gravatar_id":"","url":"https://api.github.com/users/michaelDCurran","html_url":"https://github.com/michaelDCurran","followers_url":"https://api.github.com/users/michaelDCurran/followers","following_url":"https://api.github.com/users/michaelDCurran/following{/other_user}","gists_url":"https://api.github.com/users/michaelDCurran/gists{/gist_id}","starred_url":"https://api.github.com/users/michaelDCurran/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/michaelDCurran/subscriptions","organizations_url":"https://api.github.com/users/michaelDCurran/orgs","repos_url":"https://api.github.com/users/michaelDCurran/repos","events_url":"https://api.github.com/users/michaelDCurran/events{/privacy}","received_events_url":"https://api.github.com/users/michaelDCurran/received_events","type":"User","site_admin":false},"body":"Fixes #6292. Fixes #5987.","created_at":"2016-08-16T07:43:44Z","updated_at":"2016-09-08T07:15:43Z","closed_at":null,"merged_at":null,"merge_commit_sha":"eb2f0a5621eca5383337fbe194e8af17cc3ddc62","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/nvaccess/nvda/pulls/6271/commits","review_comments_url":"https://api.github.com/repos/nvaccess/nvda/pulls/6271/comments","review_comment_url":"https://api.github.com/repos/nvaccess/nvda/pulls/comments{/number}","comments_url":"https://api.github.com/repos/nvaccess/nvda/issues/6271/comments","statuses_url":"https://api.github.com/repos/nvaccess/nvda/statuses/30721d110234731e198a96fbf862b2c02b315665","head":{"label":"nvaccess:edgeRS1","ref":"edgeRS1","sha":"30721d110234731e198a96fbf862b2c02b315665","user":{"login":"nvaccess","id":4166525,"avatar_url":"https://avatars.githubusercontent.com/u/4166525?v=3","gravatar_id":"","url":"https://api.github.com/users/nvaccess","html_url":"https://github.com/nvaccess","followers_url":"https://api.github.com/users/nvaccess/followers","following_url":"https://api.github.com/users/nvaccess/following{/other_user}","gists_url":"https://api.github.com/users/nvaccess/gists{/gist_id}","starred_url":"https://api.github.com/users/nvaccess/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nvaccess/subscriptions","organizations_url":"https://api.github.com/users/nvaccess/orgs","repos_url":"https://api.github.com/users/nvaccess/repos","events_url":"https://api.github.com/users/nvaccess/events{/privacy}","received_events_url":"https://api.github.com/users/nvaccess/received_events","type":"Organization","site_admin":false},"repo":{"id":45885732,"name":"nvda","full_name":"nvaccess/nvda","owner":{"login":"nvaccess","id":4166525,"avatar_url":"https://avatars.githubusercontent.com/u/4166525?v=3","gravatar_id":"","url":"https://api.github.com/users/nvaccess","html_url":"https://github.com/nvaccess","followers_url":"https://api.github.com/users/nvaccess/followers","following_url":"https://api.github.com/users/nvaccess/following{/other_user}","gists_url":"https://api.github.com/users/nvaccess/gists{/gist_id}","starred_url":"https://api.github.com/users/nvaccess/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nvaccess/subscriptions","organizations_url":"https://api.github.com/users/nvaccess/orgs","repos_url":"https://api.github.com/users/nvaccess/repos","events_url":"https://api.github.com/users/nvaccess/events{/privacy}","received_events_url":"https://api.github.com/users/nvaccess/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/nvaccess/nvda","description":"NVDA, the free and open source Screen Reader for Microsoft Windows","fork":false,"url":"https://api.github.com/repos/nvaccess/nvda","forks_url":"https://api.github.com/repos/nvaccess/nvda/forks","keys_url":"https://api.github.com/repos/nvaccess/nvda/keys{/key_id}","collaborators_url":"https://api.github.com/repos/nvaccess/nvda/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/nvaccess/nvda/teams","hooks_url":"https://api.github.com/repos/nvaccess/nvda/hooks","issue_events_url":"https://api.github.com/repos/nvaccess/nvda/issues/events{/number}","events_url":"https://api.github.com/repos/nvaccess/nvda/events","assignees_url":"https://api.github.com/repos/nvaccess/nvda/assignees{/user}","branches_url":"https://api.github.com/repos/nvaccess/nvda/branches{/branch}","tags_url":"https://api.github.com/repos/nvaccess/nvda/tags","blobs_url":"https://api.github.com/repos/nvaccess/nvda/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/nvaccess/nvda/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/nvaccess/nvda/git/refs{/sha}","trees_url":"https://api.github.com/repos/nvaccess/nvda/git/trees{/sha}","statuses_url":"https://api.github.com/repos/nvaccess/nvda/statuses/{sha}","languages_url":"https://api.github.com/repos/nvaccess/nvda/languages","stargazers_url":"https://api.github.com/repos/nvaccess/nvda/stargazers","contributors_url":"https://api.github.com/repos/nvaccess/nvda/contributors","subscribers_url":"https://api.github.com/repos/nvaccess/nvda/subscribers","subscription_url":"https://api.github.com/repos/nvaccess/nvda/subscription","commits_url":"https://api.github.com/repos/nvaccess/nvda/commits{/sha}","git_commits_url":"https://api.github.com/repos/nvaccess/nvda/git/commits{/sha}","comments_url":"https://api.github.com/repos/nvaccess/nvda/comments{/number}","issue_comment_url":"https://api.github.com/repos/nvaccess/nvda/issues/comments{/number}","contents_url":"https://api.github.com/repos/nvaccess/nvda/contents/{+path}","compare_url":"https://api.github.com/repos/nvaccess/nvda/compare/{base}...{head}","merges_url":"https://api.github.com/repos/nvaccess/nvda/merges","archive_url":"https://api.github.com/repos/nvaccess/nvda/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/nvaccess/nvda/downloads","issues_url":"https://api.github.com/repos/nvaccess/nvda/issues{/number}","pulls_url":"https://api.github.com/repos/nvaccess/nvda/pulls{/number}","milestones_url":"https://api.github.com/repos/nvaccess/nvda/milestones{/number}","notifications_url":"https://api.github.com/repos/nvaccess/nvda/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/nvaccess/nvda/labels{/name}","releases_url":"https://api.github.com/repos/nvaccess/nvda/releases{/id}","deployments_url":"https://api.github.com/repos/nvaccess/nvda/deployments","created_at":"2015-11-10T03:47:11Z","updated_at":"2016-09-07T14:56:12Z","pushed_at":"2016-09-08T06:50:13Z","git_url":"git://github.com/nvaccess/nvda.git","ssh_url":"git@github.com:nvaccess/nvda.git","clone_url":"https://github.com/nvaccess/nvda.git","svn_url":"https://github.com/nvaccess/nvda","homepage":null,"size":104935,"stargazers_count":168,"watchers_count":168,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":83,"mirror_url":null,"open_issues_count":2418,"forks":83,"open_issues":2418,"watchers":168,"default_branch":"master"}},"base":{"label":"nvaccess:master","ref":"master","sha":"f5ade272cac48743bab125da99613e44f12d2064","user":{"login":"nvaccess","id":4166525,"avatar_url":"https://avatars.githubusercontent.com/u/4166525?v=3","gravatar_id":"","url":"https://api.github.com/users/nvaccess","html_url":"https://github.com/nvaccess","followers_url":"https://api.github.com/users/nvaccess/followers","following_url":"https://api.github.com/users/nvaccess/following{/other_user}","gists_url":"https://api.github.com/users/nvaccess/gists{/gist_id}","starred_url":"https://api.github.com/users/nvaccess/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nvaccess/subscriptions","organizations_url":"https://api.github.com/users/nvaccess/orgs","repos_url":"https://api.github.com/users/nvaccess/repos","events_url":"https://api.github.com/users/nvaccess/events{/privacy}","received_events_url":"https://api.github.com/users/nvaccess/received_events","type":"Organization","site_admin":false},"repo":{"id":45885732,"name":"nvda","full_name":"nvaccess/nvda","owner":{"login":"nvaccess","id":4166525,"avatar_url":"https://avatars.githubusercontent.com/u/4166525?v=3","gravatar_id":"","url":"https://api.github.com/users/nvaccess","html_url":"https://github.com/nvaccess","followers_url":"https://api.github.com/users/nvaccess/followers","following_url":"https://api.github.com/users/nvaccess/following{/other_user}","gists_url":"https://api.github.com/users/nvaccess/gists{/gist_id}","starred_url":"https://api.github.com/users/nvaccess/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nvaccess/subscriptions","organizations_url":"https://api.github.com/users/nvaccess/orgs","repos_url":"https://api.github.com/users/nvaccess/repos","events_url":"https://api.github.com/users/nvaccess/events{/privacy}","received_events_url":"https://api.github.com/users/nvaccess/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/nvaccess/nvda","description":"NVDA, the free and open source Screen Reader for Microsoft Windows","fork":false,"url":"https://api.github.com/repos/nvaccess/nvda","forks_url":"https://api.github.com/repos/nvaccess/nvda/forks","keys_url":"https://api.github.com/repos/nvaccess/nvda/keys{/key_id}","collaborators_url":"https://api.github.com/repos/nvaccess/nvda/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/nvaccess/nvda/teams","hooks_url":"https://api.github.com/repos/nvaccess/nvda/hooks","issue_events_url":"https://api.github.com/repos/nvaccess/nvda/issues/events{/number}","events_url":"https://api.github.com/repos/nvaccess/nvda/events","assignees_url":"https://api.github.com/repos/nvaccess/nvda/assignees{/user}","branches_url":"https://api.github.com/repos/nvaccess/nvda/branches{/branch}","tags_url":"https://api.github.com/repos/nvaccess/nvda/tags","blobs_url":"https://api.github.com/repos/nvaccess/nvda/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/nvaccess/nvda/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/nvaccess/nvda/git/refs{/sha}","trees_url":"https://api.github.com/repos/nvaccess/nvda/git/trees{/sha}","statuses_url":"https://api.github.com/repos/nvaccess/nvda/statuses/{sha}","languages_url":"https://api.github.com/repos/nvaccess/nvda/languages","stargazers_url":"https://api.github.com/repos/nvaccess/nvda/stargazers","contributors_url":"https://api.github.com/repos/nvaccess/nvda/contributors","subscribers_url":"https://api.github.com/repos/nvaccess/nvda/subscribers","subscription_url":"https://api.github.com/repos/nvaccess/nvda/subscription","commits_url":"https://api.github.com/repos/nvaccess/nvda/commits{/sha}","git_commits_url":"https://api.github.com/repos/nvaccess/nvda/git/commits{/sha}","comments_url":"https://api.github.com/repos/nvaccess/nvda/comments{/number}","issue_comment_url":"https://api.github.com/repos/nvaccess/nvda/issues/comments{/number}","contents_url":"https://api.github.com/repos/nvaccess/nvda/contents/{+path}","compare_url":"https://api.github.com/repos/nvaccess/nvda/compare/{base}...{head}","merges_url":"https://api.github.com/repos/nvaccess/nvda/merges","archive_url":"https://api.github.com/repos/nvaccess/nvda/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/nvaccess/nvda/downloads","issues_url":"https://api.github.com/repos/nvaccess/nvda/issues{/number}","pulls_url":"https://api.github.com/repos/nvaccess/nvda/pulls{/number}","milestones_url":"https://api.github.com/repos/nvaccess/nvda/milestones{/number}","notifications_url":"https://api.github.com/repos/nvaccess/nvda/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/nvaccess/nvda/labels{/name}","releases_url":"https://api.github.com/repos/nvaccess/nvda/releases{/id}","deployments_url":"https://api.github.com/repos/nvaccess/nvda/deployments","created_at":"2015-11-10T03:47:11Z","updated_at":"2016-09-07T14:56:12Z","pushed_at":"2016-09-08T06:50:13Z","git_url":"git://github.com/nvaccess/nvda.git","ssh_url":"git@github.com:nvaccess/nvda.git","clone_url":"https://github.com/nvaccess/nvda.git","svn_url":"https://github.com/nvaccess/nvda","homepage":null,"size":104935,"stargazers_count":168,"watchers_count":168,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":83,"mirror_url":null,"open_issues_count":2418,"forks":83,"open_issues":2418,"watchers":168,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/nvaccess/nvda/pulls/6271"},"html":{"href":"https://github.com/nvaccess/nvda/pull/6271"},"issue":{"href":"https://api.github.com/repos/nvaccess/nvda/issues/6271"},"comments":{"href":"https://api.github.com/repos/nvaccess/nvda/issues/6271/comments"},"review_comments":{"href":"https://api.github.com/repos/nvaccess/nvda/pulls/6271/comments"},"review_comment":{"href":"https://api.github.com/repos/nvaccess/nvda/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/nvaccess/nvda/pulls/6271/commits"},"statuses":{"href":"https://api.github.com/repos/nvaccess/nvda/statuses/30721d110234731e198a96fbf862b2c02b315665"}}}}
{"actor":{"display_login":"derekriemer"}}