Title: [239442] trunk
Revision
239442
Author
[email protected]
Date
2018-12-20 09:35:17 -0800 (Thu, 20 Dec 2018)

Log Message

Unparented WKWebView can't retrieve main resource data for a main frame plugin
https://bugs.webkit.org/show_bug.cgi?id=192923
<rdar://problem/46859068>

Reviewed by Wenson Hsieh.

Source/WebKit:

* WebProcess/Plugins/PluginView.cpp:
(WebKit::PluginView::liveResourceData const):
If the WKWebView is unparented, we may not immediately initialize the plugin.
In that case, PluginView holds on to the backing data until the plugin
is initialized. If a WKWebView API client asks for the backing data
for the plugin during this time, we should return it, instead of bailing.

Tools:

* TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
* TestWebKitAPI/WebKitCocoa/GetResourceData.mm:
Add a test ensuring that both parented and unparented WKWebViews can
retrieve main resource data when loading a PDF.

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (239441 => 239442)


--- trunk/Source/WebKit/ChangeLog	2018-12-20 16:28:55 UTC (rev 239441)
+++ trunk/Source/WebKit/ChangeLog	2018-12-20 17:35:17 UTC (rev 239442)
@@ -1,3 +1,18 @@
+2018-12-20  Tim Horton  <[email protected]>
+
+        Unparented WKWebView can't retrieve main resource data for a main frame plugin
+        https://bugs.webkit.org/show_bug.cgi?id=192923
+        <rdar://problem/46859068>
+
+        Reviewed by Wenson Hsieh.
+
+        * WebProcess/Plugins/PluginView.cpp:
+        (WebKit::PluginView::liveResourceData const):
+        If the WKWebView is unparented, we may not immediately initialize the plugin.
+        In that case, PluginView holds on to the backing data until the plugin
+        is initialized. If a WKWebView API client asks for the backing data
+        for the plugin during this time, we should return it, instead of bailing.
+
 2018-12-20  Wenson Hsieh  <[email protected]>
 
         [iOS] Focusing an editable element should scroll to reveal the selection

Modified: trunk/Source/WebKit/WebProcess/Plugins/PluginView.cpp (239441 => 239442)


--- trunk/Source/WebKit/WebProcess/Plugins/PluginView.cpp	2018-12-20 16:28:55 UTC (rev 239441)
+++ trunk/Source/WebKit/WebProcess/Plugins/PluginView.cpp	2018-12-20 17:35:17 UTC (rev 239442)
@@ -997,9 +997,13 @@
 
 RefPtr<SharedBuffer> PluginView::liveResourceData() const
 {
-    if (!m_isInitialized || !m_plugin)
-        return 0;
+    if (!m_isInitialized || !m_plugin) {
+        if (m_manualStreamData && m_manualStreamState == ManualStreamState::Finished)
+            return m_manualStreamData;
 
+        return nullptr;
+    }
+
     return m_plugin->liveResourceData();
 }
 

Modified: trunk/Tools/ChangeLog (239441 => 239442)


--- trunk/Tools/ChangeLog	2018-12-20 16:28:55 UTC (rev 239441)
+++ trunk/Tools/ChangeLog	2018-12-20 17:35:17 UTC (rev 239442)
@@ -1,3 +1,16 @@
+2018-12-20  Tim Horton  <[email protected]>
+
+        Unparented WKWebView can't retrieve main resource data for a main frame plugin
+        https://bugs.webkit.org/show_bug.cgi?id=192923
+        <rdar://problem/46859068>
+
+        Reviewed by Wenson Hsieh.
+
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        * TestWebKitAPI/WebKitCocoa/GetResourceData.mm:
+        Add a test ensuring that both parented and unparented WKWebViews can
+        retrieve main resource data when loading a PDF.
+
 2018-12-20  Carlos Garcia Campos  <[email protected]>
 
         [GTK][WPE] Bump webkitgtk-test-fonts to 0.0.8

Modified: trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj (239441 => 239442)


--- trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2018-12-20 16:28:55 UTC (rev 239441)
+++ trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2018-12-20 17:35:17 UTC (rev 239442)
@@ -88,6 +88,7 @@
 		2D4CF8BD1D8360CC0001CE8D /* WKThumbnailView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2D4CF8BC1D8360CC0001CE8D /* WKThumbnailView.mm */; };
 		2D51A0C71C8BF00C00765C45 /* DOMHTMLVideoElementWrapper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2D51A0C51C8BF00400765C45 /* DOMHTMLVideoElementWrapper.mm */; };
 		2D838B1F1EEF3A5C009B980E /* WKContentViewEditingActions.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2D838B1E1EEF3A5B009B980E /* WKContentViewEditingActions.mm */; };
+		2DADF26321CB8F32003D3E3A /* GetResourceData.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2DADF26221CB8F32003D3E3A /* GetResourceData.mm */; };
 		2DB0232F1E4E871800707123 /* InteractionDeadlockAfterCrash.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2DB0232E1E4E871800707123 /* InteractionDeadlockAfterCrash.mm */; };
 		2DB647881F4163D60051A89E /* WKWebViewDoesNotLogDuringInitialization.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2DB647871F4161F70051A89E /* WKWebViewDoesNotLogDuringInitialization.mm */; };
 		2DC4CF771D2D9DD800ECCC94 /* DataDetection.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2DC4CF761D2D9DD800ECCC94 /* DataDetection.mm */; };
@@ -1382,6 +1383,7 @@
 		2D8104CB1BEC13E70020DA46 /* FindInPage.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FindInPage.mm; sourceTree = "<group>"; };
 		2D838B1E1EEF3A5B009B980E /* WKContentViewEditingActions.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKContentViewEditingActions.mm; sourceTree = "<group>"; };
 		2D9A53AE1B31FA8D0074D5AA /* ShrinkToFit.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ShrinkToFit.mm; sourceTree = "<group>"; };
+		2DADF26221CB8F32003D3E3A /* GetResourceData.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = GetResourceData.mm; sourceTree = "<group>"; };
 		2DB0232E1E4E871800707123 /* InteractionDeadlockAfterCrash.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = InteractionDeadlockAfterCrash.mm; sourceTree = "<group>"; };
 		2DB647871F4161F70051A89E /* WKWebViewDoesNotLogDuringInitialization.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = WKWebViewDoesNotLogDuringInitialization.mm; sourceTree = "<group>"; };
 		2DC4CF761D2D9DD800ECCC94 /* DataDetection.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DataDetection.mm; sourceTree = "<group>"; };
@@ -2445,6 +2447,7 @@
 				CDE195B31CFE0ADE0053D256 /* FullscreenTopContentInset.mm */,
 				631EFFF51E7B5E8D00D2EBB8 /* Geolocation.mm */,
 				07E1F6A01FFC3A080096C7EC /* GetDisplayMedia.mm */,
+				2DADF26221CB8F32003D3E3A /* GetResourceData.mm */,
 				51AF23DE1EF1A3720072F281 /* IconLoadingDelegate.mm */,
 				510477751D298E03009747EB /* IDBDeleteRecovery.mm */,
 				5110FCEF1E01CBAA006F8D0B /* IDBIndexUpgradeToV2.mm */,
@@ -3969,6 +3972,7 @@
 				07E1F6A31FFC4B760096C7EC /* GetDisplayMedia.mm in Sources */,
 				7CCE7EF91A411AE600447C4C /* GetInjectedBundleInitializationUserDataCallback.cpp in Sources */,
 				7CCE7EE21A411A9A00447C4C /* GetPIDAfterAbortedProcessLaunch.cpp in Sources */,
+				2DADF26321CB8F32003D3E3A /* GetResourceData.mm in Sources */,
 				07CE1CF31F06A7E000BF89F5 /* GetUserMediaNavigation.mm in Sources */,
 				07E499911F9E56DF002F1EF3 /* GetUserMediaReprompt.mm in Sources */,
 				316BDBAC1E7207F100DE0D5A /* GPULegacyBuffer.mm in Sources */,

Added: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/GetResourceData.mm (0 => 239442)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/GetResourceData.mm	                        (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/GetResourceData.mm	2018-12-20 17:35:17 UTC (rev 239442)
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2018 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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.
+ */
+
+#import "config.h"
+#import <WebKit/WKFoundation.h>
+
+#if PLATFORM(MAC) && WK_API_ENABLED
+
+#import "PlatformUtilities.h"
+#import "Test.h"
+#import "TestNavigationDelegate.h"
+#import "TestWKWebView.h"
+#import <WebKit/WKWebViewPrivate.h>
+#import <wtf/RetainPtr.h>
+
+TEST(WebKit, GetPDFResourceData)
+{
+    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 100, 100) configuration:configuration.get() addToWindow:YES]);
+
+    NSURLRequest *request = [NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"test" withExtension:@"pdf" subdirectory:@"TestWebKitAPI.resources"]];
+    [webView loadRequest:request];
+
+    [webView _test_waitForDidFinishNavigation];
+
+    __block bool isDone;
+    [webView _getMainResourceDataWithCompletionHandler:^(NSData *data, NSError *error) {
+        EXPECT_EQ(data.length, 10820UL);
+        isDone = true;
+    }];
+
+    TestWebKitAPI::Util::run(&isDone);
+}
+
+TEST(WebKit, GetPDFResourceDataInUnparentedWebView)
+{
+    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 100, 100) configuration:configuration.get() addToWindow:NO]);
+
+    NSURLRequest *request = [NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"test" withExtension:@"pdf" subdirectory:@"TestWebKitAPI.resources"]];
+    [webView loadRequest:request];
+
+    [webView _test_waitForDidFinishNavigation];
+
+    __block bool isDone;
+    [webView _getMainResourceDataWithCompletionHandler:^(NSData *data, NSError *error) {
+        EXPECT_EQ(data.length, 10820UL);
+        isDone = true;
+    }];
+
+    TestWebKitAPI::Util::run(&isDone);
+}
+
+#endif
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to