WebCore:
authordarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 2 Nov 2007 23:08:41 +0000 (23:08 +0000)
committerdarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 2 Nov 2007 23:08:41 +0000 (23:08 +0000)
        Reviewed by Mitz.

        - fix <rdar://problem/5530185> WebKit does not show <object> fallback content when both
          URL and MIME type is omitted

        Already covered by existing tests (that had incorrect results).

        * loader/FrameLoader.cpp: (WebCore::FrameLoader::requestObject): Return false to indicate
        failure when both URL and MIME type are empty. The old code would not attempt a load, but
        it would indicate success.

        * rendering/RenderPartObject.cpp: (WebCore::RenderPartObject::updateWidget): Remove
        non-helpful early exit for the case where there is no URL and no type. Returning early
        prevents the fallback code from running.

WebKit:

        Reviewed by Mitz.

        - fix problem I ran into while doing some testing on Mac for
          <rdar://problem/5530185> WebKit does not show <object>
          fallback content when both URL and MIME type is omitted

        I don't know how to reproduce this failure in DumpRenderTree, so there is no
        regression test.

        * Plugins/WebNullPluginView.h: Removed some unneeded declarations, including
        the didSendError local variable. Instead we just set the error to nil once
        we've sent it.
        * Plugins/WebNullPluginView.mm:
        (-[WebNullPluginView initWithFrame:error:DOMElement:]): Refactored so that
        the null plug-in image code is separate from the rest of the function and
        so that the whole thing is not inside an if statement. Also don't hold a
        reference to the DOM element if there is no error to report.
        (-[WebNullPluginView reportFailure]): Added. Does the actual delegate
        callback. Happens back at the top level of the run loop so it doesn't
        fire deep inside layout. Also wrote this so that it is guaranteed not to
        reenter and so that it can handle the case where the delegate destroys
        the world (including this object). NOTE: This is not a real, general
        solution to the problem of plug-ins that do work inside layout. We will need
        a more general fix that works for other plug-ins, and we'll track that with
        a separate bug report.
        (-[WebNullPluginView viewDidMoveToWindow]): Removed most of the code;
        changed so it just does a performSelector:afterDelay:0.

LayoutTests:

        Reviewed by Mitz.

        - update tests affected by fix for <rdar://problem/5530185> WebKit does not show
          <object> fallback content when both URL and MIME type is omitted

        * dom/html/level2/html/AppletsCollection-expected.txt: The text "Nothing here!" renders now.
        * fast/dom/HTMLDocument/object-by-name-unknown-child-element-expected.txt: Some blank
        space renders now.
        * platform/mac/fast/invalid/residual-style-expected.txt: A font element renders now.

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

LayoutTests/ChangeLog
LayoutTests/dom/html/level2/html/AppletsCollection-expected.txt
LayoutTests/fast/dom/HTMLDocument/object-by-name-unknown-child-element-expected.txt
LayoutTests/platform/mac/fast/invalid/residual-style-expected.txt
WebCore/ChangeLog
WebCore/loader/FrameLoader.cpp
WebCore/rendering/RenderPartObject.cpp
WebKit/ChangeLog
WebKit/Plugins/WebNullPluginView.h
WebKit/Plugins/WebNullPluginView.mm

index ad307ebc2d6aeacce771045b9011fc40bfc914bf..824e4f11613b290748ed33577f1312d18c3d4413 100644 (file)
@@ -1,3 +1,15 @@
+2007-11-02  Darin Adler  <darin@apple.com>
+
+        Reviewed by Mitz.
+
+        - update tests affected by fix for <rdar://problem/5530185> WebKit does not show
+          <object> fallback content when both URL and MIME type is omitted
+
+        * dom/html/level2/html/AppletsCollection-expected.txt: The text "Nothing here!" renders now.
+        * fast/dom/HTMLDocument/object-by-name-unknown-child-element-expected.txt: Some blank
+        space renders now.
+        * platform/mac/fast/invalid/residual-style-expected.txt: A font element renders now.
+
 2007-11-01  Dan Bernstein  <mitz@apple.com>
 
         - fix typo in test name
index 4428b79ec741d082ac5075384e201c1da150ed9f..2ce5a82906e75e4466f61f6e8fd8f92d28a366e7 100644 (file)
@@ -9,7 +9,7 @@ Applets length is currently 0
 
 Applets length is currently 0
 
-
+Nothing here!
 Applets length is currently 0
 
 
index 976feaf18745b91bb0fe9c9e40694e071cc725c7..d7dd443f9176d2346acfa7543376253b5393ffdd 100644 (file)
@@ -1,3 +1,2 @@
-
 This tests that an object element with an unknown child element is still part of the document's named item map.
 SUCCESS
index e1de1c52301727c0de0138806fe9b0806171c68d..d01720b55dc61f5963a877ad5e0e245333d795fa 100644 (file)
@@ -523,7 +523,8 @@ layer at (0,0) size 785x3543
         RenderText {#text} at (0,0) size 68x18
           text run at (0,0) width 68: "OBJECT: "
         RenderInline {FONT} at (0,0) size 171x18 [color=#008000]
-          RenderPartObject {OBJECT} at (68,14) size 0x0
+          RenderInline {OBJECT} at (0,0) size 0x18
+            RenderInline {FONT} at (0,0) size 0x18 [color=#FF0000]
           RenderText {#text} at (68,0) size 171x18
             text run at (68,0) width 171: "All of this should be green."
         RenderText {#text} at (0,0) size 0x0
@@ -577,7 +578,8 @@ layer at (0,0) size 785x3543
         RenderText {#text} at (0,0) size 66x18
           text run at (0,0) width 66: "PARAM: "
         RenderInline {FONT} at (0,0) size 171x18 [color=#008000]
-          RenderPartObject {OBJECT} at (66,14) size 0x0
+          RenderInline {OBJECT} at (0,0) size 0x18
+            RenderInline {FONT} at (0,0) size 0x18 [color=#FF0000]
           RenderText {#text} at (66,0) size 171x18
             text run at (66,0) width 171: "All of this should be green."
         RenderText {#text} at (0,0) size 0x0
index 8ce20f47863f3b619b527afc8308c1e1a76e333a..bdba833a8b297ba33b224ecc17150fbf03f3a22e 100644 (file)
@@ -1,3 +1,20 @@
+2007-11-02  Darin Adler  <darin@apple.com>
+
+        Reviewed by Mitz.
+
+        - fix <rdar://problem/5530185> WebKit does not show <object> fallback content when both
+          URL and MIME type is omitted
+
+        Already covered by existing tests (that had incorrect results).
+
+        * loader/FrameLoader.cpp: (WebCore::FrameLoader::requestObject): Return false to indicate
+        failure when both URL and MIME type are empty. The old code would not attempt a load, but
+        it would indicate success.
+
+        * rendering/RenderPartObject.cpp: (WebCore::RenderPartObject::updateWidget): Remove
+        non-helpful early exit for the case where there is no URL and no type. Returning early
+        prevents the fallback code from running.
+
 2007-11-02  Alp Toker  <alp@atoker.com>
 
         Reviewed by Darin.
index fa5de99cc8e89e576dc2702c28d311372d9a6cc4..d583a2c7e50f013ceda9c495d4593fdd4d19d343 100644 (file)
@@ -1553,7 +1553,7 @@ bool FrameLoader::requestObject(RenderPart* renderer, const String& url, const A
     const String& mimeType, const Vector<String>& paramNames, const Vector<String>& paramValues)
 {
     if (url.isEmpty() && mimeType.isEmpty())
-        return true;
+        return false;
 
 #if USE(LOW_BANDWIDTH_DISPLAY)
     // don't care object during low bandwidth display
index bdaa579369fe8ce772274a7785684afbfbda0ae5..6575d2f912a6aacc9692661d83694a5996154407 100644 (file)
@@ -204,9 +204,6 @@ void RenderPartObject::updateWidget(bool onlyCreateNonNetscapePlugins)
       if (serviceType.isEmpty() && !o->m_classId.isEmpty())
           mapClassIdToServiceType(o->m_classId, serviceType);
       
-      // If no URL and type, abort.
-      if (url.isEmpty() && serviceType.isEmpty())
-          return;
       if (!isURLAllowed(document(), url))
           return;
 
index 485d04e833948a00f67fee4e6be411ba70043494..094907ffe64151db99a5b5c16812f5a243de41af 100644 (file)
@@ -1,3 +1,33 @@
+2007-11-02  Darin Adler  <darin@apple.com>
+
+        Reviewed by Mitz.
+
+        - fix problem I ran into while doing some testing on Mac for
+          <rdar://problem/5530185> WebKit does not show <object>
+          fallback content when both URL and MIME type is omitted
+
+        I don't know how to reproduce this failure in DumpRenderTree, so there is no
+        regression test.
+
+        * Plugins/WebNullPluginView.h: Removed some unneeded declarations, including
+        the didSendError local variable. Instead we just set the error to nil once
+        we've sent it.
+        * Plugins/WebNullPluginView.mm:
+        (-[WebNullPluginView initWithFrame:error:DOMElement:]): Refactored so that
+        the null plug-in image code is separate from the rest of the function and
+        so that the whole thing is not inside an if statement. Also don't hold a
+        reference to the DOM element if there is no error to report.
+        (-[WebNullPluginView reportFailure]): Added. Does the actual delegate
+        callback. Happens back at the top level of the run loop so it doesn't
+        fire deep inside layout. Also wrote this so that it is guaranteed not to
+        reenter and so that it can handle the case where the delegate destroys
+        the world (including this object). NOTE: This is not a real, general
+        solution to the problem of plug-ins that do work inside layout. We will need
+        a more general fix that works for other plug-ins, and we'll track that with
+        a separate bug report.
+        (-[WebNullPluginView viewDidMoveToWindow]): Removed most of the code;
+        changed so it just does a performSelector:afterDelay:0.
+
 2007-11-02  Mark Rowe  <mrowe@apple.com>
 
         Reviewed by Darin Adler.
index ce751531d737d8bd5f4e6845661ddebdc3ceff96..3ca153269ab575754a4f5d0c2a9d12e8cce84040 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2005 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2005, 2007 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
 
 #import <AppKit/AppKit.h>
 
-@class NSError;
-@class WebFrame;
 @class DOMElement;
 
 @interface WebNullPluginView : NSImageView
 {
-    BOOL didSendError;
     NSError *error;
     DOMElement *element;
 }
 
-- (id)initWithFrame:(NSRect)frame error:(NSError *)pluginError DOMElement:(DOMElement *)element;
+- (id)initWithFrame:(NSRect)frame error:(NSError *)error DOMElement:(DOMElement *)element;
 
 @end
index 2e7d372dec55b2a88a12a7aa29d5550640907b69..e173fd721aeccdb5fa5453413cbd47aff941102b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2005 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2005, 2007 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#import "WebNullPluginView.h"
+
+#import "WebFrameInternal.h"
+#import "WebViewInternal.h"
 #import <WebCore/Document.h>
-#import <WebCore/Element.h>
-#import <WebKit/WebDataSource.h>
-#import <WebKit/WebFrame.h>
-#import <WebKit/WebFrameInternal.h>
-#import <WebKit/WebFrameView.h>
-#import <WebKit/WebNSURLExtras.h>
-#import <WebKit/WebNSViewExtras.h>
-#import <WebKit/WebNullPluginView.h>
-#import <WebKit/WebResourceLoadDelegate.h>
-#import <WebKit/WebViewInternal.h>
-
-static NSImage *image = nil;
 
 @implementation WebNullPluginView
 
-- initWithFrame:(NSRect)frame error:(NSError *)pluginError DOMElement:(DOMElement *)anElement
+- initWithFrame:(NSRect)frame error:(NSError *)err DOMElement:(DOMElement *)elem
 {    
-    self = [super initWithFrame:frame];
-    if (self) {
-
-        if (!image) {
-            NSBundle *bundle = [NSBundle bundleForClass:[WebNullPluginView class]];
-            NSString *imagePath = [bundle pathForResource:@"nullplugin" ofType:@"tiff"];
-            image = [[NSImage alloc] initWithContentsOfFile:imagePath];
-        }
-        
-        [self setImage:image];
-
-        error = [pluginError retain];
-        element = [anElement retain];
+    static NSImage *nullPlugInImage;
+    if (!nullPlugInImage) {
+        NSBundle *bundle = [NSBundle bundleForClass:[WebNullPluginView class]];
+        NSString *imagePath = [bundle pathForResource:@"nullplugin" ofType:@"tiff"];
+        nullPlugInImage = [[NSImage alloc] initWithContentsOfFile:imagePath];
     }
+    
+    self = [super initWithFrame:frame];
+    if (!self)
+        return nil;
+
+    error = [err retain];
+    if (err)
+        element = [elem retain];
+
+    [self setImage:nullPlugInImage];
+
     return self;
 }
 
@@ -69,18 +64,35 @@ static NSImage *image = nil;
     [super dealloc];
 }
 
-- (void)viewDidMoveToWindow
+- (void)reportFailure
 {
-    if (!didSendError && _window && error) {
-        didSendError = YES;
-        WebFrame *webFrame = kit(core(element)->document()->frame());
-        WebView *webView = [webFrame webView];
-        WebDataSource *dataSource = [webFrame _dataSource];
+    NSError *localError = error;
+    DOMElement *localElement = element;
 
+    error = nil;
+    element = nil;
+
+    WebFrame *webFrame = kit(core(localElement)->document()->frame());
+    if (webFrame) {
+        WebView *webView = [webFrame webView];
         WebResourceDelegateImplementationCache implementations = WebViewGetResourceLoadDelegateImplementations(webView);
         if (implementations.plugInFailedWithErrorFunc)
-            CallResourceLoadDelegate(implementations.plugInFailedWithErrorFunc, webView, @selector(webView:plugInFailedWithError:dataSource:), error, dataSource);
+            CallResourceLoadDelegate(implementations.plugInFailedWithErrorFunc, webView,
+                @selector(webView:plugInFailedWithError:dataSource:), localError, [webFrame _dataSource]);
     }
+
+    [localError release];
+    [localElement release];
+}
+
+- (void)viewDidMoveToWindow
+{
+    if (!error)
+        return;
+
+    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(reportFailure) object:nil];
+    if ([self window])
+        [self performSelector:@selector(reportFailure) withObject:nil afterDelay:0.0];
 }
 
 @end