跳到内容

开始贡献

WebKit 实施了严格的代码贡献流程和政策,以维护代码质量。

开始贡献前的设置

请运行以下命令来设置您的环境以创建拉取请求。

git webkit setup

git-webkitsetup 子命令会配置您的本地 WebKit 检出,以便向 WebKit 项目贡献代码。此脚本会偶尔提示用户输入。该脚本执行以下操作:

提交拉取请求

首先,请务必为您要添加或修复的内容提交一个错误报告!或者,找到您认为与您正在进行的修复相关的错误报告。

假设您正在基于“main”分支工作,一旦您的补丁正常运行且测试通过,只需运行

git webkit pr --issue <your bug number here>

这将从 bugs.webkit.org 拉取详细信息,创建一个新的 git 分支,并为您生成一个提交消息。如有必要,请添加更多详细信息,描述您添加、修改或修复的内容。

一旦您的拉取请求在 GitHub 上,预警系统 (Early Warning System, EWS) 将自动构建并针对您的代码更改运行测试。这使得贡献者在将代码更改提交到 WebKit 仓库之前就能发现构建或测试失败。

请注意,如果您想提交一个草稿拉取请求,可以通过运行以下命令:

git webkit pr --draft

处理评审反馈

在 GitHub 上收到评审反馈后,您应该与评审者协作处理反馈。

完成后,您可以通过再次简单地运行以下命令来更新您的拉取请求以包含更改:

git webkit pr

提交更改

合并队列

如果您有提交者权限,您可以通过向拉取请求添加 safe-merge-queuemerge-queueunsafe-merge-queue 标签来提交拉取请求。这些标签将分别把您的拉取请求放入 Safe-Merge-QueueMerge-QueueUnsafe-Merge-Queue,它们会将您的拉取请求提交到 WebKit 仓库。如果您不是提交者,可以使用 request-merge-queue,以便评审补丁的人可以将其添加到队列中。

每个队列都会运行样式检查,并将评审者信息插入到提交消息和修改后的更改日志中。它们在提交更改之前通过检查提交消息来验证拉取请求是否已进行评审。

Safe-Merge-Queue 每 15 分钟检查一次带标签的拉取请求的状态。一旦所有 EWS 测试通过,拉取请求将自动提交。如果测试失败,拉取请求将被标记为“merging-blocked”(合并受阻)。

Merge-Queue 在提交更改之前验证拉取请求是否在 macOS 上构建并通过 WK2 布局测试。

Unsafe-Merge-Queue 不执行任何额外的验证,应仅用于影响最小的更改(例如设置测试预期、添加到 contributors.json)或需要快速提交的更改(例如构建修复或回滚)。

git-webkit land

提交更改应通过合并队列完成,这里概述了 git-webkit land 的当前行为

要提交更改,请从要提交的分支运行 git-webkit land。请注意,只有提交者才有权限将更改提交到 WebKit 仓库。git-webkit land 执行以下操作:

  • 检查以确保拉取请求已获批准且未被阻止
  • 将评审者姓名插入到提交消息中
  • 对拉取请求进行基于其父分支的 rebase
  • 标准化要提交的提交
  • 使用已提交的提交更新拉取请求

编码风格

您编写的代码必须遵循 WebKit 的编码风格指南。您可以运行 Tools/Scripts/check-webkit-style 来检查您的代码是否遵循编码指南(它可能报告误报或漏报)。如果您使用 Tools/Scripts/webkit-patch upload 上传您的补丁,它会自动对您更改的代码运行样式检查器,因此无需单独运行 check-webkit-style

样式检查器无法自动修复它发现的代码样式问题。假设您的补丁已作为 PR 分支的 HEAD 提交,您可以重新格式化代码并修改您的补丁,如下所示:

Tools/Scripts/webkit-patch format -g HEAD
git commit -a --amend --no-edit

然后您可以再次尝试 Tools/Scripts/webkit-patch upload

代码库的一些旧部分不遵循这些准则。如果您正在修改此类代码,通常最好将其清理以符合当前的准则。

便捷工具

Tools/Scripts/webkit-patch 提供了许多实用函数,例如在 bugs.webkit.org 上应用最新补丁 (apply-from-bug) 和将补丁 (upload --git-commit=<commit hash>) 上传到 bugs.webkit.org 上的错误报告。使用 --all-commands 可列出此工具支持的所有命令。

回归测试

一旦您进行了代码更改,您需要运行上述测试(布局测试、API 测试等...)以确保您的代码更改不会破坏现有功能。如今,在 bugs.webkit.org 上上传补丁会触发预警系统 (EWS)。

对于任何错误修复或功能添加,都应该有一个新的测试来演示代码更改引起的行为变化。如果无法以合理的方式编写此类测试(例如,修复难以重现的竞争条件),则应在附带的提交消息中解释编写测试不切实际的原因。

任何引入新测试失败或性能回归的补丁都可能被还原。为了您的利益,请等待预警系统在所有相关平台上完全构建和测试您的补丁。

提交消息

提交消息作为更改日志,为 WebKit 项目的所有更改提供历史文档。运行 git-webkit setup 会配置您的 git 钩子以正确生成提交消息。

第一行应包含提交消息的简短描述(这应与 Bugzilla 中的“摘要”字段相同)。在下一行,输入 Bugzilla URL。在“Reviewed by”行下方,输入您的更改的详细描述。提交消息底部将列出修改的文件和函数。鼓励您在此处添加评论。(请参阅下面的提交作为参考)。不必担心“Reviewed by NOBODY (OOPS!)”这一行,GitHub 会在合并时更新此字段。

Allow downsampling when invoking Remove Background or Copy Subject
https://bugs.webkit.org/show_bug.cgi?id=242048

Reviewed by NOBODY (OOPS!).

Soft-link `vk_cgImageRemoveBackgroundWithDownsizing` from VisionKitCore, and call into it to perform
background removal when performing Remove Background or Copy Subject, if available. On recent builds
of Ventura and iOS 16, VisionKit will automatically reject hi-res (> 12MP) images from running
through subject analysis; for clients such as WebKit, this new SPI allows us to opt into
downsampling these large images, instead of failing outright.

* Source/WebCore/PAL/pal/cocoa/VisionKitCoreSoftLink.h:
* Source/WebCore/PAL/pal/cocoa/VisionKitCoreSoftLink.mm:
* Source/WebCore/PAL/pal/spi/cocoa/VisionKitCoreSPI.h:
* Source/WebKit/Platform/cocoa/ImageAnalysisUtilities.h:
* Source/WebKit/Platform/cocoa/ImageAnalysisUtilities.mm:
(WebKit::requestBackgroundRemoval):

Refactor the code so that we call `vk_cgImageRemoveBackgroundWithDownsizing` if it's available, and
otherwise fall back to `vk_cgImageRemoveBackground`.

* Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm:
(-[WKContentView doAfterComputingImageAnalysisResultsForBackgroundRemoval:]):
(-[WKContentView _completeImageAnalysisRequestForContextMenu:requestIdentifier:hasTextResults:]):
(-[WKContentView imageAnalysisGestureDidTimeOut:]):
* Source/WebKit/UIProcess/mac/WebContextMenuProxyMac.mm:
(WebKit::WebContextMenuProxyMac::appendMarkupItemToControlledImageMenuIfNeeded):
(WebKit::WebContextMenuProxyMac::getContextMenuFromItems):

Additionally, remove the `cropRect` completion handler argument, since the new SPI function no
longer provides this information. The `cropRect` argument was also unused after removing support for
revealing the subject, in `249582@main`.

如果 git webkit commit 未检测到新测试的添加,则会出现“No new tests. (OOPS!)”这一行。如果您的补丁不需要测试用例(或测试用例不可能),请删除此行并解释您为什么没有编写测试。否则,所有更改都需要测试用例,并且应在提交消息中提及。