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

<h3>You have found a bug? Here are 5 steps to getting it fixed!</h3>
<ol>
<li>
<strong>Check your WebKit version</strong><br>
<script type="text/javascript">
    /* 
    Copyright (C) 2006 Joost de Valk, http://www.joostdevalk.nl/.  All rights reserved.
    Copyright (C) 2006 Mark Rowe, http://bdash.net.nz/.  All rights reserved.
    Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
    
    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:
    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    
    THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
    PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
    CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
    OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    
    Script used for recognizing Safari / Shiira / WebKit. 
    A matrix of WebKit versions and OS X versions can be found at:
    http://developer.apple.com/internet/safari/uamatrix.html .
    */
    function parse_version(version)
    {
        var bits = version.split(".");
        var is_nightly = (version[version.length - 1] == "+");
        return {major: parseInt(bits[0]), minor: parseInt(bits[1]), is_nightly: is_nightly};
    }
    
    function display(id, display_style)
    {
        document.getElementById(id).style.display = display_style;
    }
    
    function get_version()
    {
        // Check for Safari
        var regex = new RegExp("Mozilla/5.0 \\(.*\\) AppleWebKit/(.*) \\(KHTML, like Gecko\\) Safari/(.*)");
        var matches = regex.exec(navigator.userAgent);

        var is_safari = false;
        var is_shiira = false;
        
        if (matches) {
            is_safari = true;
            display('safari_bug', 'block');
        } else {
            // Check for Shiira
            var regex = new RegExp("Mozilla/5.0 \\(.*\\) AppleWebKit/(.*) \\(KHTML, like Gecko\\) Shiira/(.*) Safari/(.*)");
            var matches = regex.exec(navigator.userAgent);
            if (matches) {
                is_shiira = true;
                display('shiira_bug', 'block');
            } else {
                return;
            }
        }

        // We have detected a valid WebKit version, hide the unknown version text
        display('unknown_version', 'none');

        var webkit_version = parse_version(matches[1]);

        if (webkit_version.major < 100) {
            // Mac OS X 10.2
            display('using_10point2', 'block');
        } else if (webkit_version.major >= 100 && webkit_version.major < 400) {
            // Mac OS X 10.3
            display('using_10point3', 'block');

            if (webkit_version.major < 312)
                // Mac OS X 10.3.8 or lower
                display('updateto10_3_9', 'block');

            else if (webkit_version.minor < 9)
                // Mac OS X 10.3.9 but not the latest Safari update
                display('update10_3_9_safari', 'block');

            else if (is_safari)
                // Mac OS X 10.3.9 with the latest Safari update
                display('best10_3_9_safari', 'block');

            else if (is_shiira)
                // Mac OS X 10.3.9 with Shiira
                display('best10_3_9_shiira', 'block');

        } else {
            // Mac OS X 10.4
            display('using_10point4', 'block');

            if (webkit_version.major == 412 && webkit_version.is_nightly)
                // Using an old nightly
                display('neednewnightly', 'block');

            else if (webkit_version.major == 420 && webkit_version.is_nightly)
                // Using a recent nightly, not sure which
                display('mightneednewnightly', 'block');

            else if (webkit_version.major < 418)
                // 10.4.6 or lower
                display('updateto10_4_7', 'block');

            else if (is_safari)
                // 10.4.7
                display('using_10_4_7_safari', 'block');

            else if (is_shiira)
                // 10.4.7
                display('using_10_4_7_shiira', 'block');

        } 
    }
</script>
<div id="unknown_version">
    To make sure you're not wasting your (and our) time, you should be using the latest version of WebKit before you file your bug.
    You should run at least Mac OS X 10.3.9 before filing bugs. Your WebKit version should be 312 or higher if you are on 
    Panther and 417 or higher if you are on Tiger. If you're running
    Mac OS X 10.4, you could also <a href="http://nightly.webkit.org">download the latest nightly</a> build to be sure you
    have the latest version. If you've done this and you still experience the bug, go ahead to the next step.
</div>
<div id="using_10point2" style="display: none;">
    We're sorry, we no longer accept bug reports about Safari under Mac OS X 10.2. To many bugs have been fixed since then. We advise
    you to upgrade to Mac OS X 10.4.
</div>
<div id="using_10point3" style="display: none;">
    <div id="updateto10_3_9" style="display: none;">
        You are using Mac OS X 10.3.8 or lower, please before filing any bugs, upgrade to Mac OS X 10.3.9.
    </div>
    <div id="update10_3_9_safari" style="display: none;">
        You are using Mac OS X 10.3.9, but your WebKit isn't the latest version. Please, before filing any bugs, download the 
        latest Webkit update.
    </div>
    <div id="best10_3_9_safari">
        You are using Mac OS X 10.3.9, and the latest version of Safari, go ahead and file your bug!
    </div>
    <div id="best10_3_9_shiira">
        You are using Shiira on Mac OS X 10.3.9, go ahead and file your bug!
    </div>
</div>
<div id="using_10point4" style="display: none;">
    <div id="neednewnightly" style="display: none;">
        You are already using a nightly build, which is very good! A large number of bugs has been fixed since you downloaded
        this nightly build though, so please <a href="http://nightly.webkit.org/">get the latest nightly</a>.
    </div>
    <div id="mightneednewnightly" style="display: none;">
        You are already using a nightly build, which is very good! Unfortunately, we can't detect when you downloaded it, but
        if that was more then a few days ago, please <a href="http://nightly.webkit.org/">get the latest nightly</a>.
    </div>
    <div id="updateto10_4_7" style="display: none;">
        You are using Mac OS X 10.4.6 or lower, please before filing any bugs, do either of the following:
        <ul>
            <li>Upgrade to Mac OS X 10.4.7, or:</li>
            <li><a href="http://nightly.webkit.org">Download the latest nightly</a>.</li>
        </ul>
    </div>
    <div id="using_10_4_7_safari" style="display: none;">
        You are using Safari on Mac OS X 10.4.7, go ahead and file your bug, or if you want to <a href="http://nightly.webkit.org">
        download the latest nightly</a> and see if your bug is already fixed.
    </div>
    <div id="using_10_4_7_shiira" style="display: none;">
        You are using Shiira on Mac OS X 10.4.7, go ahead and file your bug.
    </div>
</div>
</li>
<li>
    <strong>Search Bugzilla</strong><br>
    Now that you have the latest WebKit version and still think you've found a WebKit bug, 
    <a href="http://bugs.webkit.org/query.cgi?format=specific&amp;product=WebKit">search through Bugzilla</a> first
    to see if anyone else has already filed it. This step is very important! If you find that someone has filed your bug
    already, please go to the next step anyway, but instead of filing a new bug, comment on the one you've found. If you can't
    find your bug in Bugzilla, go to the next step.
</li>
<li>
    <strong>Create a Bugzilla account</strong><br>
    You will need to <a href="bugzilla.html">create a Bugzilla account</a> to be able
    to report bugs (and to comment on them). If you have registered, proceed to the next step.
</li>
<li>
    <strong>File the bug!</strong><br>
    Now you are ready to <a href="http://webkit.org/new-bug">file a bug on the WebKit product</a>. The <a href="bugwriting.html">
    Writing a Good Bug Report</a> document (also linked in the sidebar) gives some tips about the most useful information to include
    in bug reports. The better your bug report, the higher the chance that your bug will be addressed (and possibly fixed) 
    quickly!
</li>
<li>
    <strong>What happens next?</strong><br>
    Once your bug is filed, you will receive email when it is updated at each stage in the <a href="lifecycle.html">bug life cycle</a>.
    After the bug is considered fixed, you may be asked to download the <a href="http://nightly.webkit.org">latest nightly</a> 
    and confirm that the fix works for you.
</li>
</ol>
<div id="safari_bug" style="display: none;">
    <strong>Note:</strong> <br>
    To report bugs in Safari, or WebKit bugs that may contain confidential information, please use
    <a href="http://bugreporter.apple.com">http://bugreporter.apple.com/</a>.
    Non ADC members can also use <a href="http://developer.apple.com/bugreporter/bugrptform.html">http://developer.apple.com/bugreporter/bugrptform.html</a> to report bugs.
</div>
<div id="shiira_bug" style="display: none;">
    <strong>Note:</strong> <br>
    To report bugs in Shiira, please go to <a href="http://hmdt-web.net/forum/">http://hmdt-web.net/forum/</a>.
    For WebKit bugs that contain confidential information, please use 
    <a href="http://bugreporter.apple.com">http://bugreporter.apple.com/</a>.
</div>

<script type="text/javascript">get_version();</script>

<?php include("../footer.inc"); ?>
