iOS版Firefox Focus中的错误修复
大多数浏览器上的“私人浏览”并不全面,也不易于使用。 焦点是免费的,永远存在且始终在您身边的下一个级别的隐私-因为它得到了Mozilla的支持,Mozilla是为您的Web权利而战的非营利组织。 (摘自App Store中的应用说明)
它的功能之一是,如果您不想从Safari切换,仍然可以在Safari中使用Firefox Focus功能(请按照以下步骤操作)。
虫❌
问题在于,使用前后导航后,URL栏中的搜索文本与实际搜索不匹配。 让我们来看一个例子:
- 搜索“监护人”
- 搜索“ mozilla”
- 按回
- 搜索“ firefox”
- 按回
- 搜索页面显示 “监护人”请求的结果,但URL栏包含“ mozilla”而不是“监护人”。
修复🔧
问题的作者在那里留下了注释,表明该问题可能存在于SearchHistoryUtils
堆栈中。 它帮助我开始了对该问题的调查。
我找到了SearchHistoryUtils
类,其中包含两个布尔属性。
-
isFromURLBar
-
isNavigating
和四个功能:
-
pushSearchToStack(with searchedText: String)
—当用户发出新的搜索请求时,此函数将搜索推入堆栈。 -
pullSearchFromStack() -> String?
—此函数不会从堆栈中弹出搜索,而是返回当前搜索文本(如果存在)的值。 -
goForward()
—更新堆栈对象的isCurrentSearch值。 -
goBack()
-与#3相同
当我分析代码时,我取消了pullSearchFromStack
, goForward
和goBack
函数,因为它们并未真正处理堆栈更改。 因此,我开始调试pushSearchToStack
函数。 我调试了几个测试用例,然后让我们看一下我的发现。
因此,我几乎重现了问题中描述的错误,然后发现了问题:
当最后一个搜索不是当前搜索(例如,在执行第一个“返回”用户操作后的堆栈中),并且用户进行了新搜索时,最后一个搜索不会被新搜索覆盖(请查看上表中的红线) )。
这就是为什么当用户返回时,URL Bar会采用旧的搜索文本,那时候甚至不应该将其放在堆栈中。
让我们看一下pushSearchToStack
函数的一部分伪代码:
让我们分解上面的代码:
- 它声明一个空堆栈
currentStack
。 - 它将
currentStack
的值设置为全局状态searchedHistory
值的值。 - 然后,它遍历堆栈中的每个搜索,并将
isCurrentSearch
属性的值设置为false
。 - 它将新的搜索添加到堆栈,并将其
isCurrentSearch
属性设置为true
。
因此,我稍微玩了一下代码,并添加了一个检查是否最后一次搜索是当前搜索:
如果最后一个搜索不是当前搜索,则意味着用户单击了“后退”按钮,并且currentStack删除了它的最后一个元素。
我尝试模拟上述测试用例,并且按预期工作! URL栏中的搜索文本与搜索页面匹配。
但是,这不是最终解决方案。 如果用户回退了不止一次,这种方法将不起作用,因为上面的代码仅从堆栈中删除了最后一次搜索。
即使这是不对的,它也让我明白我的方法是正确的。
因此,我改进了代码:
现在,它检查上一次搜索是否为当前搜索。 如果不是当前搜索,它将在堆栈中查找currentSearch并从堆栈中删除以下所有搜索。
然后,它将具有isCurrentSearch
属性值为true
的新搜索添加到堆栈。
您可以在我的请求中找到全部捐款。
最后,让我们看一下浏览器的固定版本。