Harry Cutts | 4461519 | 2022-04-21 22:39:14 | [diff] [blame] | 1 | # ChromiumOS Development Basics |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 2 | |
Harry Cutts | 4461519 | 2022-04-21 22:39:14 | [diff] [blame] | 3 | This document covers guidelines to keep in mind when working on the ChromiumOS |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 4 | project. |
| 5 | |
| 6 | [TOC] |
| 7 | |
| 8 | ## Documentation |
| 9 | |
| 10 | ### General guidelines |
| 11 | |
Harry Cutts | 4461519 | 2022-04-21 22:39:14 | [diff] [blame] | 12 | ChromiumOS follows the Chromium project's [documentation guidelines] and |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 13 | [documentation best practices]. |
| 14 | |
| 15 | ### Design documents |
| 16 | |
| 17 | Design documents typically describe the problem that you're trying to solve, |
| 18 | different approaches that you considered, and the path that you're planning to |
| 19 | take. They're useful for soliciting opinions from others before you start on the |
| 20 | implementation, but they also help your code reviewers get their bearings and |
| 21 | can answer other developers' "why was this done like that?" questions after the |
| 22 | work is complete (even after you've forgotten the reasons why!). On top of all |
| 23 | that, a design doc often helps you solidify a design in your own mind and |
| 24 | convince yourself that you're not missing anything. |
| 25 | |
| 26 | Most non-trivial additions of new functionality, and particularly ones that |
| 27 | require adding new daemons or new interactions between different processes, |
| 28 | should have their own design docs. For smaller changes, documenting what you're |
| 29 | doing and why in the issue tracker is often enough. |
| 30 | |
| 31 | Share your design docs with your team mailing list, if not with the full |
Harry Cutts | 4461519 | 2022-04-21 22:39:14 | [diff] [blame] | 32 | [chromium-os-dev] mailing list. See the existing [ChromiumOS design docs] and |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 33 | [Chromium design docs] for inspiration. |
| 34 | |
| 35 | ## Programming languages and style |
| 36 | |
Zach Reizner | cdfcbd3 | 2021-04-21 06:21:54 | [diff] [blame] | 37 | ### Rust |
| 38 | |
Harry Cutts | 4461519 | 2022-04-21 22:39:14 | [diff] [blame] | 39 | The newest userspace code in ChromiumOS is usually written in Rust to take |
Zach Reizner | cdfcbd3 | 2021-04-21 06:21:54 | [diff] [blame] | 40 | advantage of its improved security and ergonomics. Being a memory safe language |
| 41 | with a runtime overhead similar to C/C++ makes it uniquely suited for new code |
| 42 | with reduced incidence of security and stability bugs. |
| 43 | |
Harry Cutts | 4461519 | 2022-04-21 22:39:14 | [diff] [blame] | 44 | The Rust style guide is currently in development by the ChromiumOS Authors, but |
Zach Reizner | cdfcbd3 | 2021-04-21 06:21:54 | [diff] [blame] | 45 | it basically follows that of Rust's default rustfmt configuration. Additionally |
| 46 | clippy is used a linter, usually with certain lints suppressed. For an example |
| 47 | of what lints might be disabled, look at the [set from crosvm]. The [Rust on |
Harry Cutts | 4461519 | 2022-04-21 22:39:14 | [diff] [blame] | 48 | ChromeOS] document has more information. |
Zach Reizner | cdfcbd3 | 2021-04-21 06:21:54 | [diff] [blame] | 49 | |
| 50 | In certain cases C++ is the better choice for userspace code. In particular, |
| 51 | existing C++ projects should not be converted to Rust, except in exceptional |
| 52 | circumstances. However, new modules to existing C++ projects have been |
| 53 | successfully written in Rust. Other cases where C++ should be considered are |
| 54 | projects reliant on Mojo, which has no production ready Rust bindings. |
| 55 | |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 56 | ### C++ |
| 57 | |
Harry Cutts | 4461519 | 2022-04-21 22:39:14 | [diff] [blame] | 58 | Most userspace code in the ChromiumOS project is written in C++, whether it's |
Zach Reizner | cdfcbd3 | 2021-04-21 06:21:54 | [diff] [blame] | 59 | part of the Chrome browser itself or a system daemon exposing new functionality. |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 60 | |
Harry Cutts | 4461519 | 2022-04-21 22:39:14 | [diff] [blame] | 61 | The Chromium project, and by extension the ChromiumOS project, follow the |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 62 | [Google C++ style guide], with the [Chromium C++ style guide] layered on top to |
Grace Cham | f22a591 | 2022-06-07 08:04:28 | [diff] [blame] | 63 | provide additional guidelines and clarify ambiguities. |
| 64 | |
| 65 | The [Modern C++ use in Chromium] document lists which of the many new features |
| 66 | introduced in the C++11, 14, and 17 standard are allowed. ChromiumOS follows the |
Ian Barkley-Yeung | 9b9a233 | 2023-09-28 21:00:02 | [diff] [blame] | 67 | list except: |
| 68 | |
| 69 | 1. std::optional. It is banned on Chromium due to its undefined |
| 70 | behavior when a std::nullopt is dereferenced. However, ChromiumOS C++ is |
| 71 | hardened and will crash in such cases. Use std::optional instead of |
| 72 | absl::optional. |
| 73 | 2. C++20. Chromium does not allow C++20 features at all. ChromiumOS |
| 74 | supports C++20 and developers may use C++20 features. |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 75 | |
| 76 | New C++ programs should go into new directories in the [platform2 repository], |
| 77 | which is checked out to `src/platform2`. |
| 78 | |
| 79 | ### C |
| 80 | |
Harry Cutts | 4461519 | 2022-04-21 22:39:14 | [diff] [blame] | 81 | C should only be used for code that is part of the Linux kernel or ChromeOS |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 82 | firmware. |
| 83 | |
| 84 | Both kernel and firmware code should follow the [Linux kernel coding style]. The |
Harry Cutts | 4461519 | 2022-04-21 22:39:14 | [diff] [blame] | 85 | [Kernel Development] guide has more details about ChromeOS kernel development, and the |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 86 | [EC Development page] discusses firmware. |
| 87 | |
Clayton Whitelaw | 21a73a6 | 2021-12-01 18:23:58 | [diff] [blame] | 88 | Usage of C in new first-party userspace projects is strongly discouraged. Unless |
Harry Cutts | 4461519 | 2022-04-21 22:39:14 | [diff] [blame] | 89 | there is a critical, external to ChromeOS reason to write a new userspace |
Clayton Whitelaw | 21a73a6 | 2021-12-01 18:23:58 | [diff] [blame] | 90 | project in C, usage of C will be disallowed. |
| 91 | |
| 92 | `platform` and `platform2` OWNERS are encouraged to reject new C code in |
Harry Cutts | 4461519 | 2022-04-21 22:39:14 | [diff] [blame] | 93 | first-party userspace ChromeOS components. |
Clayton Whitelaw | 21a73a6 | 2021-12-01 18:23:58 | [diff] [blame] | 94 | |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 95 | ### Shell |
| 96 | |
| 97 | Sometimes shell scripting can be the best way to perform lightweight, |
Harry Cutts | 4461519 | 2022-04-21 22:39:14 | [diff] [blame] | 98 | non-persistent tasks that need to run periodically on ChromeOS systems, but |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 99 | there are also big downsides: it's much more difficult to write tests for shell |
| 100 | scripts than for C++ code, and scripts have a tendency to grow to the point |
| 101 | where they become difficult to maintain. If you're planning to add a shell |
| 102 | script that is likely to grow in complexity, consider instead using C++ from the |
| 103 | start to save yourself the trouble of rewriting it down the road. |
| 104 | |
Harry Cutts | 4461519 | 2022-04-21 22:39:14 | [diff] [blame] | 105 | Shell scripts are mainly used for a few categories of tasks in ChromeOS: |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 106 | |
| 107 | * Upstart initialization scripts, as in [src/platform2/init]. See the |
| 108 | [init STYLE file] and [init README file] for guidelines. |
Daniel Erat | e3b67cd | 2017-03-29 00:22:42 | [diff] [blame] | 109 | * Portage `.ebuild` files, as in the [chromiumos-overlay repository]. We |
| 110 | follow the upstream guidelines; see the [Ebuild Writing] page and |
| 111 | specifically the [Ebuild File Format]. |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 112 | * Miscellaneous development-related tasks |
| 113 | |
Mike Frysinger | 8a96b0f | 2023-11-20 06:27:48 | [diff] [blame] | 114 | Read the [ChromiumOS shell style guidelines] before writing scripts, with the |
| 115 | caveat that the Upstart or Portage guidelines take precedence when writing |
| 116 | those types of scripts. |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 117 | |
Mattias Nissler | 32b6aab | 2017-04-06 12:28:11 | [diff] [blame] | 118 | For shell scripts that ship with the OS image, be extra careful. The shell |
| 119 | provides powerful features, but the flip side is that security pitfalls are |
| 120 | tricky to avoid. Think twice whether your shell statements can have unintended |
| 121 | side effects, in particular if your script runs with full privileges (as is the |
| 122 | case with init scripts). As a guideline, keep things simple and move more |
| 123 | complex processing to a properly sandboxed environment in an C++ daemon. |
| 124 | |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 125 | ### Python |
| 126 | |
Harry Cutts | 4461519 | 2022-04-21 22:39:14 | [diff] [blame] | 127 | The Python interpreter is not included in production ChromeOS system images, |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 128 | but Python is used heavily for development and testing. |
| 129 | |
| 130 | We largely follow the [Google Python style guide], but see the |
Harry Cutts | 4461519 | 2022-04-21 22:39:14 | [diff] [blame] | 131 | [ChromiumOS Python style guidelines] for important differences, particularly |
Daniel Erat | e3b67cd | 2017-03-29 00:22:42 | [diff] [blame] | 132 | around indenting and naming. For tests, see the [autotest coding style]. |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 133 | |
| 134 | ## Testing |
| 135 | |
Harry Cutts | 4461519 | 2022-04-21 22:39:14 | [diff] [blame] | 136 | The [ChromiumOS testing site] is the main repository of information about |
Daniel Erat | 03138d4 | 2017-03-29 15:08:01 | [diff] [blame] | 137 | testing. |
| 138 | |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 139 | ### Unit tests |
| 140 | |
| 141 | Unit tests should be added alongside new code. It's important to design your |
| 142 | code with testability in mind, as adding tests after-the-fact often requires |
| 143 | heavy refactoring. |
| 144 | |
| 145 | Good unit tests are fast, lightweight, reliable, and easy to run within the |
| 146 | chroot as part of your development workflow. We use [Google Test] (which is |
Daniel Erat | e3b67cd | 2017-03-29 00:22:42 | [diff] [blame] | 147 | comprised of the GoogleTest unit testing framework and the GoogleMock mocking |
| 148 | framework) to test C++ code. [Why Google C++ Testing Framework?] and the |
| 149 | [Google Test FAQ] are good introductions, and the [unit testing document] has |
| 150 | more details about how unit tests get run. |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 151 | |
Harry Cutts | 4461519 | 2022-04-21 22:39:14 | [diff] [blame] | 152 | See the [Best practices for writing ChromeOS unit tests] document for more |
Daniel Erat | e522833 | 2017-08-30 00:17:07 | [diff] [blame] | 153 | guidance on writing good unit tests. |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 154 | |
| 155 | ### Autotest |
| 156 | |
Harry Cutts | 4461519 | 2022-04-21 22:39:14 | [diff] [blame] | 157 | [Autotest] is used to run tests on live ChromeOS systems. Autotests are useful |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 158 | for performing integration testing (e.g. verifying that two processes are able |
| 159 | to communicate with each other over IPC), but they have heavy costs: |
| 160 | |
| 161 | * Autotests are harder to run than unit tests: you need either a dedicated |
| 162 | test device or a virtual machine. |
| 163 | * Autotests are much slower than unit tests: even a no-op test can take 30 |
| 164 | seconds or longer per run. |
| 165 | * Since autotests involve at least a controlling system and a test device, |
| 166 | they're susceptible to networking issues and hardware flakiness. |
| 167 | * Since autotests run on full, live systems, failures can be caused by issues |
| 168 | in components unrelated to the one that you're trying to test. |
| 169 | |
| 170 | Whenever you can get equivalent coverage from either unit tests or autotests, |
| 171 | use unit tests. Design your system with unit testing in mind. |
| 172 | |
| 173 | ## Code reviews |
| 174 | |
Harry Cutts | 4461519 | 2022-04-21 22:39:14 | [diff] [blame] | 175 | The ChromiumOS project follows the [Chromium code review policy]: all code and |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 176 | data changes must be reviewed by another project member before being committed. |
Harry Cutts | 4461519 | 2022-04-21 22:39:14 | [diff] [blame] | 177 | Note that ChromiumOS's review process has some differences; see the |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 178 | [Developer Guide's code review instructions]. |
| 179 | |
Harry Cutts | 4461519 | 2022-04-21 22:39:14 | [diff] [blame] | 180 | OWNERS files are not (yet) enforced for non-browser parts of the ChromiumOS |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 181 | codebase, but please act as if they were. If there's an OWNERS file in the |
| 182 | directory that you're modifying or a parent directory, add at least one |
| 183 | developer that's listed in it to your code review and wait for their approval |
| 184 | before committing your change. |
| 185 | |
| 186 | Owners may want to consider setting up notifications for changes to their code. |
| 187 | To receive notifications of changes to `src/platform2/debugd`, open your |
| 188 | [Gerrit notification settings] and add a new entry for project |
| 189 | `chromiumos/platform2` and expression `file:"^debugd/.*"`. |
| 190 | |
| 191 | ## Issue trackers |
| 192 | |
Harry Cutts | 4461519 | 2022-04-21 22:39:14 | [diff] [blame] | 193 | Public ChromiumOS bugs and feature requests are tracked using the |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 194 | [chromium issue tracker]. Note that this tracker is shared with the Chromium |
| 195 | project; most OS-specific issues are classified under an `OS>`-prefixed |
| 196 | component and have an `OS=Chrome` label. The `crbug.com` redirector makes it |
| 197 | easy to jump directly to an issue with a given ID; `https://crbug.com/123` will |
| 198 | redirect to issue #123, for instance. |
| 199 | |
| 200 | Keep discussion in the issue tracker instead of in email or over IM. Issues |
| 201 | remain permanently available and are viewable by people not present for the |
| 202 | original discussion; email and IM exchanges are harder to find after the fact |
| 203 | and may even be deleted automatically. `BUG=chromium:123` lines in commit |
| 204 | descriptions and `https://crbug.com/123` mentions in code comments also make it |
| 205 | easy to link back to the issue that describes the original motivation for a |
| 206 | change. |
| 207 | |
| 208 | Avoid discussing multiple problems in a single issue. It's not possible to split |
| 209 | an existing issue into multiple new issues, and it can take a long time to read |
| 210 | through an issue's full history to figure out what is currently being discussed. |
| 211 | |
| 212 | Similarly, do not reopen an old, closed issue in response to the reoccurrence of |
| 213 | a bug: the old issue probably contains now-irrelevant milestone and merge labels |
| 214 | and outdated information. Instead, create a new issue and refer to the prior |
| 215 | issue in its initial description. Text of the form `issue 123` will |
| 216 | automatically be turned into a link. |
| 217 | |
Daniel Erat | 03138d4 | 2017-03-29 15:08:01 | [diff] [blame] | 218 | There is much more information about filing bugs and using labels in the |
| 219 | [Chromium bug reporting guidelines]. |
| 220 | |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 221 | ## Mailing lists |
| 222 | |
Mike Frysinger | 9874841 | 2018-10-09 07:56:19 | [diff] [blame] | 223 | See the [contact] document for more details. |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 224 | |
| 225 | ## Developing in the open |
| 226 | |
Harry Cutts | 4461519 | 2022-04-21 22:39:14 | [diff] [blame] | 227 | ChromiumOS is an open-source project. Whenever possible (i.e. when not |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 228 | discussing private, partner-related information), use the public issue tracker |
| 229 | and mailing lists rather than the internal versions. |
| 230 | |
Mike Frysinger | 9874841 | 2018-10-09 07:56:19 | [diff] [blame] | 231 | [contact]: contact.md |
Mike Frysinger | 9fc0fc0 | 2020-09-05 05:18:57 | [diff] [blame] | 232 | [documentation guidelines]: https://chromium.googlesource.com/chromium/src/+/HEAD/docs/documentation_guidelines.md |
| 233 | [documentation best practices]: https://chromium.googlesource.com/chromium/src/+/HEAD/docs/documentation_best_practices.md |
Harry Cutts | 4461519 | 2022-04-21 22:39:14 | [diff] [blame] | 234 | [ChromiumOS design docs]: https://www.chromium.org/chromium-os/chromiumos-design-docs |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 235 | [Chromium design docs]: https://www.chromium.org/developers/design-documents |
Zach Reizner | cdfcbd3 | 2021-04-21 06:21:54 | [diff] [blame] | 236 | [set from crosvm]: https://chromium.googlesource.com/chromiumos/platform/crosvm/+/HEAD/bin/clippy |
Harry Cutts | 4461519 | 2022-04-21 22:39:14 | [diff] [blame] | 237 | [Rust on ChromeOS]: https://chromium.googlesource.com/chromiumos/docs/+/HEAD/rust_on_cros.md |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 238 | [Google C++ style guide]: https://google.github.io/styleguide/cppguide.html |
Mike Frysinger | 9fc0fc0 | 2020-09-05 05:18:57 | [diff] [blame] | 239 | [Chromium C++ style guide]: https://chromium.googlesource.com/chromium/src/+/HEAD/styleguide/c++/c++.md |
Grace Cham | f22a591 | 2022-06-07 08:04:28 | [diff] [blame] | 240 | [Modern C++ use in Chromium]: https://chromium.googlesource.com/chromium/src/+/HEAD/styleguide/c++/c++-features.md |
Evan Benn | 4811c3a | 2019-10-31 00:18:42 | [diff] [blame] | 241 | [platform2 repository]: platform2_primer.md |
Mike Frysinger | 9fc0fc0 | 2020-09-05 05:18:57 | [diff] [blame] | 242 | [Linux kernel coding style]: https://github.com/torvalds/linux/blob/HEAD/Documentation/process/coding-style.rst |
Jesse Barnes | 704211c | 2020-07-22 21:37:32 | [diff] [blame] | 243 | [Kernel Development]: kernel_development.md |
Mike Frysinger | 9fc0fc0 | 2020-09-05 05:18:57 | [diff] [blame] | 244 | [EC Development page]: https://chromium.googlesource.com/chromiumos/platform/ec/+/HEAD/README.md |
| 245 | [src/platform2/init]: https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/init/ |
| 246 | [init STYLE file]: https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/init/STYLE |
| 247 | [init README file]: https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/init/README |
Mike Frysinger | 2db7b85 | 2020-09-10 08:37:44 | [diff] [blame] | 248 | [chromiumos-overlay repository]: https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 249 | [Ebuild Writing]: https://devmanual.gentoo.org/ebuild-writing/index.html |
| 250 | [Ebuild File Format]: https://devmanual.gentoo.org/ebuild-writing/file-format/index.html |
Harry Cutts | 4461519 | 2022-04-21 22:39:14 | [diff] [blame] | 251 | [ChromiumOS shell style guidelines]: styleguide/shell.md |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 252 | [Google Python style guide]: https://google.github.io/styleguide/pyguide.html |
Harry Cutts | 4461519 | 2022-04-21 22:39:14 | [diff] [blame] | 253 | [ChromiumOS Python style guidelines]: styleguide/python.md |
Mike Frysinger | 9fc0fc0 | 2020-09-05 05:18:57 | [diff] [blame] | 254 | [autotest coding style]: https://chromium.googlesource.com/chromiumos/third_party/autotest/+/HEAD/docs/coding-style.md |
Harry Cutts | 4461519 | 2022-04-21 22:39:14 | [diff] [blame] | 255 | [ChromiumOS testing site]: https://www.chromium.org/chromium-os/testing |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 256 | [Google Test]: https://github.com/google/googletest |
Mike Frysinger | 9fc0fc0 | 2020-09-05 05:18:57 | [diff] [blame] | 257 | [Why Google C++ Testing Framework?]: https://github.com/google/googletest/blob/HEAD/googletest/docs/primer.md |
| 258 | [Google Test FAQ]: https://github.com/google/googletest/blob/HEAD/googletest/docs/faq.md |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 259 | [unit testing document]: https://www.chromium.org/chromium-os/testing/adding-unit-tests-to-the-build |
Harry Cutts | 4461519 | 2022-04-21 22:39:14 | [diff] [blame] | 260 | [Best practices for writing ChromeOS unit tests]: testing/unit_tests.md |
Mike Frysinger | 9fc0fc0 | 2020-09-05 05:18:57 | [diff] [blame] | 261 | [Autotest]: https://chromium.googlesource.com/chromiumos/third_party/autotest/+/HEAD/docs/user-doc.md |
| 262 | [Chromium code review policy]: https://chromium.googlesource.com/chromium/src/+/HEAD/docs/code_reviews.md |
Evan Benn | 4811c3a | 2019-10-31 00:18:42 | [diff] [blame] | 263 | [Developer Guide's code review instructions]: developer_guide.md#Upload-your-changes-and-get-a-code-review |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 264 | [Gerrit notification settings]: https://chromium-review.googlesource.com/settings/#Notifications |
Mike Frysinger | 9fc0fc0 | 2020-09-05 05:18:57 | [diff] [blame] | 265 | [chromium issue tracker]: https://crbug.com/ |
Daniel Erat | 03138d4 | 2017-03-29 15:08:01 | [diff] [blame] | 266 | [Chromium bug reporting guidelines]: https://www.chromium.org/for-testers/bug-reporting-guidelines |
Daniel Erat | 0576ce7 | 2017-03-27 05:43:06 | [diff] [blame] | 267 | [chromium-os-dev]: https://groups.google.com/a/chromium.org/forum/#!forum/chromium-os-dev |