Reviewed by Darin.
authorap <ap@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 16 Apr 2006 09:29:13 +0000 (09:29 +0000)
committerap <ap@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 16 Apr 2006 09:29:13 +0000 (09:29 +0000)
        - fix http://bugzilla.opendarwin.org/show_bug.cgi?id=8412
          Restore color profile after a crash

        * DumpRenderTree/DumpRenderTree.m:
        (crashHandler): Added a handler for signals that are raised on a crash. Keeping separate
        from the existing handler for manual interruption (SIGINT/SIGHUP/SIGTERM), because
        I'm trying to find a way to prevent the Crash Reporter dialog from appearing on crash,
        and this code may change significantly.

        (main): Install crashHandler.

        (setDefaultColorProfileToRGB): Properly convert CFStringRef to a char buffer
        (CFStringGetCStringPtr should NEVER EVER be used!).

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

WebKitTools/ChangeLog
WebKitTools/DumpRenderTree/DumpRenderTree.m

index 298b7ee..18c44f0 100644 (file)
@@ -1,3 +1,21 @@
+2006-04-16  Alexey Proskuryakov  <ap@nypop.com>
+
+        Reviewed by Darin.
+
+        - fix http://bugzilla.opendarwin.org/show_bug.cgi?id=8412
+          Restore color profile after a crash
+
+        * DumpRenderTree/DumpRenderTree.m:
+        (crashHandler): Added a handler for signals that are raised on a crash. Keeping separate
+        from the existing handler for manual interruption (SIGINT/SIGHUP/SIGTERM), because
+        I'm trying to find a way to prevent the Crash Reporter dialog from appearing on crash,
+        and this code may change significantly.
+
+        (main): Install crashHandler.
+
+        (setDefaultColorProfileToRGB): Properly convert CFStringRef to a char buffer
+        (CFStringGetCStringPtr should NEVER EVER be used!).
+
 2006-04-15  Darin Adler  <darin@apple.com>
 
         Reviewed by Eric.
index b3f814f..11fc881 100644 (file)
@@ -117,6 +117,13 @@ static void restoreColorSpace(int ignored)
     }
 }
 
+static void crashHandler(int sig)
+{
+    fprintf(stderr, "%s\n", strsignal(sig));
+    restoreColorSpace(0);
+    exit(128 + sig);
+}
+
 static void setDefaultColorProfileToRGB(void)
 {
     CMProfileRef genericProfile = [[NSColorSpace genericRGBColorSpace] colorSyncProfile];
@@ -130,26 +137,28 @@ static void setDefaultColorProfileToRGB(void)
         return;
     CFStringRef previousProfileName;
     CFStringRef genericProfileName;
+    char previousProfileNameString[1024];
+    char genericProfileNameString[1024];
     CMCopyProfileDescriptionString(previousProfile, &previousProfileName);
     CMCopyProfileDescriptionString(genericProfile, &genericProfileName);
+    CFStringGetCString(previousProfileName, previousProfileNameString, sizeof(previousProfileNameString), kCFStringEncodingUTF8);
+    CFStringGetCString(genericProfileName, genericProfileNameString, sizeof(previousProfileNameString), kCFStringEncodingUTF8);
+    CFRelease(genericProfileName);
+    CFRelease(previousProfileName);
     
-    fprintf(stderr, "\n\nWARNING: Temporarily changing your system color profile from \"%s\" to \"%s\".\n",
-        CFStringGetCStringPtr(previousProfileName, kCFStringEncodingMacRoman),
-        CFStringGetCStringPtr(genericProfileName, kCFStringEncodingMacRoman));
+    fprintf(stderr, "\n\nWARNING: Temporarily changing your system color profile from \"%s\" to \"%s\".\n", previousProfileNameString, genericProfileNameString);
     fprintf(stderr, "This allows the WebKit pixel-based regression tests to have consistent color values across all machines.\n");
     fprintf(stderr, "The colors on your screen will change for the duration of the testing.\n\n");
     
     if ((error = CMSetDefaultProfileByUse(cmDisplayUse, genericProfile)))
         fprintf(stderr, "Failed to set color profile to \"%s\"! Many pixel tests will fail as a result.  (Error: %i)",
-            CFStringGetCStringPtr(genericProfileName, kCFStringEncodingMacRoman), error);
+            genericProfileNameString, error);
     else {
         currentColorProfile = previousProfile;
         signal(SIGINT, restoreColorSpace);
         signal(SIGHUP, restoreColorSpace);
         signal(SIGTERM, restoreColorSpace);
     }
-    CFRelease(genericProfileName);
-    CFRelease(previousProfileName);
 }
 
 static void* (*savedMalloc)(malloc_zone_t*, size_t);
@@ -276,6 +285,17 @@ int main(int argc, const char *argv[])
     [webView setContinuousSpellCheckingEnabled:YES];
 
     makeLargeMallocFailSilently();
+
+    signal(SIGILL, crashHandler);    /* 4:   illegal instruction (not reset when caught) */
+    signal(SIGTRAP, crashHandler);   /* 5:   trace trap (not reset when caught) */
+    signal(SIGEMT, crashHandler);    /* 7:   EMT instruction */
+    signal(SIGFPE, crashHandler);    /* 8:   floating point exception */
+    signal(SIGBUS, crashHandler);    /* 10:  bus error */
+    signal(SIGSEGV, crashHandler);   /* 11:  segmentation violation */
+    signal(SIGSYS, crashHandler);    /* 12:  bad argument to system call */
+    signal(SIGPIPE, crashHandler);   /* 13:  write on a pipe with no reader */
+    signal(SIGXCPU, crashHandler);   /* 24:  exceeded CPU time limit */
+    signal(SIGXFSZ, crashHandler);   /* 25:  exceeded file size limit */
     
     // For reasons that are not entirely clear, the following pair of calls makes WebView handle its
     // dynamic scrollbars properly. Without it, every frame will always have scrollbars.