iOS版Firefox Focus中的错误修复

大多数浏览器上的“私人浏览”并不全面,也不易于使用。 焦点是免费的,永远存在且始终在您身边的下一个级别的隐私-因为它得到了Mozilla的支持,Mozilla是为您的Web权利而战的非营利组织。 (摘自App Store中的应用说明)

它的功能之一是,如果您不想从Safari切换,仍然可以在Safari中使用Firefox Focus功能(请按照以下步骤操作)。

虫❌

问题在于,使用前后导航后,URL栏中的搜索文本与实际搜索不匹配。 让我们来看一个例子:

  1. 搜索“监护人”
  2. 搜索“ mozilla”
  3. 按回
  4. 搜索“ firefox”
  5. 按回
  6. 搜索页面显示 “监护人”请求的结果,但URL栏包含“ mozilla”而不是“监护人”。

修复🔧

问题的作者在那里留下了注释,表明该问题可能存在于SearchHistoryUtils堆栈中。 它帮助我开始了对该问题的调查。

我找到了SearchHistoryUtils类,其中包含两个布尔属性。

  1. isFromURLBar
  2. isNavigating

和四个功能:

  1. pushSearchToStack(with searchedText: String) —当用户发出新的搜索请求时,此函数将搜索推入堆栈。
  2. pullSearchFromStack() -> String? —此函数不会从堆栈中弹出搜索,而是返回当前搜索文本(如果存在)的值。
  3. goForward() —更新堆栈对象的isCurrentSearch值。
  4. goBack() -与#3相同

当我分析代码时,我取消了pullSearchFromStackgoForwardgoBack函数,因为它们并未真正处理堆栈更改。 因此,我开始调试pushSearchToStack函数。 我调试了几个测试用例,然后让我们看一下我的发现。

因此,我几乎重现了问题中描述的错误,然后发现了问题:

当最后一个搜索不是当前搜索(例如,在执行第一个“返回”用户操作后的堆栈中),并且用户进行了新搜索时,最后一个搜索不会被新搜索覆盖(请查看上表中的红线) )。

这就是为什么当用户返回时,URL Bar会采用旧的搜索文本,那时候甚至不应该将其放在堆栈中。

让我们看一下pushSearchToStack函数的一部分伪代码:

让我们分解上面的代码:

  1. 它声明一个空堆栈currentStack
  2. 它将currentStack的值设置为全局状态searchedHistory值的值。
  3. 然后,它遍历堆栈中的每个搜索,并将isCurrentSearch属性的值设置为false
  4. 它将新的搜索添加到堆栈,并将其isCurrentSearch属性设置为true

因此,我稍微玩了一下代码,并添加了一个检查是否最后一次搜索是当前搜索:

如果最后一个搜索不是当前搜索,则意味着用户单击了“后退”按钮,并且currentStack删除了它的最后一个元素。

我尝试模拟上述测试用例,并且按预期工作! URL栏中的搜索文本与搜索页面匹配。

但是,这不是最终解决方案。 如果用户回退了不止一次,这种方法将不起作用,因为上面的代码仅从堆栈中删除了最后一次搜索。

即使这是不对的,它也让我明白我的方法是正确的。

因此,我改进了代码:

现在,它检查上一次搜索是否为当前搜索。 如果不是当前搜索,它将在堆栈中查找currentSearch并从堆栈中删除以下所有搜索。

然后,它将具有isCurrentSearch属性值为true的新搜索添加到堆栈。

您可以在我的请求中找到全部捐款。

最后,让我们看一下浏览器的固定版本。