[SCM] WebKit Debian packaging branch, debian/unstable, updated. debian/1.1.15-1-40151-g37bb677

mjs mjs at 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Sat Sep 26 07:59:56 UTC 2009


The following commit has been merged in the debian/unstable branch:
commit 5ea58b66ef787698df52634a4317418fcaa6ca24
Author: mjs <mjs at 268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Wed Oct 8 21:23:49 2003 +0000

            Reviewed by Ken.
    
    	Start on blocking Cocoa exceptions when calling ObjC from C++ to
    	avoid unreproducible crashes when this happens.
    
            * kwq/KWQExceptions.h: Added. Helper macros for exception blocking.
            * WebCore.pbproj/project.pbxproj: Add new header
    
    	In all these files, block exceptions when calling ObjC from C++,
    	or explain why not.
    
            * kwq/KWQAccObjectCache.mm:
            * kwq/KWQApplication.mm:
            * kwq/KWQButton.mm:
            (QButton::QButton):
            (QButton::~QButton):
            (QButton::setText):
            (QButton::text):
            (QButton::clicked):
            (QButton::simulateClick):
            (QButton::setFont):
            (QButton::focusPolicy):
            * kwq/KWQCheckBox.mm:
            (QCheckBox::QCheckBox):
            (QCheckBox::setChecked):
            (QCheckBox::isChecked):
            (QCheckBox::dimensions):
            * kwq/KWQColor.mm:
            * kwq/KWQComboBox.mm:
            (QComboBox::QComboBox):
            (QComboBox::~QComboBox):
            (QComboBox::insertItem):
            (QComboBox::sizeHint):
            (QComboBox::setCurrentItem):
            (QComboBox::updateCurrentItem):
            (QComboBox::setFont):
            (QComboBox::dimensions):
            * kwq/KWQCursor.mm:
            * kwq/KWQFile.mm:
            * kwq/KWQFileButton.mm:
            (KWQFileButton::KWQFileButton):
            (KWQFileButton::~KWQFileButton):
            (KWQFileButton::setFilename):
            (KWQFileButton::sizeForCharacterWidth):
            (KWQFileButton::frameGeometry):
            (KWQFileButton::setFrameGeometry):
            (KWQFileButton::baselinePosition):
            (KWQFileButton::filenameChanged):
            * kwq/KWQKCookieJar.mm:
            (KWQKCookieJar::cookie):
            (KWQKCookieJar::setCookie):
            (KWQKCookieJar::cookieEnabled):
            * kwq/KWQKHTMLPartBrowserExtension.mm:
            (KHTMLPartBrowserExtension::createNewWindow):
            (KHTMLPartBrowserExtension::setIconURL):
            (KHTMLPartBrowserExtension::setTypedIconURL):
            * kwq/KWQKHistoryProvider.mm:
            (KParts::HistoryProvider::contains):
            * kwq/KWQKPartsBrowserInterface.mm:
            (KParts::BrowserInterface::callMethod):
            * kwq/KWQKStandardDirs.mm:
            * kwq/KWQKURL.mm:
            * kwq/KWQKWinModule.mm:
            (KWinModule::workArea):
            * kwq/KWQObject.mm:
            * kwq/KWQString.mm:
            (QString::getNSString):
            * kwq/KWQTimer.mm:
            * kwq/KWQWindowWidget.mm:
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@5147 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog-2003-10-25 b/WebCore/ChangeLog-2003-10-25
index 15d6028..1f2afce 100644
--- a/WebCore/ChangeLog-2003-10-25
+++ b/WebCore/ChangeLog-2003-10-25
@@ -1,3 +1,75 @@
+2003-10-08  Maciej Stachowiak  <mjs at apple.com>
+
+        Reviewed by Ken.
+
+	Start on blocking Cocoa exceptions when calling ObjC from C++ to
+	avoid unreproducible crashes when this happens.
+
+        * kwq/KWQExceptions.h: Added. Helper macros for exception blocking.
+        * WebCore.pbproj/project.pbxproj: Add new header
+
+	In all these files, block exceptions when calling ObjC from C++,
+	or explain why not.
+	
+        * kwq/KWQAccObjectCache.mm:
+        * kwq/KWQApplication.mm:
+        * kwq/KWQButton.mm:
+        (QButton::QButton):
+        (QButton::~QButton):
+        (QButton::setText):
+        (QButton::text):
+        (QButton::clicked):
+        (QButton::simulateClick):
+        (QButton::setFont):
+        (QButton::focusPolicy):
+        * kwq/KWQCheckBox.mm:
+        (QCheckBox::QCheckBox):
+        (QCheckBox::setChecked):
+        (QCheckBox::isChecked):
+        (QCheckBox::dimensions):
+        * kwq/KWQColor.mm:
+        * kwq/KWQComboBox.mm:
+        (QComboBox::QComboBox):
+        (QComboBox::~QComboBox):
+        (QComboBox::insertItem):
+        (QComboBox::sizeHint):
+        (QComboBox::setCurrentItem):
+        (QComboBox::updateCurrentItem):
+        (QComboBox::setFont):
+        (QComboBox::dimensions):
+        * kwq/KWQCursor.mm:
+        * kwq/KWQFile.mm:
+        * kwq/KWQFileButton.mm:
+        (KWQFileButton::KWQFileButton):
+        (KWQFileButton::~KWQFileButton):
+        (KWQFileButton::setFilename):
+        (KWQFileButton::sizeForCharacterWidth):
+        (KWQFileButton::frameGeometry):
+        (KWQFileButton::setFrameGeometry):
+        (KWQFileButton::baselinePosition):
+        (KWQFileButton::filenameChanged):
+        * kwq/KWQKCookieJar.mm:
+        (KWQKCookieJar::cookie):
+        (KWQKCookieJar::setCookie):
+        (KWQKCookieJar::cookieEnabled):
+        * kwq/KWQKHTMLPartBrowserExtension.mm:
+        (KHTMLPartBrowserExtension::createNewWindow):
+        (KHTMLPartBrowserExtension::setIconURL):
+        (KHTMLPartBrowserExtension::setTypedIconURL):
+        * kwq/KWQKHistoryProvider.mm:
+        (KParts::HistoryProvider::contains):
+        * kwq/KWQKPartsBrowserInterface.mm:
+        (KParts::BrowserInterface::callMethod):
+        * kwq/KWQKStandardDirs.mm:
+        * kwq/KWQKURL.mm:
+        * kwq/KWQKWinModule.mm:
+        (KWinModule::workArea):
+        * kwq/KWQObject.mm:
+        * kwq/KWQString.mm:
+        (QString::getNSString):
+        * kwq/KWQTimer.mm:
+        * kwq/KWQWindowWidget.mm:
+
 2003-10-07  David Hyatt  <hyatt at apple.com>
 
 	Fix for link dragging regression in the titles of links.  More accessibility 
diff --git a/WebCore/ChangeLog-2005-08-23 b/WebCore/ChangeLog-2005-08-23
index 15d6028..1f2afce 100644
--- a/WebCore/ChangeLog-2005-08-23
+++ b/WebCore/ChangeLog-2005-08-23
@@ -1,3 +1,75 @@
+2003-10-08  Maciej Stachowiak  <mjs at apple.com>
+
+        Reviewed by Ken.
+
+	Start on blocking Cocoa exceptions when calling ObjC from C++ to
+	avoid unreproducible crashes when this happens.
+
+        * kwq/KWQExceptions.h: Added. Helper macros for exception blocking.
+        * WebCore.pbproj/project.pbxproj: Add new header
+
+	In all these files, block exceptions when calling ObjC from C++,
+	or explain why not.
+	
+        * kwq/KWQAccObjectCache.mm:
+        * kwq/KWQApplication.mm:
+        * kwq/KWQButton.mm:
+        (QButton::QButton):
+        (QButton::~QButton):
+        (QButton::setText):
+        (QButton::text):
+        (QButton::clicked):
+        (QButton::simulateClick):
+        (QButton::setFont):
+        (QButton::focusPolicy):
+        * kwq/KWQCheckBox.mm:
+        (QCheckBox::QCheckBox):
+        (QCheckBox::setChecked):
+        (QCheckBox::isChecked):
+        (QCheckBox::dimensions):
+        * kwq/KWQColor.mm:
+        * kwq/KWQComboBox.mm:
+        (QComboBox::QComboBox):
+        (QComboBox::~QComboBox):
+        (QComboBox::insertItem):
+        (QComboBox::sizeHint):
+        (QComboBox::setCurrentItem):
+        (QComboBox::updateCurrentItem):
+        (QComboBox::setFont):
+        (QComboBox::dimensions):
+        * kwq/KWQCursor.mm:
+        * kwq/KWQFile.mm:
+        * kwq/KWQFileButton.mm:
+        (KWQFileButton::KWQFileButton):
+        (KWQFileButton::~KWQFileButton):
+        (KWQFileButton::setFilename):
+        (KWQFileButton::sizeForCharacterWidth):
+        (KWQFileButton::frameGeometry):
+        (KWQFileButton::setFrameGeometry):
+        (KWQFileButton::baselinePosition):
+        (KWQFileButton::filenameChanged):
+        * kwq/KWQKCookieJar.mm:
+        (KWQKCookieJar::cookie):
+        (KWQKCookieJar::setCookie):
+        (KWQKCookieJar::cookieEnabled):
+        * kwq/KWQKHTMLPartBrowserExtension.mm:
+        (KHTMLPartBrowserExtension::createNewWindow):
+        (KHTMLPartBrowserExtension::setIconURL):
+        (KHTMLPartBrowserExtension::setTypedIconURL):
+        * kwq/KWQKHistoryProvider.mm:
+        (KParts::HistoryProvider::contains):
+        * kwq/KWQKPartsBrowserInterface.mm:
+        (KParts::BrowserInterface::callMethod):
+        * kwq/KWQKStandardDirs.mm:
+        * kwq/KWQKURL.mm:
+        * kwq/KWQKWinModule.mm:
+        (KWinModule::workArea):
+        * kwq/KWQObject.mm:
+        * kwq/KWQString.mm:
+        (QString::getNSString):
+        * kwq/KWQTimer.mm:
+        * kwq/KWQWindowWidget.mm:
+
 2003-10-07  David Hyatt  <hyatt at apple.com>
 
 	Fix for link dragging regression in the titles of links.  More accessibility 
diff --git a/WebCore/WebCore.pbproj/project.pbxproj b/WebCore/WebCore.pbproj/project.pbxproj
index 3ca57a1..87194af 100644
--- a/WebCore/WebCore.pbproj/project.pbxproj
+++ b/WebCore/WebCore.pbproj/project.pbxproj
@@ -511,6 +511,7 @@
 				BE983D96052A2E0A00892D85,
 				55998A5E052B59CC0017A6C1,
 				55998A60052B59CC0017A6C1,
+				65A640F10533BB1F0085E777,
 			);
 			isa = PBXHeadersBuildPhase;
 			runOnlyForDeploymentPostprocessing = 0;
@@ -1003,6 +1004,30 @@
 //552
 //553
 //554
+//650
+//651
+//652
+//653
+//654
+		65A640F00533BB1F0085E777 = {
+			expectedFileType = sourcecode.c.h;
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			path = KWQExceptions.h;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		65A640F10533BB1F0085E777 = {
+			fileRef = 65A640F00533BB1F0085E777;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+//650
+//651
+//652
+//653
+//654
 //840
 //841
 //842
@@ -2269,6 +2294,7 @@
 				354F248A02EE28590ACA2ACA,
 				931C8A160380288B008635CE,
 				931C8A170380288B008635CE,
+				65A640F00533BB1F0085E777,
 				93CCF7D4033BD43C008635CE,
 				93CCF7D5033BD43C008635CE,
 				9394E0A903AA60FB008635CE,
diff --git a/WebCore/kwq/KWQAccObjectCache.mm b/WebCore/kwq/KWQAccObjectCache.mm
index a8359cf..65e073b 100644
--- a/WebCore/kwq/KWQAccObjectCache.mm
+++ b/WebCore/kwq/KWQAccObjectCache.mm
@@ -26,6 +26,8 @@
 #include "KWQAccObjectCache.h"
 #include "KWQAccObject.h"
 
+// The simple Cocoa calls in this file can't throw.
+
 KWQAccObjectCache::KWQAccObjectCache()
 {
     accCache = NULL;
diff --git a/WebCore/kwq/KWQApplication.mm b/WebCore/kwq/KWQApplication.mm
index efbdbb1..d12ff22 100644
--- a/WebCore/kwq/KWQApplication.mm
+++ b/WebCore/kwq/KWQApplication.mm
@@ -26,6 +26,9 @@
 #import "KWQApplication.h"
 #import "KWQLogging.h"
 
+// The NSScreen Cocoa calls in this file should never throw, so
+// there's no need to block exceptions.
+
 QPalette QApplication::palette(const QWidget *p)
 {
     static QPalette pal;
diff --git a/WebCore/kwq/KWQButton.mm b/WebCore/kwq/KWQButton.mm
index b0bb6b4..79e3016 100644
--- a/WebCore/kwq/KWQButton.mm
+++ b/WebCore/kwq/KWQButton.mm
@@ -27,6 +27,7 @@
 
 #import "KWQAssertions.h"
 #import "KWQCheckBox.h"
+#import "KWQExceptions.h"
 #import "KWQKHTMLPart.h"
 #import "KWQNSViewExtras.h"
 #import "WebCoreBridge.h"
@@ -139,36 +140,54 @@
 QButton::QButton()
     : m_clicked(this, SIGNAL(clicked()))
 {
+    KWQ_BLOCK_NS_EXCEPTIONS;
+
     KWQButton *button = [[KWQButton alloc] initWithQButton:this];
+    setView(button);
+    [button release];
     
     [button setTarget:button];
     [button setAction:@selector(action:)];
-
+    
     [button setTitle:@""];
     [[button cell] setControlSize:NSSmallControlSize];
     [button setFont:[NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
 
-    setView(button);
-
-    [button release];
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
 }
 
 QButton::~QButton()
 {
+    KWQ_BLOCK_NS_EXCEPTIONS;
+
     NSButton *button = (NSButton *)getView();
     [button setTarget:nil];
+
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
 }
 
 void QButton::setText(const QString &s)
 {
+    KWQ_BLOCK_NS_EXCEPTIONS;
+
     NSButton *button = (NSButton *)getView();
     [button setTitle:s.getNSString()];
+
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
 }
 
 QString QButton::text() const
 {
+    QString result;
+
+    KWQ_BLOCK_NS_EXCEPTIONS;
+
     NSButton *button = (NSButton *)getView();
-    return QString::fromNSString([button title]);
+    result = QString::fromNSString([button title]);
+    
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
+
+    return result;
 }
 
 void QButton::clicked()
@@ -179,6 +198,8 @@ void QButton::clicked()
     //   3) clicked
     // Proper behavior of check boxes, at least, depends on this order.
     
+    KWQ_BLOCK_NS_EXCEPTIONS;
+
     KWQButton *button = (KWQButton *)getView();
     [button sendConsumedMouseUpIfNeeded];
 
@@ -186,22 +207,32 @@ void QButton::clicked()
     if ([button target]) {
         m_clicked.call();
     }
+
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
 }
 
 void QButton::simulateClick()
 {
+    KWQ_BLOCK_NS_EXCEPTIONS;
+
     KWQButton *button = (KWQButton *)getView();
     [button simulateClick];
+
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
 }
 
 void QButton::setFont(const QFont &f)
 {
+    KWQ_BLOCK_NS_EXCEPTIONS;
+
     QWidget::setFont(f);
 
     const NSControlSize size = KWQNSControlSizeForFont(f);    
     NSControl * const button = static_cast<NSControl *>(getView());
     [[button cell] setControlSize:size];
     [button setFont:[NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:size]]];
+
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
 }
 
 NSControlSize KWQNSControlSizeForFont(const QFont &f)
@@ -223,12 +254,16 @@ NSControlSize KWQNSControlSizeForFont(const QFont &f)
 
 QWidget::FocusPolicy QButton::focusPolicy() const
 {
+    KWQ_BLOCK_NS_EXCEPTIONS;
+
     // Add an additional check here.
     // For now, buttons are only focused when full
     // keyboard access is turned on.
     if ([KWQKHTMLPart::bridgeForWidget(this) keyboardUIMode] != WebCoreFullKeyboardAccess)
         return NoFocus;
 
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
+
     return QWidget::focusPolicy();
 }
 
diff --git a/WebCore/kwq/KWQCheckBox.mm b/WebCore/kwq/KWQCheckBox.mm
index 0e39ef9..da6c270 100644
--- a/WebCore/kwq/KWQCheckBox.mm
+++ b/WebCore/kwq/KWQCheckBox.mm
@@ -24,6 +24,7 @@
  */
 
 #import "KWQCheckBox.h"
+#import "KWQExceptions.h"
 
 enum {
     topMargin,
@@ -38,8 +39,12 @@ enum {
 QCheckBox::QCheckBox(QWidget *w)
     : m_stateChanged(this, SIGNAL(stateChanged(int)))
 {
+    KWQ_BLOCK_NS_EXCEPTIONS;
+
     NSButton *button = (NSButton *)getView();
     [button setButtonType:NSSwitchButton];
+
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
 }
 
 QSize QCheckBox::sizeHint() const 
@@ -64,14 +69,26 @@ void QCheckBox::setFrameGeometry(const QRect &r)
 
 void QCheckBox::setChecked(bool isChecked)
 {
+    KWQ_BLOCK_NS_EXCEPTIONS;
+
     NSButton *button = (NSButton *)getView();
     [button setState:isChecked ? NSOnState : NSOffState];
+
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
 }
 
 bool QCheckBox::isChecked()
 {
+    volatile bool result = false;
+
+    KWQ_BLOCK_NS_EXCEPTIONS;
+
     NSButton *button = (NSButton *)getView();
-    return [button state] == NSOnState;
+    result = [button state] == NSOnState;
+
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
+
+    return result;
 }
 
 void QCheckBox::clicked()
@@ -100,5 +117,11 @@ const int *QCheckBox::dimensions() const
         { 4, 3, 3, 3, 2, 10, 10 },
     };
     NSControl * const button = static_cast<NSControl *>(getView());
-    return w[[[button cell] controlSize]];
+    volatile NSControlSize size = NSSmallControlSize;
+
+    KWQ_BLOCK_NS_EXCEPTIONS;
+    size = [[button cell] controlSize];
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
+
+    return w[size];
 }
diff --git a/WebCore/kwq/KWQColor.mm b/WebCore/kwq/KWQColor.mm
index e184409..baff496 100644
--- a/WebCore/kwq/KWQColor.mm
+++ b/WebCore/kwq/KWQColor.mm
@@ -29,6 +29,8 @@
 #import "KWQString.h"
 #import "KWQAssertions.h"
 
+// NSColor calls don't throw, so no need to block Cocoa exceptions in this file
+
 // Turn off inlining to avoid warning with newer gcc.
 #undef __inline
 #define __inline
diff --git a/WebCore/kwq/KWQComboBox.mm b/WebCore/kwq/KWQComboBox.mm
index 96ec7ae..c82f363 100644
--- a/WebCore/kwq/KWQComboBox.mm
+++ b/WebCore/kwq/KWQComboBox.mm
@@ -26,11 +26,12 @@
 #import "KWQComboBox.h"
 
 #import "KWQButton.h"
+#import "KWQExceptions.h"
+#import "KWQKHTMLPart.h"
 #import "KWQView.h"
 #import "KWQKHTMLPart.h"
 #import "KWQNSViewExtras.h"
 #import "WebCoreBridge.h"
-
 #import "khtmlview.h"
 #import "render_replaced.h"
 
@@ -68,11 +69,16 @@ enum {
 @end
 
 QComboBox::QComboBox()
-    : _adapter([[KWQComboBoxAdapter alloc] initWithQComboBox:this])
+    : _adapter(0)
     , _widthGood(false)
     , _activated(this, SIGNAL(activated(int)))
 {
+    KWQ_BLOCK_NS_EXCEPTIONS;
+
+    _adapter = [[KWQComboBoxAdapter alloc] initWithQComboBox:this];
     KWQPopUpButton *button = [[KWQPopUpButton alloc] init];
+    setView(button);
+    [button release];
     
     KWQPopUpButtonCell *cell = [[KWQPopUpButtonCell alloc] initWithWidget:this];
     [button setCell:cell];
@@ -84,22 +90,28 @@ QComboBox::QComboBox()
     [[button cell] setControlSize:NSSmallControlSize];
     [button setFont:[NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
 
-    setView(button);
-
-    [button release];
-
     updateCurrentItem();
+
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
 }
 
 QComboBox::~QComboBox()
 {
+    KWQ_BLOCK_NS_EXCEPTIONS;
+
     KWQPopUpButton *button = (KWQPopUpButton *)getView();
     [button setTarget:nil];
     [_adapter release];
+
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
 }
 
-void QComboBox::insertItem(const QString &text, int index)
+void QComboBox::insertItem(const QString &text, int i)
 {
+    KWQ_BLOCK_NS_EXCEPTIONS;
+
+    int index = i;
+
     KWQPopUpButton *button = (KWQPopUpButton *)getView();
     int numItems = [button numberOfItems];
     if (index < 0) {
@@ -116,10 +128,16 @@ void QComboBox::insertItem(const QString &text, int index)
     _widthGood = false;
 
     updateCurrentItem();
+
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
 }
 
 QSize QComboBox::sizeHint() const 
 {
+    NSSize size = {0,0};
+
+    KWQ_BLOCK_NS_EXCEPTIONS;
+
     KWQPopUpButton *button = (KWQPopUpButton *)getView();
     
     float width;
@@ -141,8 +159,12 @@ QSize QComboBox::sizeHint() const
         _widthGood = true;
     }
     
+    size = [[button cell] cellSize];
+
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
+
     return QSize((int)_width + dimensions()[widthNotIncludingText],
-        (int)[[button cell] cellSize].height - (dimensions()[topMargin] + dimensions()[bottomMargin]));
+        (int)size.height - (dimensions()[topMargin] + dimensions()[bottomMargin]));
 }
 
 QRect QComboBox::frameGeometry() const
@@ -177,15 +199,26 @@ void QComboBox::clear()
 
 void QComboBox::setCurrentItem(int index)
 {
+    KWQ_BLOCK_NS_EXCEPTIONS;
+
     KWQPopUpButton *button = (KWQPopUpButton *)getView();
     [button selectItemAtIndex:index];
+
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
+
     updateCurrentItem();
 }
 
 bool QComboBox::updateCurrentItem() const
 {
     KWQPopUpButton *button = (KWQPopUpButton *)getView();
-    int i = [button indexOfSelectedItem];
+
+    volatile int i = 0;
+
+    KWQ_BLOCK_NS_EXCEPTIONS;
+    i = [button indexOfSelectedItem];
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
+
     if (_currentItem == i) {
         return false;
     }
@@ -206,11 +239,16 @@ void QComboBox::setFont(const QFont &f)
 
     const NSControlSize size = KWQNSControlSizeForFont(f);
     NSControl * const button = static_cast<NSControl *>(getView());
+
+    KWQ_BLOCK_NS_EXCEPTIONS;
+
     if (size != [[button cell] controlSize]) {
         [[button cell] setControlSize:size];
         [button setFont:[NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:size]]];
         _widthGood = false;
     }
+
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
 }
 
 const int *QComboBox::dimensions() const
@@ -223,7 +261,13 @@ const int *QComboBox::dimensions() const
         { 0, 0, 1, 1, 2, 32, 0 }
     };
     NSControl * const button = static_cast<NSControl *>(getView());
-    return w[[[button cell] controlSize]];
+
+    volatile NSControlSize size = NSSmallControlSize;
+    KWQ_BLOCK_NS_EXCEPTIONS;
+    size = [[button cell] controlSize];
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
+
+    return w[size];
 }
 
 QWidget::FocusPolicy QComboBox::focusPolicy() const
diff --git a/WebCore/kwq/KWQCursor.mm b/WebCore/kwq/KWQCursor.mm
index eb7b9bf..dbfda65 100644
--- a/WebCore/kwq/KWQCursor.mm
+++ b/WebCore/kwq/KWQCursor.mm
@@ -26,6 +26,8 @@
 #import "KWQCursor.h"
 #import "KWQLogging.h"
 
+// The NSCursor cocoa calls here can't fail, so no need to block Cocoa exceptions
+
 QCursor::QCursor()
     : cursor(nil)
 {
diff --git a/WebCore/kwq/WebCoreImageRendererFactory.m b/WebCore/kwq/KWQExceptions.h
similarity index 76%
copy from WebCore/kwq/WebCoreImageRendererFactory.m
copy to WebCore/kwq/KWQExceptions.h
index e2a0005..ead0257 100644
--- a/WebCore/kwq/WebCoreImageRendererFactory.m
+++ b/WebCore/kwq/KWQExceptions.h
@@ -23,26 +23,19 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
  */
 
-#import "WebCoreImageRendererFactory.h"
+#import <Foundation/NSException.h>
 #import "KWQAssertions.h"
 
- at implementation WebCoreImageRendererFactory
+#define KWQ_BLOCK_NS_EXCEPTIONS NS_DURING
 
-static WebCoreImageRendererFactory *sharedFactory;
+#define KWQ_UNBLOCK_NS_EXCEPTIONS NS_HANDLER \
+     if (ASSERT_DISABLED) { \
+     NSLog(@"Uncaught exception - %@\n", localException); \
+     } else { \
+     ASSERT_WITH_MESSAGE(@"Uncaught exception - %@", localException); \
+     } \
+NS_ENDHANDLER
 
-+ (WebCoreImageRendererFactory *)sharedFactory
-{
-    return sharedFactory;
-}
+#define KWQ_UNBLOCK_RETURN_VALUE(val,type) NS_VALUERETURN(val,type)
 
-- init
-{
-    [super init];
-    
-    ASSERT(!sharedFactory);
-    sharedFactory = [self retain];
-    
-    return self;
-}
-
- at end
+#define KWQ_UNBLOCK_RETURN NS_VOIDRETURN
diff --git a/WebCore/kwq/KWQFile.mm b/WebCore/kwq/KWQFile.mm
index a76ca9a..60530b6 100644
--- a/WebCore/kwq/KWQFile.mm
+++ b/WebCore/kwq/KWQFile.mm
@@ -25,6 +25,7 @@
 
 #import "KWQFile.h"
 
+// This NSString call can't throw so no need to block exceptions
 QFile::QFile(const QString &n) : name(strdup(n.isEmpty() ? "" : [n.getNSString() fileSystemRepresentation])), fd(-1)
 {
 }
diff --git a/WebCore/kwq/KWQFileButton.mm b/WebCore/kwq/KWQFileButton.mm
index 40b5833..0dd4352 100644
--- a/WebCore/kwq/KWQFileButton.mm
+++ b/WebCore/kwq/KWQFileButton.mm
@@ -26,6 +26,7 @@
 #import "KWQFileButton.h"
 
 #import "KWQAssertions.h"
+#import "KWQExceptions.h"
 #import "KWQKHTMLPart.h"
 #import "WebCoreBridge.h"
 
@@ -43,54 +44,91 @@ NSString *WebCoreFileButtonClicked = @"WebCoreFileButtonClicked";
 @end
 
 KWQFileButton::KWQFileButton(KHTMLPart *part)
-    : QWidget([KWQ(part)->bridge() fileButton])
-    , _clicked(this, SIGNAL(clicked()))
+    : _clicked(this, SIGNAL(clicked()))
     , _textChanged(this, SIGNAL(textChanged(const QString &)))
-    , _adapter([[KWQFileButtonAdapter alloc] initWithKWQFileButton:this])
+    , _adapter(0)
 {
+    KWQ_BLOCK_NS_EXCEPTIONS;
+
+    setView([KWQ(part)->bridge() fileButton]);
+    _adapter = [[KWQFileButtonAdapter alloc] initWithKWQFileButton:this];
+
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
 }
 
 KWQFileButton::~KWQFileButton()
 {
     _adapter->button = 0;
+    KWQ_BLOCK_NS_EXCEPTIONS;
     [_adapter release];
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
 }
     
 void KWQFileButton::setFilename(const QString &f)
 {
     NSView <WebCoreFileButton> *button = getView();
+
+    KWQ_BLOCK_NS_EXCEPTIONS;
     [button setFilename:f.getNSString()];
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
 }
 
 QSize KWQFileButton::sizeForCharacterWidth(int characters) const
 {
     ASSERT(characters > 0);
     NSView <WebCoreFileButton> *button = getView();
-    return QSize([button bestVisualFrameSizeForCharacterCount:characters]);
+
+    NSSize size = {0,0};
+    KWQ_BLOCK_NS_EXCEPTIONS;
+    size = [button bestVisualFrameSizeForCharacterCount:characters];
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
+
+    return QSize(size);
 }
 
 QRect KWQFileButton::frameGeometry() const
 {
     NSView <WebCoreFileButton> *button = getView();
-    return QRect([button visualFrame]);
+
+    NSRect frame = {{0,0},{0,0}};
+    KWQ_BLOCK_NS_EXCEPTIONS;
+    frame = [button visualFrame];
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
+
+    return QRect(frame);
 }
 
 void KWQFileButton::setFrameGeometry(const QRect &rect)
 {
     NSView <WebCoreFileButton> *button = getView();
+
+    KWQ_BLOCK_NS_EXCEPTIONS;
     [button setVisualFrame:rect];
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
 }
 
 int KWQFileButton::baselinePosition() const
 {
     NSView <WebCoreFileButton> *button = getView();
-    return (int)([button frame].origin.y + [button baseline] - [button visualFrame].origin.y);
+
+    volatile int position = 0;
+    KWQ_BLOCK_NS_EXCEPTIONS;
+    position = (int)([button frame].origin.y + [button baseline] - [button visualFrame].origin.y);
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
+
+    return position;
 }
 
 void KWQFileButton::filenameChanged()
 {
     NSView <WebCoreFileButton> *button = getView();
-    _textChanged.call(QString::fromNSString([button filename]));
+
+    QString filename;
+    KWQ_BLOCK_NS_EXCEPTIONS;
+    filename = QString::fromNSString([button filename]);
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
+
+    _textChanged.call();
 }
 
 void KWQFileButton::clicked()
diff --git a/WebCore/kwq/KWQKCookieJar.mm b/WebCore/kwq/KWQKCookieJar.mm
index 6bdd638..ac3a103 100644
--- a/WebCore/kwq/KWQKCookieJar.mm
+++ b/WebCore/kwq/KWQKCookieJar.mm
@@ -25,14 +25,21 @@
 
 #import "KWQKCookieJar.h"
 
-#import "WebCoreCookieAdapter.h"
+#import "KWQExceptions.h"
 #import "KWQKURL.h"
+#import "WebCoreCookieAdapter.h"
+#import <Foundation/NSString.h>
 
 QString KWQKCookieJar::cookie(const KURL &url)
 {
-    NSString *result = [[WebCoreCookieAdapter sharedAdapter] cookiesForURL:url.url().getNSString()];
+    volatile NSString * volatile result = nil;
+
+    KWQ_BLOCK_NS_EXCEPTIONS;
+    result = [[WebCoreCookieAdapter sharedAdapter] cookiesForURL:url.url().getNSString()];
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
+
     if (result != nil) {
-        return QString::fromNSString(result);
+        return QString::fromNSString((NSString *)result);
     } else {
         return QString();
     }
@@ -40,11 +47,21 @@ QString KWQKCookieJar::cookie(const KURL &url)
 
 void KWQKCookieJar::setCookie(const KURL &url, const KURL &policyBaseURL, const QString &cookie)
 {
+    KWQ_BLOCK_NS_EXCEPTIONS;
+
     [[WebCoreCookieAdapter sharedAdapter] setCookies:cookie.getNSString()
-        forURL:url.url().getNSString() policyBaseURL:policyBaseURL.url().getNSString()];
+     forURL:url.url().getNSString() policyBaseURL:policyBaseURL.url().getNSString()];
+
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
 }
 
 bool KWQKCookieJar::cookieEnabled()
 {
-    return [[WebCoreCookieAdapter sharedAdapter] cookiesEnabled];
+    volatile bool enabled = false;
+    
+    KWQ_BLOCK_NS_EXCEPTIONS;
+    enabled = [[WebCoreCookieAdapter sharedAdapter] cookiesEnabled];
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
+
+    return enabled;
 }
diff --git a/WebCore/kwq/KWQKHTMLPartBrowserExtension.mm b/WebCore/kwq/KWQKHTMLPartBrowserExtension.mm
index 22f6c13..6afe2fd 100644
--- a/WebCore/kwq/KWQKHTMLPartBrowserExtension.mm
+++ b/WebCore/kwq/KWQKHTMLPartBrowserExtension.mm
@@ -24,8 +24,10 @@
  */
 
 #import "KWQKHTMLPartBrowserExtension.h"
-#import "khtml_part.h"
+
+#import "KWQExceptions.h"
 #import "WebCoreBridge.h"
+#import "khtml_part.h"
 
 KHTMLPartBrowserExtension::KHTMLPartBrowserExtension(KHTMLPart *part)
     : _part(KWQ(part)), _browserInterface(_part)
@@ -78,10 +80,12 @@ void KHTMLPartBrowserExtension::createNewWindow(const KURL &url,
 						const KParts::WindowArgs &winArgs, 
 						KParts::ReadOnlyPart **partResult)
 { 
-    NSString *frameName = urlArgs.frameName.length() == 0 ? nil : urlArgs.frameName.getNSString();
+    KWQ_BLOCK_NS_EXCEPTIONS;
 
+    NSString *frameName = urlArgs.frameName.length() == 0 ? nil : urlArgs.frameName.getNSString();
+    
     WebCoreBridge *bridge;
-
+    
     if (frameName != nil) {
 	bridge = [_part->bridge() findFrameNamed:frameName];
 	if (bridge != nil) {
@@ -89,11 +93,13 @@ void KHTMLPartBrowserExtension::createNewWindow(const KURL &url,
 		[bridge loadURL:url.getNSURL() referrer:[_part->bridge() referrer] reload:urlArgs.reload onLoadEvent:false target:nil triggeringEvent:nil form:nil formValues:nil];
 	    }
 	    [bridge focusWindow];
-	    *partResult = [bridge part];
-	    return;
+	    if (partResult) {
+		*partResult = [bridge part];
+	    }
+	    KWQ_UNBLOCK_RETURN;
 	}
     }
-
+    
     bridge = [_part->bridge() createWindowWithURL:url.getNSURL() frameName:frameName];
     
     if (!winArgs.toolBarsVisible) {
@@ -115,7 +121,7 @@ void KHTMLPartBrowserExtension::createNewWindow(const KURL &url,
     if (winArgs.xSet || winArgs.ySet || winArgs.widthSet || winArgs.heightSet) {
 	NSRect frame = [bridge windowFrame];
 	NSRect contentRect = [bridge windowContentRect];
-
+	
 	if (winArgs.xSet) {
 	    frame.origin.x = winArgs.x;
 	}
@@ -140,15 +146,28 @@ void KHTMLPartBrowserExtension::createNewWindow(const KURL &url,
     
     [bridge showWindow];
     
-    *partResult = [bridge part];
+    if (partResult) {
+	*partResult = [bridge part];
+    }
+    KWQ_UNBLOCK_RETURN;
+
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
+
+    if (partResult) {
+	*partResult = NULL;
+    }
 }
 
 void KHTMLPartBrowserExtension::setIconURL(const KURL &url)
 {
+    KWQ_BLOCK_NS_EXCEPTIONS;
     [_part->bridge() setIconURL:url.getNSURL()];
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
 }
 
 void KHTMLPartBrowserExtension::setTypedIconURL(const KURL &url, const QString &type)
 {
+    KWQ_BLOCK_NS_EXCEPTIONS;
     [_part->bridge() setIconURL:url.getNSURL() withType:type.getNSString()];
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
 }
diff --git a/WebCore/kwq/KWQKHistoryProvider.mm b/WebCore/kwq/KWQKHistoryProvider.mm
index 8096b24..b44c716 100644
--- a/WebCore/kwq/KWQKHistoryProvider.mm
+++ b/WebCore/kwq/KWQKHistoryProvider.mm
@@ -25,6 +25,7 @@
 
 #import "KWQKPartsHistoryProvider.h"
 
+#import "KWQExceptions.h"
 #import "KWQKURL.h"
 #import "WebCoreHistory.h"
 
@@ -43,7 +44,15 @@ void HistoryProvider::insert(const QString &s)
 
 bool HistoryProvider::contains(const QString &s) const
 {
-    return [[WebCoreHistory historyProvider] containsItemForURLString: KURL(s).canonicalURL().getNSString()];
+    volatile bool result = false;
+    
+    KWQ_BLOCK_NS_EXCEPTIONS;
+
+    result = [[WebCoreHistory historyProvider] containsItemForURLString: KURL(s).canonicalURL().getNSString()];
+
+    KWQ_UNBLOCK_NS_EXCEPTIONS;
+
+    return result;
 }
 
 } // namespace KParts
diff --git a/WebCore/kwq/KWQKPartsBrowserInterface.mm b/WebCore/kwq/KWQKPartsBrowserInterface.mm
index c515b07..c1eb7e7 100644
--- a/WebCore/kwq/KWQKPartsBrowserInterface.mm
+++ b/WebCore/kwq/KWQKPartsBrowserInterface.mm
@@ -26,6 +26,7 @@
 #import "KWQKPartsBrowserInterface.h"
 
 #import "KWQAssertions.h"
+#import "KWQExceptions.h"
 #import "KWQKHTMLPart.h"
 #import "WebCoreBridge.h"
 
@@ -44,7 +45,9 @@ void BrowserInterface::callMethod(const char *name, const QVariant &argument)
 {
     if (strcmp(name, "goHistory(int)") == 0) {
         int distance = argument.toInt();
-        [_part->bridge() goBackOrForward:distance];
+	KWQ_BLOCK_NS_EXCEPTIONS;
+	[_part->bridge() goBackOrForward:distance];
+	KWQ_UNBLOCK_NS_EXCEPTIONS;
         return;
     }
     ERROR("method %s not implemented", name);
diff --git a/WebCore/kwq/KWQKStandardDirs.mm b/WebCore/kwq/KWQKStandardDirs.mm
index 498b585..d731ac8 100644
--- a/WebCore/kwq/KWQKStandardDirs.mm
+++ b/WebCore/kwq/KWQKStandardDirs.mm
@@ -25,6 +25,9 @@
 
 #import "KWQKStandardDirs.h"
 
+// The NSBundle calls in this file can't throw, so no need to block
+// Cocoa exceptions.
+
 @interface KWQKStandardDirsBundleDummy : NSObject { }
 @end
 @implementation KWQKStandardDirsBundleDummy
diff --git a/WebCore/kwq/KWQKURL.mm b/WebCore/kwq/KWQKURL.mm
index 045c166..bb21e9d 100644
--- a/WebCore/kwq/KWQKURL.mm
+++ b/WebCore/kwq/KWQKURL.mm
@@ -28,6 +28,9 @@
 #import "KWQAssertions.h"
 #import "KWQTextCodec.h"
 
+// The simple Cocoa calls to NSString, NSURL and NSData can't throw so
+// no need to block NSExceptions here.
+
 typedef enum {
     // alpha 
     SchemeFirstChar = 1 << 0,
diff --git a/WebCore/kwq/KWQKWinModule.mm b/WebCore/kwq/KWQKWinModule.mm
index 1807a09..878dc8c 100644
--- a/WebCore/kwq/KWQKWinModule.mm
+++ b/WebCore/kwq/KWQKWinModule.mm
@@ -27,6 +27,8 @@
 
 QRect KWinModule::workArea() const
 {
+    // No need to block exceptions because these simple NSScreen calls can't throw.
+
     NSRect visibleRect = [[NSScreen mainScreen] visibleFrame];
     NSRect rect = [[NSScreen mainScreen] frame];
     return QRect((int)visibleRect.origin.x,
diff --git a/WebCore/kwq/KWQObject.mm b/WebCore/kwq/KWQObject.mm
index a716afa..79551f7 100644
--- a/WebCore/kwq/KWQObject.mm
+++ b/WebCore/kwq/KWQObject.mm
@@ -28,6 +28,10 @@
 #import "KWQVariant.h"
 #import "KWQAssertions.h"
 
+// The Foundation-level Cocoa calls here (NSTimer, NSDate, NSArray,
+// NSDictionary) should be exception-free, so no need to block
+// exceptions.
+
 const QObject *QObject::_sender;
 bool QObject::_defersTimers;
 
diff --git a/WebCore/kwq/KWQString.mm b/WebCore/kwq/KWQString.mm
index a208440..79b83c4 100644
--- a/WebCore/kwq/KWQString.mm
+++ b/WebCore/kwq/KWQString.mm
@@ -680,6 +680,9 @@ QString QString::fromNSString(NSString *nss)
 
 NSString *QString::getNSString() const
 {
+    // The Cocoa calls in this method don't need exceptions blocked
+    // because they are simple NSString calls that can't throw.
+
     if (dataHandle[0]->_isUnicodeValid) {
         return [NSString stringWithCharacters:(const unichar *)unicode() length:dataHandle[0]->_length];
     }
diff --git a/WebCore/kwq/KWQTimer.mm b/WebCore/kwq/KWQTimer.mm
index 4aeada0..665fe08 100644
--- a/WebCore/kwq/KWQTimer.mm
+++ b/WebCore/kwq/KWQTimer.mm
@@ -27,6 +27,10 @@
 
 #import "KWQAssertions.h"
 
+// We know the Cocoa calls in this file are safe because they are all
+// to the simple ObjC class defined here, or simple NSTimer calls that
+// can't throw.
+
 @interface KWQTimerTarget : NSObject
 {
     QTimer *timer;
diff --git a/WebCore/kwq/KWQWindowWidget.mm b/WebCore/kwq/KWQWindowWidget.mm
index 4198188..76bb897 100644
--- a/WebCore/kwq/KWQWindowWidget.mm
+++ b/WebCore/kwq/KWQWindowWidget.mm
@@ -29,6 +29,9 @@
 
 #import <Cocoa/Cocoa.h>
 
+// The NSScreen calls in this file can't throw, so no need to block
+// Cocoa exceptions.
+
 class KWQWindowWidgetPrivate
 {
 public:

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list