<?php
    $title = "Bug Reporting Guidelines";
    include("../header.inc");
?>
<h2>Bug Reporting Guidelines</h2>

<p>This document describes how to write a good WebKit bug report. Good bug reports help developers and quality assurance (QA) people decide
an appropriate priority and severity for a bug, and increase the chance that a bug will be fixed quickly. The more specific information
you can provide, the better.</p>

<ol>
    <li><b>Version</b>
    <p>
    Please select the WebKit version you were using when the bug occurred, or the closest matching version.
    </p>
    <p>
    Versions of WebKit that are not part of a Safari release have a <tt>+</tt> after the version number, and their version number
    is generally higher then the latest released version of WebKit. So, for example, <tt>528+</tt> is an unofficial build of WebKit
    that is newer than the <tt>525.x</tt> version that shipped as part of Safari 3.1.2.
    </p>
    <div style="display: none; text-align: center; font-weight: bold;" id="webkit_version"></div>
    <script type="text/javascript">
        var regex = new RegExp("AppleWebKit/(.*?)( |$)");
        var matches = regex.exec(navigator.userAgent);
        if (matches)
        {
            var webKitVersion = document.getElementById('webkit_version');
            webKitVersion.appendChild(document.createTextNode("You are currently using: "));
            var versionNumber = document.createElement("tt");
            versionNumber.appendChild(document.createTextNode(matches[1]));
            webKitVersion.appendChild(versionNumber);
            webKitVersion.style.display = "block";
        }
    </script>

    <li><b>Component</b>
        <p>If you know the precise cause of a bug (i.e., you've reduced it to a failing test case and know the reason), then you can
        assign a bug to a specific component such as <tt>CSS</tt> or <tt>HTML Editing</tt>.
        <p>If, however, there is any doubt in your mind as to the cause of the bug, then file it under <tt>New Bugs</tt>.  This component
        is the place for any bugs whose cause has not yet been determined.  Once someone has reduced the bug and knows the cause, then it
        will be moved from the <tt>New Bugs</tt> component to the appropriate place.</p>
    </li>

    <li>
        <b>Platform and OS</b>
        <p>Please select the platform and the OS version that your bug occurred on.  If you're running on Mac OS X this would often be platform
        <tt>Macintosh</tt> and OS <tt>Mac OS X 10.5</tt> (Leopard).  If you're running on Windows or Linux, please select <tt>PC</tt> for platform
        and the appropriate entry from the OS field.  If your exact system is not listed, please select the closest entry and provide further
        details in the description of the bug report.
    </li>

    <li>
        <b>Priority</b>
        <p>Normally a QA person or developer will set this, so the bug submitter can leave this at the default value. A number of
        <a href="bugpriorities.html">guidelines</a> and some individual judgment are involved in setting the priority. If you know the
        bug is a regression, ie. something is wrong which wasn't wrong in previous versions of WebKit, you can set this to P1.</p>
    </li>

    <li>
        <b>Severity</b>
        <p>In most cases you should leave this at <tt>normal</tt>, but if you are confident that your bug is <tt>trivial</tt> or an
        <tt>enhancement</tt>, it's helpful to specify that value. A QA person or developer will set this to some other value if
        appropriate.</p>
    </li>

    <li><b>URL</b>
        <p>Fill in this field with the URL of a page that shows the bug, when possible. If you have created a <a href="reduction.html">test case reduction</a> for the bug,
        please add it to the bug report as an attachment rather than putting it on a web server and listing its URL here. Doing so
        makes it easier to work on the bug, and can be a first step towards checking in the test case along with the bug fix.</p>
    </li>

    <li><b>Summary</b>
    <p>A good summary explains the problem in clear and specific terms, but is often concise enough to fit within the default summary space in Bugzilla.
        One should be able to tell exactly what a bug is about just by reading the summary.</p>

    Tips for a good summary:
    <ul>
        <li>Include the domain of the page that shows the bug (especially if it's an important site)
        <li>If the bug is a crash, note this and note whether or not the crash is reproducible
        <li>If you have tested and verified that this is a regression from a previous version of WebKit, prepend "REGRESSION: " to the summary
        <li>If you know the range of revisions in which the regression occurred, add this to the summary after REGRESSION (i.e., "REGRESSION(r31201-r31211):")
    </ul>
    </li><br>

    <li><b>Description</b>
    <p>In this field, write a more detailed explanation of the problem.</p>

    Tips for Descriptions:
    <ul>
        <li>Do not include more than one bug in one bug report.</li>
        <li>If you built WebKit yourself or used a nightly build, include the SVN revision number as well as information about if you are using WebKit with Qt, GTK+, wxWidgets, etc.</li>
        <li>If loading a single URL is not enough to show the bug (for instance, you have to click through multiple pages for the bug to occur), then describe the exact navigation required to reach the page where the bug occurs. Don't just say "go to the forums"; use detailed steps.</li>
        <li>Look at the system console and include any messages that might be relevant in the bug.</li>
        <li>Include <a href="crashlogs.html">the backtrace</a> if you get a crash, if possible. File the bug first and then add the backtrace as an attachment.</li>
        <li>Include a screenshot for visual bugs. If the problem isn't very obvious, include a single screenshot which shows both correct and incorrect renderings,
            for example Safari and another browser such as Firefox or Internet Explorer.  On the Mac you can use Grab.app or Cmd-Shift-4 and capture a snap that demonstrates
            the problem. You can then attach the screenshot to the bug.</li>
        <li>Be as specific as possible. For instance, if you're describing a problem that occurs while scrolling, note in the bug whether you're scrolling with arrow
            keys, arrow buttons, scroll thumb, clicking above or below the thumb, scroll-wheel mouse, etc.</li>
    </ul></li><br>

    <li>
        <b>Depends on</b>
        <p>If the fix for this bug depends on another bug fix, put the other bug's number here. Otherwise, leave it empty.</p>
    </li>

    <li>
        <b>Blocks</b>
        <p>If this bug blocks another bug from being fixed, put the other bug's number here. Otherwise, leave it empty.</p>
    </li>
</ol>
<?php include("../footer.inc"); ?>
