| # CONTRIBUTING | 
 | In general, we follow the | 
 | [Chromium Contributing](https://chromium.googlesource.com/chromium/src/+/main/docs/contributing.md) | 
 | guidelines in PDFium. The code review process, and the build tools are all very | 
 | similar to Chromium. The PDFium | 
 | [README](https://pdfium.googlesource.com/pdfium/+/refs/heads/main/README.md) | 
 | outlines specific build and test information for PDFium. | 
 |  | 
 | This document focuses on how the PDFium project operates and how we’d like it | 
 | to operate in the future. This is a living document, please file bugs if you | 
 | think there are changes/updates which could be put in place to make it easier | 
 | to contribute to PDFium. | 
 |  | 
 | ## Communication | 
 | When writing a new feature or fixing an existing bug, get a second opinion | 
 | before investing effort in coding. Coordinating up front makes it much easier | 
 | to avoid frustration later on. | 
 |  | 
 | If it‘s a new feature, or updating existing code, first propose it to the | 
 | [mailing list](https://groups.google.com/forum/#!forum/pdfium). | 
 |  | 
 |  * If a change needs further context outside the CL, it should be tracked in | 
 |    the [bug system](https://bugs.chromium.org/p/pdfium). Bugs are the right | 
 |    place for long histories, discussion and debate, attaching screenshots, and | 
 |    linking to other associated bugs. Bugs are unnecessary for changes isolated | 
 |    enough to not need any of these. | 
 |  * If the work being implemented is especially complex or large a design | 
 |    document may be warranted. The document should be linked to the filled bug | 
 |    and be set to publicly viewable. | 
 |  * If there isn't a bug and there should be one, please file a new bug. | 
 |  * Just because there is a bug in the bug system doesn't necessarily mean that | 
 |    a patch will be accepted. | 
 |  | 
 | ## Public APIs | 
 | The public API of PDFium has grown over time. There are multiple mechanisms in | 
 | place to support this growth from the stability requirements to the versioning | 
 | fields. Along with those there are several other factors to be considered when | 
 | adding public APIs. | 
 |  | 
 |  * _Consistency_. We try to keep the APIs consistent with each other, this | 
 |    includes things like naming, parameter ordering and how parameters are | 
 |    handled. | 
 |  * _Generality_. PDFium is used in several places outside the browser. This | 
 |    could be server side, or in user applications. APIs should be designed to | 
 |    work in the general case, or such that they can be expanded to the general | 
 |    case if possible. | 
 |  * _Documentation_. All public APIs should be documented to include information | 
 |    on ownership of passed parameters, valid values being provided, error | 
 |    conditions and return values. | 
 |  * _Differentiate error conditions_. If at all possible, it should be possible | 
 |    to tell the difference between a valid failure and an error. | 
 |  * _Avoid global state_. APIs should receive the objects to be operated on | 
 |    instead of assuming they exist in a global context. | 
 |  | 
 | ### Stability | 
 | There are a lot of consumers of PDFium outside of Chromium. These include | 
 | LibreOffice, Android and offline conversion tooling. As such, a lot of care is | 
 | taken around the code in the | 
 | [public](https://pdfium.googlesource.com/pdfium/+/refs/heads/main/public/) | 
 | folder. When planning on changing the public API, the change should be preceded | 
 | by a bug being created and an email to the mailing list to gather feedback from | 
 | other PDFium embedders. | 
 |  | 
 | The only stability guarantees that PDFium provides are around the APIs in the | 
 | public folder. Any other interface in the system can be changed without notice. | 
 | If there are features needed which are not exposed through the public headers | 
 | you'll need to file a bug to get it added to the public APIs. | 
 |  | 
 | #### Experimental | 
 | All APIs start as Experimental. The experimental status is a documentation tag | 
 | which is added to the API, the first line of the API documentation should be | 
 | `// Experimental API.` | 
 |  | 
 | Experimental APIs may be changed or removed entirely without formal notice to | 
 | the community. | 
 |  | 
 | #### Stable | 
 | APIs eventually graduate to stable. This is done by removing the | 
 | `// Experimental API.` marker in the documentation. We endeavor to not change | 
 | stable APIs without notice to the community. | 
 |  | 
 | NOTE, the process of migrating from experimental to stable isn’t well defined | 
 | at this point. We have experimental APIs which have been that way for multiple | 
 | years. We should work to better define how this transition happens. | 
 |  | 
 | #### Deprecated | 
 | If the API is retired, it is marked as deprecated and will eventually be removed. | 
 | API deprecation should, ideally, come with a better replacement API and have a | 
 | 6-12 months deprecation period.  The pending removal should be recorded in the | 
 | documentation comment for the API and should also be recorded in the README with | 
 | the target removal timeframe. All deprecations should have an associated bug | 
 | attached to them. | 
 |  | 
 | ### Versioning | 
 | In order to allow the public API to expand there are `version` fields in some | 
 | structures. When the versioned structures are expanded those version fields | 
 | need to be incremented to cover the new additions. The code then needs to guard | 
 | against the structure being received having the required version number in | 
 | order to validate the new additions are available. | 
 |  | 
 | ## Trybot Access | 
 | Changes must pass the try bots before they are merged into the repo. For your | 
 | first few CLs the try bots will need to be triggered by a committer. After | 
 | you've submitted 2-3 CLs you can request try bot access by emailing one of the | 
 | OWNERS and requesting try bot access. This will allow you to trigger the bots | 
 | on your own changes without needing a committer. | 
 |  | 
 | ## Committers | 
 | All changes committed to PDFium must be reviewed by a committer. Committers | 
 | have done significant work in the PDFium code base and have a good overall | 
 | understanding of the system. | 
 |  | 
 | Contributors can become committers as they exhibit a strong understanding | 
 | of the code base. There is a general requirement for ~10 non-trivial CLs to be | 
 | written by the contributor before being considered for committership. The | 
 | contributor is then nominated by an existing committer and if the nomination is | 
 | accepted by two other committers they receive committer status. | 
 |  | 
 | ## OWNERS | 
 | The OWNERS files list long time committers to the project and have a broad | 
 | understanding of the code base and how the various pieces interact. In the | 
 | event of a code review stalling with a committer, the OWNERS are the first line | 
 | of escalation. The OWNERS files inherit up the tree, so an OWNER in a top-level | 
 | folder has OWNERS in the folders subdirectories. | 
 |  | 
 | There are a limited number of OWNERS files in PDFium at this time due to the | 
 | inherent interconnectedness of the code. We are hoping to expand the number of | 
 | OWNERS files to make them more targeted as the code quality progresses. | 
 |  | 
 | Committers can be added to OWNERS files when they exhibit a strong | 
 | understanding of the PDFium code base. This typically involves a combination of | 
 | significant CLs, code review on other contributor CLs, and working with the | 
 | other OWNERs to work through design and development considerations for the code. | 
 | An OWNER must be committed to upholding the principles for the long term health | 
 | of the project, take on a responsibility for reviewing future work, and | 
 | mentor new contributors. Once you are a committer, you should feel free to reach | 
 | out to the OWNERS who have reviewed your patches to ask what else they’d like to | 
 | see from you to be comfortable nominating you as an OWNER. Once nominated, | 
 | OWNERS are added or removed by rough consensus of the existing OWNERS. | 
 |  | 
 | ## Escalations | 
 | There are times when reviews stall due to differences between reviewers, | 
 | developers and OWNERS. If this happens, please escalate the situation to one of | 
 | the people in the top-level OWNERS file (or another of the owners if already | 
 | discussing with a top-level owner). If the disagreement has moved up through | 
 | all the OWNERS files in the PDFium repo, the escalation should then proceed to | 
 | the Chromium | 
 | [ATL_OWNERS](https://chromium.googlesource.com/chromium/src/+/refs/heads/main/ATL_OWNERS) | 
 | as the final deciders. | 
 |  | 
 | The | 
 | [Standard of Code Review](https://google.github.io/eng-practices/review/reviewer/standard.html) | 
 | document has some good guidance on resolving conflicts during code review. | 
 |  | 
 | ## CLA | 
 | All contributors must complete the Google contributor license agreement. For | 
 | individual contributors, please complete the | 
 | [Individual Contributor License Agreement](https://cla.developers.google.com/about/google-individual?csw=1) | 
 | online. Corporate contributors must fill out the | 
 | [Corporate Contributor License Agreement](https://cla.developers.google.com/about/google-corporate?csw=1) | 
 | and send it to us as described on that page. | 
 |  | 
 | Your first CL should add yourself to the | 
 | [AUTHORS](https://pdfium.googlesource.com/pdfium/+/refs/heads/main/AUTHORS) | 
 | file (unless you’re covered by one of the blanket entries). | 
 |  | 
 | ### External contributor checklist for reviewers | 
 | Before LGTMing a change, ensure that the contribution can be accepted: | 
 |  * Definition: The "author" is the email address that owns the code review | 
 |    request on | 
 |    [https://pdfium-review.googlesource.com](https://pdfium-review.googlesource.com/) | 
 |  * Ensure the author is already listed in | 
 |    [AUTHORS](https://pdfium.googlesource.com/pdfium/+/refs/heads/main/AUTHORS). | 
 |    In some cases, the author's company might have a wildcard rule | 
 |    (e.g. \*@google.com). | 
 |  * If the author or their company is not listed, the CL should include a new | 
 |    AUTHORS entry. | 
 |    * Ensure the new entry is reviewed by a reviewer who works for Google. | 
 |    * Contributor License Agreement can be verified by Googlers at | 
 |      [http://go/cla](http://go/cla) | 
 |    * If there is a corporate CLA for the author‘s company, it must list the | 
 |      person explicitly (or the list of authorized contributors must say | 
 |      something like "All employees"). If the author is not on their company’s | 
 |      roster, do not accept the change. | 
 |  | 
 | ## Legacy Code | 
 | The PDFium code base has been around in one form or another for a long time. As | 
 | such, there is a lot of legacy hidden in the existing code. There are surprising | 
 | interactions and untested corners of the code. We are actively working on | 
 | increasing code coverage on the existing code, and especially welcome additions | 
 | which move the coverage upwards. All new code should come with tests (either | 
 | unit tests or integration tests depending on the feature). | 
 |  | 
 | As part of this legacy nature, there is a good chance the code you’re working | 
 | with wasn’t designed to do what you need it to do. There are often refactorings | 
 | and bug fixes that end up happening along with feature development. Those | 
 | fixes/refactorings should be pulled out to their own changes with the | 
 | appropriate tests. This will make reviews a lot easier as, currently, it can be | 
 | hard to tell if there are far reaching effects of a given change. | 
 |  | 
 | There is a lot of existing technical debt that is being paid down in PDFium, | 
 | anything we can do here to make future development easier is a great benefit to | 
 | the project. This debt means means code reviews can take a bit longer if | 
 | research is needed to determine how a feature change will interact with the | 
 | rest of the system. |