| # 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. |