Reviewed by Darin.
authorap <ap@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 17 Apr 2006 16:27:58 +0000 (16:27 +0000)
committerap <ap@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 17 Apr 2006 16:27:58 +0000 (16:27 +0000)
        - http://bugzilla.opendarwin.org/show_bug.cgi?id=8412
          Integrate iExploder test script.

        This script generates artificially mangled HTML documents, to test that the browser
        doesn't crash when handling ill-formed code.

        How to use:
         run-iexploder-tests             Open an interactive test page in Safari+ToT.
         run-iexploder-tests nnnnn       Open test #nnnnn.

        Command line options:
         -guard-malloc (-g)              Use Guard Malloc.
         -port=nnnn                      Run Apache on port nnnn (default is 8000).

        To save a crashing test, you can use curl while the crash reporter dialog is on the screen
        (thus, Apache is still running), e.g.:
         curl -o iexploder293.html "http://127.0.0.1:8000/iexploder.cgi?lookup=1&test=293"

        Additionally, there are some useful scripts in WebKitTools/iExploder/tools directory.

        * Scripts/run-iexploder-tests: Added.
        * iExploder: Added.
        * iExploder/LICENSE.txt: Added.
        * iExploder/README.txt: Added.
        * iExploder/htdocs: Added.
        * iExploder/htdocs/cssproperties.in: Added.
        * iExploder/htdocs/cssvalues.in: Added.
        * iExploder/htdocs/htmlattrs.in: Added.
        * iExploder/htdocs/htmltags.in: Added.
        * iExploder/htdocs/htmlvalues.in: Added.
        * iExploder/htdocs/iexploder.cgi: Added.
        * iExploder/htdocs/index.html: Added.
        * iExploder/tools: Added.
        * iExploder/tools/lasthit.rb: Added.
        * iExploder/tools/osx_last_crash.rb: Added.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@13894 268f45cc-cd09-0410-ab3c-d52691b4dbfc

13 files changed:
WebKitTools/ChangeLog
WebKitTools/Scripts/run-iexploder-tests [new file with mode: 0755]
WebKitTools/iExploder/LICENSE.txt [new file with mode: 0644]
WebKitTools/iExploder/README.txt [new file with mode: 0644]
WebKitTools/iExploder/htdocs/cssproperties.in [new file with mode: 0644]
WebKitTools/iExploder/htdocs/cssvalues.in [new file with mode: 0644]
WebKitTools/iExploder/htdocs/htmlattrs.in [new file with mode: 0644]
WebKitTools/iExploder/htdocs/htmltags.in [new file with mode: 0644]
WebKitTools/iExploder/htdocs/htmlvalues.in [new file with mode: 0644]
WebKitTools/iExploder/htdocs/iexploder.cgi [new file with mode: 0755]
WebKitTools/iExploder/htdocs/index.html [new file with mode: 0644]
WebKitTools/iExploder/tools/lasthit.rb [new file with mode: 0755]
WebKitTools/iExploder/tools/osx_last_crash.rb [new file with mode: 0755]

index 18c44f0..9e0d7da 100644 (file)
@@ -1,3 +1,43 @@
+2006-04-17  Alexey Proskuryakov  <ap@nypop.com>
+
+        Reviewed by Darin.
+
+        - http://bugzilla.opendarwin.org/show_bug.cgi?id=8412
+          Integrate iExploder test script.
+
+        This script generates artificially mangled HTML documents, to test that the browser
+        doesn't crash when handling ill-formed code.
+        
+        How to use:
+         run-iexploder-tests             Open an interactive test page in Safari+ToT.
+         run-iexploder-tests nnnnn       Open test #nnnnn.
+
+        Command line options:
+         -guard-malloc (-g)              Use Guard Malloc.
+         -port=nnnn                      Run Apache on port nnnn (default is 8000).
+
+        To save a crashing test, you can use curl while the crash reporter dialog is on the screen
+        (thus, Apache is still running), e.g.:
+         curl -o iexploder293.html "http://127.0.0.1:8000/iexploder.cgi?lookup=1&test=293"
+
+        Additionally, there are some useful scripts in WebKitTools/iExploder/tools directory.
+
+        * Scripts/run-iexploder-tests: Added.
+        * iExploder: Added.
+        * iExploder/LICENSE.txt: Added.
+        * iExploder/README.txt: Added.
+        * iExploder/htdocs: Added.
+        * iExploder/htdocs/cssproperties.in: Added.
+        * iExploder/htdocs/cssvalues.in: Added.
+        * iExploder/htdocs/htmlattrs.in: Added.
+        * iExploder/htdocs/htmltags.in: Added.
+        * iExploder/htdocs/htmlvalues.in: Added.
+        * iExploder/htdocs/iexploder.cgi: Added.
+        * iExploder/htdocs/index.html: Added.
+        * iExploder/tools: Added.
+        * iExploder/tools/lasthit.rb: Added.
+        * iExploder/tools/osx_last_crash.rb: Added.
+
 2006-04-16  Alexey Proskuryakov  <ap@nypop.com>
 
         Reviewed by Darin.
diff --git a/WebKitTools/Scripts/run-iexploder-tests b/WebKitTools/Scripts/run-iexploder-tests
new file mode 100755 (executable)
index 0000000..049e44b
--- /dev/null
@@ -0,0 +1,159 @@
+#!/usr/bin/perl
+
+# Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com)
+#
+# 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. 
+# 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+#     its contributors may be used to endorse or promote products derived
+#     from this software without specific prior written permission. 
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "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 OR ITS 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.
+
+# A script to semi-automatically run iExploder tests.
+
+use strict;
+use warnings;
+
+use Cwd;
+use FindBin;
+use Getopt::Long;
+use IPC::Open2;
+
+use lib $FindBin::Bin;
+use webkitdirs;
+
+sub openHTTPDIfNeeded();
+sub closeHTTPD();
+sub runSafari();
+
+# Argument handling
+my $guardMalloc = '';
+my $httpdPort = 8000;
+
+GetOptions(
+    'guard-malloc|g' => \$guardMalloc,
+    'port=i' => \$httpdPort
+);
+
+
+setConfiguration();
+my $productDir = productDir();
+
+chdirWebKit();
+
+checkFrameworks();
+
+my $httpdOpen = 0;
+openHTTPDIfNeeded();
+runSafari();
+closeHTTPD();
+
+
+sub runSafari()
+{
+    my $redirectTo;
+    if (@ARGV) {
+        $redirectTo = "http://127.0.0.1:$httpdPort/iexploder.cgi?lookup=1&test=$ARGV[0]";
+    } else {
+        $redirectTo = "http://127.0.0.1:$httpdPort/index.html";
+    }
+
+    open REDIRECT_HTML, ">", "/tmp/WebKit/redirect.html" or die;
+    print REDIRECT_HTML "<html>\n";
+    print REDIRECT_HTML "    <head>\n";
+    print REDIRECT_HTML "        <meta http-equiv=\"refresh\" content=\"1;URL=$redirectTo\" />\n";
+    print REDIRECT_HTML "        <script type=\"text/javascript\">\n";
+    print REDIRECT_HTML "            document.location = \"$redirectTo\";\n";
+    print REDIRECT_HTML "        </script>\n";
+    print REDIRECT_HTML "    </head>\n";
+    print REDIRECT_HTML "    <body>\n";
+    print REDIRECT_HTML "    </body>\n";
+    print REDIRECT_HTML "</html>\n";
+    close REDIRECT_HTML;
+    
+    local %ENV;
+    $ENV{DYLD_INSERT_LIBRARIES} = "/usr/lib/libgmalloc.dylib" if $guardMalloc;
+    system "WebKitTools/Scripts/run-safari", "-NSOpen", "/tmp/WebKit/redirect.html";
+}
+
+sub openHTTPDIfNeeded()
+{
+    return if $httpdOpen;
+
+    mkdir "/tmp/WebKit";
+    
+    if (-f "/tmp/WebKit/httpd.pid") {
+        my $oldPid = `cat /tmp/WebKit/httpd.pid`;
+        chomp $oldPid;
+        if (0 != kill 0, $oldPid) {
+            print "\nhttpd is already running: pid $oldPid, killing...\n";
+            kill 15, $oldPid;
+            
+            my $retryCount = 20;
+            while ((0 != kill 0, $oldPid) && $retryCount) {
+                sleep 1;
+                --$retryCount;
+            }
+            
+            die "Timed out waiting for httpd to quit" unless $retryCount;
+        }
+    }
+    
+    my $testDirectory = getcwd() . "/LayoutTests";
+    my $iExploderDirectory = getcwd() . "/WebKitTools/iExploder";
+    my $httpdPath = "/usr/sbin/httpd";
+    my $httpdConfig = "$testDirectory/http/conf/httpd.conf";
+    $httpdConfig = "$testDirectory/http/conf/apache2-httpd.conf" if `$httpdPath -v` =~ m|Apache/2|;
+    my $documentRoot = "$iExploderDirectory/htdocs";
+    my $typesConfig = "$testDirectory/http/conf/mime.types";
+    my $listen = "127.0.0.1:$httpdPort";
+
+    open2(\*HTTPDIN, \*HTTPDOUT, $httpdPath, 
+        "-f", "$httpdConfig",
+        "-C", "DocumentRoot \"$documentRoot\"",
+        "-C", "Listen $listen",
+        "-c", "TypesConfig \"$typesConfig\"",
+        "-c", "CustomLog \"/tmp/WebKit/access_log.txt\" common",
+        "-c", "ErrorLog \"/tmp/WebKit/error_log.txt\"",
+        # Apache wouldn't run CGIs with permissions==700 otherwise
+        "-c", "User \"#$<\"");
+
+    my $retryCount = 20;
+    while (system("/usr/bin/curl -q --silent --stderr - --output /dev/null $listen") && $retryCount) {
+        sleep 1;
+        --$retryCount;
+    }
+    
+    die "Timed out waiting for httpd to start" unless $retryCount;
+    
+    $httpdOpen = 1;
+}
+
+sub closeHTTPD()
+{
+    return if !$httpdOpen;
+
+    close HTTPDIN;
+    close HTTPDOUT;
+
+    kill 15, `cat /tmp/WebKit/httpd.pid` if -f "/tmp/WebKit/httpd.pid";
+
+    $httpdOpen = 0;
+}
diff --git a/WebKitTools/iExploder/LICENSE.txt b/WebKitTools/iExploder/LICENSE.txt
new file mode 100644 (file)
index 0000000..5b6e7c6
--- /dev/null
@@ -0,0 +1,340 @@
+                   GNU GENERAL PUBLIC LICENSE
+                      Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+\f
+                   GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+\f
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+\f
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+\f
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                           NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+\f
+           How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/WebKitTools/iExploder/README.txt b/WebKitTools/iExploder/README.txt
new file mode 100644 (file)
index 0000000..a9b3c22
--- /dev/null
@@ -0,0 +1,84 @@
+iExploder 1.2.0
+===============
+
+Welcome to iExploder. a highly inefficient, but fairly effective web
+browser tester. The code still has a lot of work to be done, but it's
+definitely usable. Here are some notable features:
+
+* Tests all common HTML and CSS tags and attributes, as parsed from 
+the KHTML and Mozilla source trees, as well as tags for Internet Explorer
+from MSDN. This also includes a few Javascript hooks.
+* Numeric, and String overflow and formatting tests
+* Sequential and Randomized Test Case Generation
+* Test Case Lookups
+* Subtest generation (very weak right now)
+
+
+
+Installation instructions:
+--------------------------
+Make sure you have Ruby installed (comes with Mac OS X, most Linux
+distributions). See http://www.ruby-lang.org/ if you do not.
+
+Copy the contents of the htdocs/ folder to any directory served
+by your webserver. Make sure that directory can execute CGI scripts.
+
+
+
+FAQ:
+----
+1) Does it work with mod_ruby?
+
+  Yes, it's actually recommended for boosting performance. 
+
+2) Are the tests always the same? 
+
+  The test cases should always be the same on a single installation, but not
+necessarily on different installations of iExploder. Random generator seeds
+may differ between operating systems and platforms.
+
+
+3) How do I look up the last successful test for a client?
+
+  Use tools/lasthit.rb. When I get a crash, I usually do something like:
+
+tail -15000 /var/log/apache2/access_log | ./lasthit.rb
+
+Letting you know how many tests and what the last test id was for each
+client tested. You can then try to repeat the test, or go through the
+subtests to see if you can repeat the crash.
+
+4) How do subtests work?
+
+  Pretty badly right now. If you have a page that crashes, you can resubmit
+it with subtest=1, iexploder will try to pick out the particular tag that
+crashes your browser (up to $maxTags). Often times, none of the subtests
+will crash the browser, but the entire test will. This has a lot of room for
+improvement.
+
+5) How come I can't seem to repeat the crash?
+
+  Many browser crashes are race conditions that are not easy to repeat. Some
+crashes only happen when going from test 4 -> test 5 -> test 6. If you can't
+repeat the crash through subtests or a lookup of the failing test, try going
+back a few tests.
+
+It is also possible (but unliely) that your browser crashed while trying to load
+the next test in the list, and your webserver did not log that hit yet.
+
+6) Why did you write this?
+
+  I wanted to make sure that FireFox had as many bugs fixed in it as possible
+before the 1.0 release. After 1.0 came out, I kept improving it.
+
+7) Why is the code so awful?
+
+  I wrote this as a quick hack sitting in a hotel room one day while I was
+waiting for some people to show up. It now represents the worst Ruby code
+I have ever written. Heck, it looks as bad as Perl!
+
+7) Why does Internet Explorer run the tests so slowly?
+
+  <META> refresh tags are very fragile in Internet Explorer, and can be easily
+be rendered useless by other tags on the page. If this happens, a javascript
+refresh will execute after a 1 second delay. 
diff --git a/WebKitTools/iExploder/htdocs/cssproperties.in b/WebKitTools/iExploder/htdocs/cssproperties.in
new file mode 100644 (file)
index 0000000..4ba2b75
--- /dev/null
@@ -0,0 +1,268 @@
+# All of the following are from khtml's cssproperties.in as of 19oct2004
+background-color
+background-image
+background-repeat
+background-attachment
+background-position
+background-position-x
+background-position-y
+border-collapse
+border-spacing
+-khtml-border-horizontal-spacing
+-khtml-border-vertical-spacing
+border-top-color
+border-right-color
+border-bottom-color
+border-left-color
+border-top-style
+border-right-style
+border-bottom-style
+border-left-style
+border-top-width
+border-right-width
+border-bottom-width
+border-left-width
+bottom
+caption-side
+clear
+clip
+color
+content
+counter-increment
+counter-reset
+cursor
+direction
+display
+empty-cells
+float
+font-family
+font-size
+font-style
+font-variant
+font-weight
+height
+left
+letter-spacing
+line-height
+list-style-image
+list-style-position
+list-style-type
+margin-top
+margin-right
+margin-bottom
+margin-left
+-khtml-marquee
+-khtml-marquee-direction
+-khtml-marquee-increment
+-khtml-marquee-repetition
+-khtml-marquee-speed
+-khtml-marquee-style
+max-height
+max-width
+min-height
+min-width
+orphans
+outline-color
+outline-style
+outline-width
+overflow
+padding-top
+padding-right
+padding-bottom
+padding-left
+#page
+page-break-after
+page-break-before
+page-break-inside
+position
+quotes
+right
+size
+table-layout
+text-align
+text-decoration
+text-indent
+text-transform
+top
+unicode-bidi
+vertical-align
+visibility
+white-space
+widows
+width
+word-spacing
+z-index
+background
+border
+border-color
+border-style
+border-top
+border-right
+border-bottom
+border-left
+border-width
+font
+list-style
+margin
+outline
+padding
+scrollbar-base-color
+scrollbar-face-color
+scrollbar-shadow-color
+scrollbar-highlight-color
+scrollbar-3dlight-color
+scrollbar-darkshadow-color
+scrollbar-track-color
+scrollbar-arrow-color
+-khtml-flow-mode
+-khtml-user-input
+-khtml-text-decoration-color
+
+# From Mozilla FireFox 0.10.1
+azimuth
+cue
+cue-after
+cue-before
+dominant-baseline
+elevation
+fill
+fill-opacity
+fill-rule
+font-size-adjust
+font-stretch
+margin-end-value
+margin-left-ltr-source
+margin-left-rtl-source
+margin-left-value
+margin-right-ltr-source
+margin-right-rtl-source
+margin-right-value
+margin-start-value
+marker-offset
+marks
+-moz-appearance
+-moz-background-clip
+-moz-background-inline-policy
+-moz-background-origin
+-moz-binding
+-moz-border-bottom-colors
+-moz-border-left-colors
+-moz-border-radius
+-moz-border-radius-bottomleft
+-moz-border-radius-bottomright
+-moz-border-radius-topleft
+-moz-border-radius-topright
+-moz-border-right-colors
+-moz-border-top-colors
+-moz-box-align
+-moz-box-direction
+-moz-box-flex
+-moz-box-ordinal-group
+-moz-box-orient
+-moz-box-pack
+-moz-box-sizing
+-moz-counter-increment
+-moz-counter-reset
+-moz-float-edge
+-moz-force-broken-image-icon
+-moz-image-region
+-moz-key-equivalent
+-moz-margin-end
+-moz-margin-start
+-moz-outline
+-moz-outline-color
+-moz-outline-radius
+-moz-outline-radius-bottomleft
+-moz-outline-radius-bottomright
+-moz-outline-radius-topleft
+-moz-outline-radius-topright
+-moz-outline-style
+-moz-outline-width
+-moz-padding-end
+-moz-padding-start
+-moz-resizer
+-moz-user-focus
+-moz-user-input
+-moz-user-modify
+-moz-user-select
+opacity
+padding-end-value
+padding-left-ltr-source
+padding-left-rtl-source
+padding-left-value
+padding-right-ltr-source
+padding-right-rtl-source
+padding-right-value
+padding-start-value
+page
+pause
+pause-after
+pause-before
+pitch
+pitch-range
+play-during
+pointer-events
+richness
+shape-rendering
+speak
+speak-header
+speak-numeral
+speak-punctuation
+speech-rate
+stress
+stroke
+stroke-dasharray
+stroke-dashoffset
+stroke-linecap
+stroke-linejoin
+stroke-miterlimit
+stroke-opacity
+stroke-width
+text-anchor
+text-rendering
+text-shadow
+voice-family
+volume
+-x-background-x-position
+-x-background-y-position
+-x-border-x-spacing
+-x-border-y-spacing
+-x-play-during-flags
+-x-play-during-uri
+-x-size-height
+-x-size-width
+
+# Internet Explorer 6.0 - http://msdn.microsoft.com/workshop/author/css/reference/attributes.asp
+filter:progid:
+filter:
+ime-mode
+layout-flow
+layout-grid
+layout-grid-char
+layout-grid-line
+layout-grid-mode
+layout-grid-type
+line-break
+overflow-x
+overflow-y
+pagebreakafter
+pagebreakbefore
+ruby-align
+ruby-overhang
+ruby-position
+text-autospace
+text-justify
+text-kashida-space
+text-overflow
+text-underline-position
+word-break
+word-wrap
+writing-mode
+zoom
+
+# from http://msdn.microsoft.com/library/default.asp?url=/workshop/author/filter/reference/reference.asp
+filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(
+filter:progid:DXImageTransform.Microsoft.Blur(
+filter:progid:DXImageTransform.Microsoft.MotionBlur(
+filter:progid:DXImageTransform.Microsoft.Gradient(
+filter:progid:DXImageTransform.Microsoft.Pixelate(
diff --git a/WebKitTools/iExploder/htdocs/cssvalues.in b/WebKitTools/iExploder/htdocs/cssvalues.in
new file mode 100644 (file)
index 0000000..af0b0eb
--- /dev/null
@@ -0,0 +1,116 @@
+"Trebuchet MS",Verdana, Arial, Helvetica, sans-serif
+#339933 !important !important !important
+#9999999999999999999999999999999999999999999
+-9999%
+-999999999999999999999999999%
+-999999999999999999999999999em
+-999999999999999999999999999px
+-9999em
+-9999px
+0
+0 auto
+0 fixed
+2%
+90000000000000000000000000000000000000000000%
+9999999999999999999999
+99999999999999999999999999999999999999 auto
+99999999999999999999999999999999999999999999px
+999999px solid #fff
+absolute
+always
+attr("ATTRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")
+baseline
+bidi-override
+block
+block clear
+block width
+both
+bottom
+capitalize
+center
+circle
+clip:rect(-0px -2000000px -200000px -0px)
+clip:rect(0px 2000000px 200000px 0px)
+close-quote
+collapse
+compact
+crosshair
+decimal
+decimal-leading-zero
+default
+embed
+fixed
+groove
+help
+helvetica, arial, Courier New, Courier, Mono, Blah, Blah, Blah
+hide
+inherit
+inline
+inline-table
+inset
+italic
+justify
+large
+left
+list-item
+lower-alpha
+lower-roman
+lowercase
+marker
+medium
+middle
+no-close
+no-open-quote
+no-repeat
+none
+normal
+normal !important
+oblique
+once
+open-quote
+outset
+pointer
+relative
+rgb(9999999999, 999999999, 9999999999999)
+ridge
+right
+run-in
+scroll
+se-resize
+separate
+show
+small
+small-caps
+square
+static
+sub
+super
+sw-resize
+table
+table-caption
+table-cell
+table-column
+table-column-group
+table-footer-group
+table-header-group
+table-row
+table-row-group
+text-bottom
+text-top
+thick dashed yellow
+thick dotted blue
+top
+transparent
+underline
+up
+upper-alpha
+upper-roman
+uppercase
+visible
+w-resize
+wait
+x-large
+x-small
+xx-large
+xx-small
+-5, -5, -5
diff --git a/WebKitTools/iExploder/htdocs/htmlattrs.in b/WebKitTools/iExploder/htdocs/htmlattrs.in
new file mode 100644 (file)
index 0000000..96a80d6
--- /dev/null
@@ -0,0 +1,221 @@
+# the following come from khtml's htmlattr.in from 19oct2004
+
+abbr
+accept-charset
+accept
+accesskey
+action
+align
+alink
+alt
+archive
+autocomplete
+axis
+background
+behavior
+bgcolor
+bgproperties
+border
+bordercolor
+cellpadding
+cellspacing
+char
+challenge
+charoff
+charset
+checked
+cite
+class
+classid
+clear
+code
+codebase
+codetype
+color
+cols
+colspan
+compact
+content
+contenteditable
+coords
+data
+datetime
+declare
+defer
+dir
+direction
+disabled
+enctype
+face
+for
+frame
+frameborder
+headers
+height
+hidden
+href
+hreflang
+hspace
+html
+http-equiv
+id
+ismap
+label
+lang
+language
+left
+leftmargin
+link
+longdesc
+loop
+marginheight
+marginwidth
+maxlength
+media
+method
+multiple
+name
+nohref
+noresize
+nosave
+noshade
+nowrap
+object
+onabort
+onblur
+onchange
+onclick
+ondblclick
+onerror
+onfocus
+onkeydown
+onkeypress
+onkeyup
+onload
+onmousedown
+onmousemove
+onmouseout
+onmouseover
+onmouseup
+onreset
+onresize
+onselect
+onsubmit
+onunload
+oversrc
+pagex
+pagey
+plain
+pluginpage
+pluginspage
+pluginurl
+profile
+prompt
+readonly
+rel
+rev
+rows
+rowspan
+rules
+scheme
+scope
+scrollamount
+scrolldelay
+scrolling
+selected
+shape
+size
+span
+src
+standby
+start
+style
+summary
+tabindex
+target
+text
+title
+top
+topmargin
+truespeed
+type
+unknown
+usemap
+valign
+value
+valuetype
+version
+visibility
+vlink
+vspace
+width
+wrap
+z-index
+
+# From FireFox 0.10.1
+AAstyle
+above
+autocheck
+below
+bottommargin
+bottompadding
+ch
+clip
+combobox
+content-language
+content-location
+content-script-type
+content-style-type
+content-type
+defaultchecked
+defaultselected
+default-style
+defaultvalue
+encoding
+event
+font-weight
+FormControlList
+gutter
+IForm
+ilayer
+index
+layer
+layout
+leftpadding
+length
+lowsrc
+mayscript
+:-moz-wrapped-frame
+msthemecompatible
+overflow
+point-size
+refresh
+repeat
+rightmargin
+rightpadding
+selectedindex
+set-cookie
+toppadding
+variable
+vcard_name
+window-target
+zindex
+
+# IE specific, from msdn.microsoft.com/workshop/author/dhtml/reference/properties
+acceptcharset
+allowtransparency
+balance
+choff
+datafld
+dataformatas
+datapagesize
+datasrc
+dynsrc
+framespacing
+galleryimg
+hidefocus
+methods
+scroll
+units
+urn
+volume
diff --git a/WebKitTools/iExploder/htdocs/htmltags.in b/WebKitTools/iExploder/htdocs/htmltags.in
new file mode 100644 (file)
index 0000000..d8eb418
--- /dev/null
@@ -0,0 +1,122 @@
+# The following come from khtml's htmltags.in from 19oct2004
+
+a
+abbr
+acronym
+address
+applet
+area
+b
+base
+basefont
+bdo
+big
+blockquote
+body
+br
+button
+caption
+center
+cite
+code
+col
+colgroup
+dd
+del
+dfn
+dir
+div
+dl
+dt
+em
+embed
+fieldset
+font
+form
+frame
+frameset
+h1
+h2
+h3
+h4
+h5
+h6
+head
+hr
+html
+i
+iframe
+ilayer
+img
+input
+ins
+isindex
+kbd
+keygen
+label
+layer
+legend
+li
+link
+map
+marquee
+menu
+meta
+nobr
+noembed
+noframes
+noscript
+nolayer
+object
+ol
+optgroup
+option
+p
+param
+plaintext
+pre
+q
+s
+samp
+script
+select
+small
+span
+strike
+strong
+style
+sub
+sup
+table
+tbody
+td
+textarea
+tfoot
+th
+thead
+title
+tr
+tt
+u
+ul
+var
+wbr
+xmp
+
+
+# From Mozilla FireFox 0.10.1
+bgsound
+blink
+counter
+endnote
+image
+listing
+multicol
+parsererror
+server
+sound
+sourcetext
+spacer
+
+# From Internet Explorer - http://msdn.microsoft.com/workshop/author/html/reference/elements.asp
+xml
diff --git a/WebKitTools/iExploder/htdocs/htmlvalues.in b/WebKitTools/iExploder/htdocs/htmlvalues.in
new file mode 100644 (file)
index 0000000..d54984f
--- /dev/null
@@ -0,0 +1,35 @@
+# Many of the following are from mangleme.cgi.c's make_up_value() function
+#
+*
+_blank
+_parent
+_self
+_top
+about:
+about:plugins
+file:
+http:
+jar:
+javascript:
+left
+top
+%n%n%n%n%n
+ftp:
+right
+wysiwyg:
+bottom
+none
+ldap:
+%i %i
+999999999,9999999,999999999,9999999,999999999,9999999,999999999,9999999,9
+999999999,9999999,9
+999999999,9999999
+true
+false
+_SEARCH
+javascript
+off
+on
+vbscript
+password
+image
diff --git a/WebKitTools/iExploder/htdocs/iexploder.cgi b/WebKitTools/iExploder/htdocs/iexploder.cgi
new file mode 100755 (executable)
index 0000000..c0a7b63
--- /dev/null
@@ -0,0 +1,299 @@
+#!/usr/bin/ruby
+# iExploder - Generates bad HTML files to perform QA for web browsers.
+# Developed for the Mozilla Foundation.
+#####################
+#
+# Copyright (c) 2005 Thomas Stromberg <thomas%stromberg.org>
+# 
+# This software is provided 'as-is', without any express or implied warranty.
+# In no event will the authors be held liable for any damages arising from the
+# use of this software.
+# 
+# Permission is granted to anyone to use this software for any purpose,
+# including commercial applications, and to alter it and redistribute it
+# freely, subject to the following restrictions:
+# 
+# 1. The origin of this software must not be misrepresented; you must not
+# claim that you wrote the original software. If you use this software in a
+# product, an acknowledgment in the product documentation would be appreciated
+# but is not required.
+# 
+# 2. Altered source versions must be plainly marked as such, and must not be
+# misrepresented as being the original software.
+# 
+# 3. This notice may not be removed or altered from any source distribution.
+# 
+# 4. Any bug reports, patches, or other publications which are based on the 
+# usage of iExploder must reference iExploder as the source of the discovery.
+
+
+require 'cgi';
+
+$VERSION = "1.2";
+$maxTags = 32;
+$maxAttrs = 4;
+$maxCSS = 5;
+$mangledTagTotal = 0
+
+
+def readTagFile(filename)
+    list = Array.new
+    File.new(filename).readlines.each { |line|
+        line.chop!
+        
+        # Don't include comments.
+        if (line !~ /^# /) && (line.length > 0)
+            list << line
+        end
+    }
+    return  list
+end
+
+# based on make_up_value, essentially.
+def inventValue
+    value = rand(19);
+    case value
+    when 1..3 then return ($htmlValues[rand($htmlValues.length)])
+    when 4..5 then return ($htmlValues[rand($htmlValues.length)] + inventValue())
+    when 6 then return ($htmlValues[rand($htmlValues.length)] + "//" + inventValue())
+    when 7 then return ''
+    when 8..10 then return rand(255).chr * (rand(256)+8)
+    when 11 then return rand(255).chr * (rand(2048)+8)
+    when 12 then return "#" + rand(999999).to_s
+    when 13 then return rand(999999).to_s + "%"
+    when 14..15 then return "&" + rand(999999).to_s + ";"
+        # filters
+    when 16 then
+        return inventValue() + "=" + inventValue()
+        
+    when 17 then return inventValue() + "," + inventValue()
+    else
+        if rand(5) > 3
+            return "-" + rand(999999).to_s
+        else
+            return rand(999999).to_s
+        end
+    end
+end
+
+# based on make_up_value, essentially.
+def inventCssValue(tag)
+    value = rand(23);
+    case value
+    when 1..10 then return $cssValues[rand($cssValues.length)]
+    when 11 then return ''
+    when 12 then return rand(255).chr * (rand(8192)+8)
+    when 13
+        length = rand(1024) + 8
+        return (rand(255).chr * length) + " " + (rand(255).chr * length) + " " + (rand(255).chr * length)
+    when 14 then return (rand(255).chr * (rand(1024)+3)) + "px"
+    when 15 then return (rand(255).chr * (rand(1024)+3)) + "em"
+    when 16 then return "url(" + inventValue() + ")"
+    when 17..18 then return "#" + rand(999999999).to_s
+    when 19 then return "-" + rand(99999999).to_s
+    else return rand(99999999).to_s;
+    end
+end
+
+
+def mangleTag(tag)
+    $mangledTagTotal += 1
+    out = ''
+        
+    # 20% chance of closing a tag instead of opening it.
+    if rand(10) > 8
+        out = "</" + tag + ">"
+        return out
+    end
+    
+    # we're opening it.
+    out = "<" + tag
+    
+    # forgot the space between the tag and the attributes
+    if rand(15) > 1
+        out << ' '
+    end
+    
+    attrNum = rand($maxAttrs) + 1
+    
+    1.upto(attrNum) {
+        attr = $htmlAttr[rand($htmlAttr.length)]
+        
+        out << attr
+        
+        # 7.5% of the time we skip the = sign. Don't prefix it
+        # if the attribute ends with a ( however.
+        
+        
+        if rand(15) > 1
+            out << '='
+        end
+        
+        # sometimes quote it, sometimes not. I doubt the importance
+        # of this test, but mangleme-1.2 added it, and adding more
+        # random-ness never hurt anything but time. I'll do it less often.
+        
+        quote = rand(2)
+        if (quote > 1)
+            out << "\""
+        end
+        
+        out << inventValue()
+        
+        # end the quote when you are done
+        if (quote > 1)
+            out << "\" "
+        end
+        
+        # 5% chance we skip the space at the end of the name
+        if rand(20) > 1
+            out << ' '
+        end
+        
+    }
+    
+    # CSS styles!
+    if rand(4) > 1
+        out << " style=\""
+        1.upto(rand($maxCSS)+1) {
+            out << $cssTags[rand($cssTags.length)]
+            
+            # very small chance we let the tag run on.
+            if rand(50) > 1
+                out << ": "
+            end
+            
+            out << inventCssValue(tag)
+            # we almost always put the ; there.
+            if rand(50) > 1
+                out << '; '
+            end
+        }
+        out << "\""
+    end
+    
+    # support our local troops!    
+    if ($paramSubTestNum > 0) && ($paramSubTestNum != $mangledTagTotal) 
+       if tag =~ /html|body|head/
+               return '<' + tag + '>'
+       else
+            return '<subtest-ignored>'
+       end
+    end
+    
+    out << ">\n"
+end
+
+# These if statements are so that mod_ruby doesn't have to reload the files
+# each time
+
+if (! $cssTags)
+    $cssTags = readTagFile('cssproperties.in');
+end
+
+if (! $htmlTags)
+    $htmlTags = readTagFile('htmltags.in');
+end
+if (! $htmlAttr)
+    $htmlAttr = readTagFile('htmlattrs.in');
+end
+
+if (! $htmlValues)
+    $htmlValues = readTagFile('htmlvalues.in');
+end
+
+if (! $cssValues)
+    $cssValues = readTagFile('cssvalues.in');
+end
+
+### THE INTERACTION ##################################
+cgi = CGI.new("html4");
+
+$paramTestNum = cgi.params['test'][0].to_i
+$paramRandomMode = cgi.params['random'][0]
+$paramLookupMode = cgi.params['lookup'][0]
+$paramSubTestNum = cgi.params['subtest'][0].to_i || 0
+
+if ($paramTestNum)
+    srand($paramTestNum)
+else
+    srand
+end
+
+if $paramSubTestNum
+    if $paramSubTestNum > $maxTags
+        $paramSubTestNum = 0
+        $paramLookupMode = 1
+    else
+        maxTags=$paramSubTestNum
+    end
+else
+    maxTags=$maxTags
+end
+
+if $paramRandomMode
+    nextTest = rand(99999999)
+else
+    if $paramTestNum
+        nextTest = $paramTestNum + 1
+    end
+end
+
+
+if (! nextTest)
+    nextTest = 1
+end
+
+# building the HTML
+bodyText = mangleTag('html')
+bodyText << "\n<head>\n"
+
+# Only do redirects if lookup=1 has not been specified.
+if (! $paramLookupMode) && ($paramSubTestNum != $maxTags)
+    newpage = "iexploder.cgi?"
+    if $paramSubTestNum > 0
+        newpage << "test=" << $paramTestNum.to_s << "&subtest=" << ($paramSubTestNum + 1).to_s
+    else
+        newpage << "test=" << nextTest.to_s
+    end
+    
+    if $paramRandomMode
+        newpage << "&random=1"
+    end
+
+
+    bodyText << "\t<META HTTP-EQUIV=\"Refresh\" content=\"0;URL=#{newpage}\">\n" 
+    # use both techniques, because you never know how you might be corrupting yourself.
+    bodyText << "\t<script language=\"javascript\">setTimeout('window.location=\"#{newpage}\"', 1000);</script>\n" 
+end
+
+# If they have no test number, don't crash them, just redirect them to the next test.
+if (! $paramTestNum)
+    cgi.out {
+        cgi.html { bodyText }
+    }
+    exit
+end
+
+bodyText << "\t" << mangleTag('meta')
+bodyText << "\t" <<  mangleTag('meta')
+bodyText << "\t" <<  mangleTag('link')
+
+bodyText << "\t<title>(#{cgi['test']}) iExploder #{$VERSION}  - #{inventValue()}</title>\n"
+bodyText << "</head>\n\n"
+
+# What tags will we be messing with ######################
+tagList = [ 'body']
+
+1.upto($maxTags) { tagList << $htmlTags[rand($htmlTags.length)] }
+
+
+tagList.each { |tag|
+    bodyText << mangleTag(tag)
+    bodyText << inventValue() + "\n"
+}
+bodyText << "</body>\n</html>"
+
+cgi.out('type' => 'text/html') do
+    bodyText
+end
diff --git a/WebKitTools/iExploder/htdocs/index.html b/WebKitTools/iExploder/htdocs/index.html
new file mode 100644 (file)
index 0000000..9faa9c3
--- /dev/null
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+  <title>iExploder 1.2</title>
+</head>
+<body>
+<h2>iExploder: Web Browser Quality Assurance Tester</h2>
+<small>Written by <a href="http://toadstool.se/">Thomas Str&ouml;mberg</a> for the
+<a href="http://www.mozilla.org/firefox/">Mozilla FireFox</a> project</small>
+
+
+<ul>
+  <li><a href="iexploder.cgi">Start test sequence from the beginning!</a></li>
+  <li><a href="iexploder.cgi?random=1">Start test sequence in random</a></li>
+  <li>Start testing from a test number:
+    <form method="get" action="iexploder.cgi" name="test">
+       Test: <input size="9" name="test" value="1"> Subtest: <input size="2" name="subtest" value="">
+       <input value="Start" type="submit">
+    </form>
+  </li>
+
+  <li>Lookup a single test number:
+    <form method="get" action="iexploder.cgi" name="test">
+       <input type="hidden" name="lookup" value="1">
+       Test: <input size="9" name="test" value="1"> Subtest: <input size="2" name="subtest" value="">
+ <input value="Lookup" type="submit"></form>
+  </li>
+</ul>
+
+If your browser crashes, please contact thomas%stromberg.org!
+
+</body>
+</html>
+
diff --git a/WebKitTools/iExploder/tools/lasthit.rb b/WebKitTools/iExploder/tools/lasthit.rb
new file mode 100755 (executable)
index 0000000..b569deb
--- /dev/null
@@ -0,0 +1,53 @@
+#!/usr/bin/ruby
+# lasthit, part of iExploder
+# 
+# Shows statistics about recent agents that have tested with iExploder. 
+# It takes all or part of an apache logfile via stdin, and outputs a list
+# of all the agents who tested within that section, what their last test
+# was, and how many tests they have done.
+
+# The usefulness is finding out where a browser crashed.
+
+
+hostHash = Hash.new
+
+if (ARGV[0])
+       file = File.open(ARGV[0])
+else
+       file = $stdin
+end
+file.readlines.each { |line|
+       if (line =~ /^(.*?) .*iexploder.*?test=(\d+).* HTTP.* \"(.*?)\"$/)
+               host = $1
+               testnum = $2
+               agent = $3
+               if (! hostHash[host])
+                       hostHash[host] = Hash.new
+               end
+               if (! hostHash[host][agent])
+                       hostHash[host][agent] = Hash.new
+                       hostHash[host][agent]['total'] = 0
+               end
+
+               hostHash[host][agent]['last'] = testnum
+               if line =~ /subtest=(\d+)/
+                       hostHash[host][agent]['subtest'] = $1
+               else
+                       hostHash[host][agent]['subtest'] = ''
+               end
+               hostHash[host][agent]['total'] = hostHash[host][agent]['total'] + 1
+       end
+}
+
+printf("%14.14s | %8.8s | %3.3s | %8.8s | %s\n", 
+        "IP",    "Test", "SubTest", "Total", "Agent")
+puts "---------------------------------------------------------------------------"
+hostHash.each_key { |host|
+
+       hostHash[host].each_key { |agent|
+               printf("%14.14s | %8.8s | %3.3s | %8.8s | %s\n", 
+                       host, hostHash[host][agent]['last'],  hostHash[host][agent]['subtest'], hostHash[host][agent]['total'], agent);
+       }
+}
+
diff --git a/WebKitTools/iExploder/tools/osx_last_crash.rb b/WebKitTools/iExploder/tools/osx_last_crash.rb
new file mode 100755 (executable)
index 0000000..508295e
--- /dev/null
@@ -0,0 +1,48 @@
+#!/usr/bin/ruby
+# Gives you information about the most recent crash for each application
+# that has crashed within the last 60 minutes
+
+$LogDir=ENV['HOME'] + '/Library/Logs/CrashReporter'
+$Min=60
+$StackCount=5
+
+files=`find #{$LogDir} -mmin -#{$Min} -type f | grep -v synergy`
+files.each { |filename|
+    filename.chop!
+    record = 0
+    date=''
+    stackTrace = []
+
+    File.open(filename).readlines.each { |line|
+        #puts line
+
+        if line =~ /^Date.*(200.*)/
+            date = $1
+        end
+
+        if line =~ /^Thread \d+ Crashed/
+            record = 1
+            # reset the stack trace
+            stackTrace = []
+        end
+
+        if record
+            stackTrace << line
+            record = record + 1
+
+            # stop recording after $StackCount lines
+            if record > ($StackCount + 2)
+                record = nil
+            end
+        end
+    }
+
+    puts File.basename(filename) + " - " + date
+    puts "==================================================="
+    stackTrace.each { |line|
+        puts line
+    }
+    puts ""
+}
+
+