Title: [188076] branches/safari-601.1-branch
Revision
188076
Author
dburk...@apple.com
Date
2015-08-06 16:09:38 -0700 (Thu, 06 Aug 2015)

Log Message

Merge r187886. rdar://problem/15779101

Modified Paths

Added Paths

Diff

Modified: branches/safari-601.1-branch/LayoutTests/ChangeLog (188075 => 188076)


--- branches/safari-601.1-branch/LayoutTests/ChangeLog	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/LayoutTests/ChangeLog	2015-08-06 23:09:38 UTC (rev 188076)
@@ -1,5 +1,24 @@
 2015-08-06  Dana Burkart  <dburk...@apple.com>
 
+        Merge r187886. rdar://problem/15779101
+
+    2015-08-04  Alexey Proskuryakov  <a...@apple.com>
+
+            Implement NPAPI redirect handling
+            https://bugs.webkit.org/show_bug.cgi?id=138675
+            rdar://problem/15779101
+
+            Patch by Jeffrey Pfau, updated and tweaked by me.
+
+            Reviewed by Anders Carlsson.
+
+            * http/tests/plugins/get-url-redirect-notify-expected.txt: Added.
+            * http/tests/plugins/get-url-redirect-notify.html: Added.
+            * platform/wk2/http/tests/plugins: Added.
+            * platform/wk2/http/tests/plugins/get-url-redirect-notify-expected.txt: Added.
+
+2015-08-06  Dana Burkart  <dburk...@apple.com>
+
         Merge r187620. rdar://problem/15779101
 
     2015-07-30  Anders Carlsson  <ander...@apple.com>

Added: branches/safari-601.1-branch/LayoutTests/http/tests/plugins/get-url-redirect-notify-expected.txt (0 => 188076)


--- branches/safari-601.1-branch/LayoutTests/http/tests/plugins/get-url-redirect-notify-expected.txt	                        (rev 0)
+++ branches/safari-601.1-branch/LayoutTests/http/tests/plugins/get-url-redirect-notify-expected.txt	2015-08-06 23:09:38 UTC (rev 188076)
@@ -0,0 +1,13 @@
+
+Sync allow, reason shouldn't be NPRES_USER_BREAK...true
+Sync allow, URL should be the final URL...false
+Sync deny, reason should be NPRES_USER_BREAK...false
+Sync deny, URL should be the previous URL...true
+Async allow, reason shouldn't be NPRES_USER_BREAK...true
+Async allow, URL should be the final URL...false
+Async deny, reason should be NPRES_USER_BREAK...false
+Async deny, URL should be the previous URL...true
+Async multiple allow, reason shouldn't be NPRES_USER_BREAK...true
+Async multiple allow, URL should be the final URL...false
+Async multiple deny, reason should be NPRES_USER_BREAK...false
+Async multiple deny, URL should be the previous URL...false

Added: branches/safari-601.1-branch/LayoutTests/http/tests/plugins/get-url-redirect-notify.html (0 => 188076)


--- branches/safari-601.1-branch/LayoutTests/http/tests/plugins/get-url-redirect-notify.html	                        (rev 0)
+++ branches/safari-601.1-branch/LayoutTests/http/tests/plugins/get-url-redirect-notify.html	2015-08-06 23:09:38 UTC (rev 188076)
@@ -0,0 +1,89 @@
+<html>
+<body>
+<embed name="plg" type="application/x-webkit-test-netscape" test="url-redirect"></embed>
+<div id="log">
+    <div id="syncallowreason">Sync allow, reason shouldn't be NPRES_USER_BREAK...</div>
+    <div id="syncallowurl">Sync allow, URL should be the final URL...</div>
+    <div id="syncdenyreason">Sync deny, reason should be NPRES_USER_BREAK...</div>
+    <div id="syncdenyurl">Sync deny, URL should be the previous URL...</div>
+    <div id="asyncallowreason">Async allow, reason shouldn't be NPRES_USER_BREAK...</div>
+    <div id="asyncallowurl">Async allow, URL should be the final URL...</div>
+    <div id="asyncdenyreason">Async deny, reason should be NPRES_USER_BREAK...</div>
+    <div id="asyncdenyurl">Async deny, URL should be the previous URL...</div>
+    <div id="asyncmultiallowreason">Async multiple allow, reason shouldn't be NPRES_USER_BREAK...</div>
+    <div id="asyncmultiallowurl">Async multiple allow, URL should be the final URL...</div>
+    <div id="asyncmultidenyreason">Async multiple deny, reason should be NPRES_USER_BREAK...</div>
+    <div id="asyncmultidenyurl">Async multiple deny, URL should be the previous URL...</div>
+</div>
+<script>
+    function log(node, message)
+    {
+        text = document.getElementById(node);
+        text.innerText += message;
+    }
+    function cleanup()
+    {
+        --testsRemaining;
+        if (!testsRemaining) {
+            clearInterval(timer);
+            if (window.testRunner)
+                testRunner.notifyDone();
+        }
+    }
+    function notifyTrue(reason, url)
+    {
+        log("syncallowreason", reason != 2);
+        log("syncallowurl", url == redirectURL);
+        cleanup();
+    }
+    function notifyFalse(reason, url)
+    {
+        log("syncdenyreason", reason == 2);
+        log("syncdenyurl", url == singleRedirect);
+        cleanup();
+    }
+    function notifyTrueAsync(reason, url)
+    {
+        log("asyncallowreason", reason != 2);
+        log("asyncallowurl", url == redirectURL);
+        cleanup();
+    }
+    function notifyFalseAsync(reason, url)
+    {
+        log("asyncdenyreason", reason == 2);
+        log("asyncdenyurl", url == singleRedirect);
+        cleanup();
+    }
+    function notifyMultiTrueAsync(reason, url)
+    {
+        log("asyncmultiallowreason", reason != 2);
+        log("asyncmultiallowurl", url == redirectURL);
+        cleanup();
+    }
+    function notifyMultiFalseAsync(reason, url)
+    {
+        log("asyncmultidenyreason", reason == 2);
+        log("asyncmultidenyurl", url == singleRedirect);
+        cleanup();
+    }
+
+    if (window.testRunner) {
+        testRunner.dumpAsText();
+        testRunner.waitUntilDone();
+    }
+
+    var baseURL = "http://127.0.0.1:8000/resources/redirect.php";
+    var redirectURL = "http://127.0.0.1:8000/dummy";
+    var singleRedirect = baseURL + "?code=307&url="" + encodeURIComponent(redirectURL);
+    var doubleRedirect = baseURL + "?code=307&url="" + encodeURIComponent(singleRedirect);
+    var testsRemaining = 6;
+    plg.get(singleRedirect, 1, "notifyTrue");
+    plg.get(singleRedirect, 0, "notifyFalse");
+    plg.getAsync(singleRedirect, 1, "notifyTrueAsync");
+    plg.getAsync(singleRedirect, 0, "notifyFalseAsync");
+    plg.getAsync(doubleRedirect, 2, "notifyMultiTrueAsync");
+    plg.getAsync(doubleRedirect, 1, "notifyMultiFalseAsync");
+    var timer = setInterval(function() { plg.serviceAsync() }, 10);
+</script>
+</body>
+</html>

Added: branches/safari-601.1-branch/LayoutTests/platform/wk2/http/tests/plugins/get-url-redirect-notify-expected.txt (0 => 188076)


--- branches/safari-601.1-branch/LayoutTests/platform/wk2/http/tests/plugins/get-url-redirect-notify-expected.txt	                        (rev 0)
+++ branches/safari-601.1-branch/LayoutTests/platform/wk2/http/tests/plugins/get-url-redirect-notify-expected.txt	2015-08-06 23:09:38 UTC (rev 188076)
@@ -0,0 +1,13 @@
+
+Sync allow, reason shouldn't be NPRES_USER_BREAK...true
+Sync allow, URL should be the final URL...true
+Sync deny, reason should be NPRES_USER_BREAK...true
+Sync deny, URL should be the previous URL...true
+Async allow, reason shouldn't be NPRES_USER_BREAK...true
+Async allow, URL should be the final URL...true
+Async deny, reason should be NPRES_USER_BREAK...true
+Async deny, URL should be the previous URL...true
+Async multiple allow, reason shouldn't be NPRES_USER_BREAK...true
+Async multiple allow, URL should be the final URL...true
+Async multiple deny, reason should be NPRES_USER_BREAK...true
+Async multiple deny, URL should be the previous URL...true

Modified: branches/safari-601.1-branch/Source/WebCore/ChangeLog (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebCore/ChangeLog	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebCore/ChangeLog	2015-08-06 23:09:38 UTC (rev 188076)
@@ -1,5 +1,41 @@
 2015-08-06  Dana Burkart  <dburk...@apple.com>
 
+        Merge r187886. rdar://problem/15779101
+
+    2015-08-04  Alexey Proskuryakov  <a...@apple.com>
+
+            Implement NPAPI redirect handling
+            https://bugs.webkit.org/show_bug.cgi?id=138675
+            rdar://problem/15779101
+
+            Patch by Jeffrey Pfau, updated and tweaked by me.
+
+            Reviewed by Anders Carlsson.
+
+            Test: http/tests/plugins/get-url-redirect-notify.html
+
+            * loader/NetscapePlugInStreamLoader.cpp:
+            (WebCore::NetscapePlugInStreamLoader::init):
+            (WebCore::NetscapePlugInStreamLoader::willSendRequest):
+            (WebCore::NetscapePlugInStreamLoader::didReceiveResponse):
+            * loader/NetscapePlugInStreamLoader.h:
+            * loader/ResourceLoader.cpp:
+            (WebCore::ResourceLoader::init):
+            (WebCore::ResourceLoader::isSubresourceLoader):
+            (WebCore::ResourceLoader::willSendRequestInternal):
+            (WebCore::ResourceLoader::willSendRequest):
+            (WebCore::ResourceLoader::didSendData):
+            * loader/ResourceLoader.h:
+            * loader/SubresourceLoader.cpp:
+            (WebCore::SubresourceLoader::isSubresourceLoader):
+            (WebCore::SubresourceLoader::willSendRequestInternal):
+            (WebCore::SubresourceLoader::willSendRequest): Deleted.
+            * loader/SubresourceLoader.h:
+            * plugins/npapi.h:
+            * plugins/npfunctions.h:
+
+2015-08-06  Dana Burkart  <dburk...@apple.com>
+
         Merge r187693. rdar://problem/22047626
 
     2015-07-31  Myles C. Maxfield  <mmaxfi...@apple.com>

Modified: branches/safari-601.1-branch/Source/WebCore/loader/NetscapePlugInStreamLoader.cpp (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebCore/loader/NetscapePlugInStreamLoader.cpp	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebCore/loader/NetscapePlugInStreamLoader.cpp	2015-08-06 23:09:38 UTC (rev 188076)
@@ -88,6 +88,18 @@
     return true;
 }
 
+void NetscapePlugInStreamLoader::willSendRequest(ResourceRequest&& request, const ResourceResponse& redirectResponse, std::function<void(ResourceRequest&&)>&& callback)
+{
+    RefPtr<NetscapePlugInStreamLoader> protect(this);
+
+    m_client->willSendRequest(this, WTF::move(request), redirectResponse, [protect, redirectResponse, callback](ResourceRequest request) {
+        if (!request.isNull())
+            protect->willSendRequestInternal(request, redirectResponse);
+
+        callback(WTF::move(request));
+    });
+}
+
 void NetscapePlugInStreamLoader::didReceiveResponse(const ResourceResponse& response)
 {
     Ref<NetscapePlugInStreamLoader> protect(*this);

Modified: branches/safari-601.1-branch/Source/WebCore/loader/NetscapePlugInStreamLoader.h (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebCore/loader/NetscapePlugInStreamLoader.h	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebCore/loader/NetscapePlugInStreamLoader.h	2015-08-06 23:09:38 UTC (rev 188076)
@@ -38,6 +38,7 @@
 
 class NetscapePlugInStreamLoaderClient {
 public:
+    virtual void willSendRequest(NetscapePlugInStreamLoader*, ResourceRequest&&, const ResourceResponse& redirectResponse, std::function<void (ResourceRequest&&)>&&) = 0;
     virtual void didReceiveResponse(NetscapePlugInStreamLoader*, const ResourceResponse&) = 0;
     virtual void didReceiveData(NetscapePlugInStreamLoader*, const char*, int) = 0;
     virtual void didFail(NetscapePlugInStreamLoader*, const ResourceError&) = 0;
@@ -58,6 +59,7 @@
 private:
     virtual bool init(const ResourceRequest&) override;
 
+    virtual void willSendRequest(ResourceRequest&&, const ResourceResponse& redirectResponse, std::function<void(ResourceRequest&&)>&& callback) override;
     virtual void didReceiveResponse(const ResourceResponse&) override;
     virtual void didReceiveData(const char*, unsigned, long long encodedDataLength, DataPayloadType) override;
     virtual void didReceiveBuffer(PassRefPtr<SharedBuffer>, long long encodedDataLength, DataPayloadType) override;

Modified: branches/safari-601.1-branch/Source/WebCore/loader/ResourceLoader.cpp (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebCore/loader/ResourceLoader.cpp	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebCore/loader/ResourceLoader.cpp	2015-08-06 23:09:38 UTC (rev 188076)
@@ -147,7 +147,7 @@
             clientRequest.setFirstPartyForCookies(document->firstPartyForCookies());
     }
 
-    willSendRequest(clientRequest, ResourceResponse());
+    willSendRequestInternal(clientRequest, ResourceResponse());
 
 #if PLATFORM(IOS)
     // If this ResourceLoader was stopped as a result of willSendRequest, bail out.
@@ -286,7 +286,7 @@
     return false;
 }
 
-void ResourceLoader::willSendRequest(ResourceRequest& request, const ResourceResponse& redirectResponse)
+void ResourceLoader::willSendRequestInternal(ResourceRequest& request, const ResourceResponse& redirectResponse)
 {
     // Protect this in this delegate method since the additional processing can do
     // anything including possibly derefing this; one example of this is Radar 3266216.
@@ -344,10 +344,10 @@
         frameLoader()->client().dispatchDidReceiveServerRedirectForProvisionalLoad();
 }
 
-void ResourceLoader::willSendRequest(ResourceRequest&& request, const ResourceResponse& redirectResponse, std::function<void(ResourceRequest&)> callback)
+void ResourceLoader::willSendRequest(ResourceRequest&& request, const ResourceResponse& redirectResponse, std::function<void(ResourceRequest&&)>&& callback)
 {
-    willSendRequest(request, redirectResponse);
-    callback(request);
+    willSendRequestInternal(request, redirectResponse);
+    callback(WTF::move(request));
 }
 
 void ResourceLoader::didSendData(unsigned long long, unsigned long long)
@@ -557,7 +557,7 @@
 {
     if (documentLoader()->applicationCacheHost()->maybeLoadFallbackForRedirect(this, request, redirectResponse))
         return;
-    willSendRequest(request, redirectResponse);
+    willSendRequestInternal(request, redirectResponse);
 }
 
 void ResourceLoader::didSendData(ResourceHandle*, unsigned long long bytesSent, unsigned long long totalBytesToBeSent)

Modified: branches/safari-601.1-branch/Source/WebCore/loader/ResourceLoader.h (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebCore/loader/ResourceLoader.h	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebCore/loader/ResourceLoader.h	2015-08-06 23:09:38 UTC (rev 188076)
@@ -99,8 +99,7 @@
     
     virtual bool isSubresourceLoader();
 
-    virtual void willSendRequest(ResourceRequest&, const ResourceResponse& redirectResponse);
-    virtual void willSendRequest(ResourceRequest&&, const ResourceResponse& redirectResponse, std::function<void(ResourceRequest&)> callback);
+    virtual void willSendRequest(ResourceRequest&&, const ResourceResponse& redirectResponse, std::function<void(ResourceRequest&&)>&& callback);
     virtual void didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent);
     virtual void didReceiveResponse(const ResourceResponse&);
     virtual void didReceiveData(const char*, unsigned, long long encodedDataLength, DataPayloadType);
@@ -170,6 +169,8 @@
     virtual CFCachedURLResponseRef willCacheResponse(ResourceHandle*, CFCachedURLResponseRef) override;
 #endif
 
+    virtual void willSendRequestInternal(ResourceRequest&, const ResourceResponse& redirectResponse);
+
     RefPtr<ResourceHandle> m_handle;
     RefPtr<Frame> m_frame;
     RefPtr<DocumentLoader> m_documentLoader;

Modified: branches/safari-601.1-branch/Source/WebCore/loader/SubresourceLoader.cpp (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebCore/loader/SubresourceLoader.cpp	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebCore/loader/SubresourceLoader.cpp	2015-08-06 23:09:38 UTC (rev 188076)
@@ -152,7 +152,7 @@
     return true;
 }
 
-void SubresourceLoader::willSendRequest(ResourceRequest& newRequest, const ResourceResponse& redirectResponse)
+void SubresourceLoader::willSendRequestInternal(ResourceRequest& newRequest, const ResourceResponse& redirectResponse)
 {
     // Store the previous URL because the call to ResourceLoader::willSendRequest will modify it.
     URL previousURL = request().url();
@@ -185,7 +185,7 @@
     if (newRequest.isNull() || reachedTerminalState())
         return;
 
-    ResourceLoader::willSendRequest(newRequest, redirectResponse);
+    ResourceLoader::willSendRequestInternal(newRequest, redirectResponse);
     if (newRequest.isNull())
         cancel();
 }

Modified: branches/safari-601.1-branch/Source/WebCore/loader/SubresourceLoader.h (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebCore/loader/SubresourceLoader.h	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebCore/loader/SubresourceLoader.h	2015-08-06 23:09:38 UTC (rev 188076)
@@ -63,7 +63,7 @@
 
     virtual bool init(const ResourceRequest&) override;
 
-    virtual void willSendRequest(ResourceRequest&, const ResourceResponse& redirectResponse) override;
+    virtual void willSendRequestInternal(ResourceRequest&, const ResourceResponse& redirectResponse) override;
     virtual void didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent) override;
     virtual void didReceiveResponse(const ResourceResponse&) override;
     virtual void didReceiveData(const char*, unsigned, long long encodedDataLength, DataPayloadType) override;

Modified: branches/safari-601.1-branch/Source/WebCore/plugins/npapi.h (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebCore/plugins/npapi.h	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebCore/plugins/npapi.h	2015-08-06 23:09:38 UTC (rev 188076)
@@ -96,7 +96,7 @@
 /*----------------------------------------------------------------------*/
 
 #define NP_VERSION_MAJOR 0
-#define NP_VERSION_MINOR 24
+#define NP_VERSION_MINOR 26
 
 
 /* The OS/2 version of Netscape uses RC_DATA to define the
@@ -868,6 +868,9 @@
 void        NP_LOADDS NPN_UnscheduleTimer(NPP instance, uint32_t timerID);
 NPError     NP_LOADDS NPN_PopUpContextMenu(NPP instance, NPMenu* menu);
 NPBool      NP_LOADDS NPN_ConvertPoint(NPP instance, double sourceX, double sourceY, NPCoordinateSpace sourceSpace, double *destX, double *destY, NPCoordinateSpace destSpace);
+NPBool      NP_LOADDS NPN_HandleEvent(NPP instance, void *event, NPBool handled);
+NPBool      NP_LOADDS NPN_UnfocusInstance(NPP instance, NPFocusDirection direction);
+void        NP_LOADDS NPN_URLRedirectResponse(NPP instance, void* notifyData, NPBool allow);
 
 #ifdef __cplusplus
 }  /* end extern "C" */

Modified: branches/safari-601.1-branch/Source/WebCore/plugins/npfunctions.h (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebCore/plugins/npfunctions.h	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebCore/plugins/npfunctions.h	2015-08-06 23:09:38 UTC (rev 188076)
@@ -71,6 +71,9 @@
 typedef void (*NPN_UnscheduleTimerProcPtr)(NPP npp, uint32_t timerID);
 typedef NPError (*NPN_PopUpContextMenuProcPtr)(NPP instance, NPMenu* menu);
 typedef NPBool (*NPN_ConvertPointProcPtr)(NPP npp, double sourceX, double sourceY, NPCoordinateSpace sourceSpace, double *destX, double *destY, NPCoordinateSpace destSpace);
+typedef NPBool (*NPN_HandleEventPtr)(NPP instance, void *event, NPBool handled);
+typedef NPBool (*NPN_UnfocusInstancePtr)(NPP instance, NPFocusDirection direction);
+typedef void (*NPN_URLRedirectResponsePtr)(NPP instance, void* notifyData, NPBool allow);
 
 typedef void (*NPN_ReleaseVariantValueProcPtr) (NPVariant *variant);
 
@@ -175,6 +178,9 @@
     NPN_UnscheduleTimerProcPtr unscheduletimer;
     NPN_PopUpContextMenuProcPtr popupcontextmenu;
     NPN_ConvertPointProcPtr convertpoint;
+    NPN_HandleEventPtr handleevent;
+    NPN_UnfocusInstancePtr unfocusinstance;
+    NPN_URLRedirectResponsePtr urlredirectresponse;
 } NPNetscapeFuncs;
 
 typedef struct _NPPluginFuncs {

Modified: branches/safari-601.1-branch/Source/WebKit/mac/ChangeLog (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebKit/mac/ChangeLog	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebKit/mac/ChangeLog	2015-08-06 23:09:38 UTC (rev 188076)
@@ -1,3 +1,29 @@
+2015-08-06  Dana Burkart  <dburk...@apple.com>
+
+        Merge r187886. rdar://problem/15779101
+
+    2015-08-04  Alexey Proskuryakov  <a...@apple.com>
+
+            Implement NPAPI redirect handling
+            https://bugs.webkit.org/show_bug.cgi?id=138675
+            rdar://problem/15779101
+
+            Patch by Jeffrey Pfau, updated and tweaked by me.
+
+            Reviewed by Anders Carlsson.
+
+            * Plugins/Hosted/HostedNetscapePluginStream.h:
+            (WebKit::HostedNetscapePluginStream::streamID):
+            * Plugins/Hosted/HostedNetscapePluginStream.mm:
+            (WebKit::HostedNetscapePluginStream::didFinishLoading):
+            (WebKit::HostedNetscapePluginStream::willSendRequest):
+            (WebKit::HostedNetscapePluginStream::didReceiveResponse):
+            * Plugins/WebNetscapePluginStream.h:
+            * Plugins/WebNetscapePluginStream.mm:
+            (WebNetscapePluginStream::stop):
+            (WebNetscapePluginStream::willSendRequest):
+            (WebNetscapePluginStream::didReceiveResponse):
+
 2015-08-04  Matthew Hanson  <matthew_han...@apple.com>
 
         Merge r187805. rdar://problem/21838271

Modified: branches/safari-601.1-branch/Source/WebKit/mac/Plugins/Hosted/HostedNetscapePluginStream.h (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebKit/mac/Plugins/Hosted/HostedNetscapePluginStream.h	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebKit/mac/Plugins/Hosted/HostedNetscapePluginStream.h	2015-08-06 23:09:38 UTC (rev 188076)
@@ -61,10 +61,12 @@
     uint32_t streamID() const { return m_streamID; }
 
     void startStreamWithResponse(NSURLResponse *response);
-    void didReceiveData(WebCore::NetscapePlugInStreamLoader*, const char* bytes, int length);
-    void didFinishLoading(WebCore::NetscapePlugInStreamLoader*);
-    void didFail(WebCore::NetscapePlugInStreamLoader*, const WebCore::ResourceError&);
 
+    // FIXME: Can these be made private?
+    void didReceiveData(WebCore::NetscapePlugInStreamLoader*, const char* bytes, int length) override;
+    void didFinishLoading(WebCore::NetscapePlugInStreamLoader*) override;
+    void didFail(WebCore::NetscapePlugInStreamLoader*, const WebCore::ResourceError&) override;
+
     void start();
     void stop();
 
@@ -84,8 +86,9 @@
     NSError *pluginCancelledConnectionError() const;
 
     // NetscapePlugInStreamLoaderClient methods.
-    void didReceiveResponse(WebCore::NetscapePlugInStreamLoader*, const WebCore::ResourceResponse&);
-    bool wantsAllStreams() const;
+    void willSendRequest(WebCore::NetscapePlugInStreamLoader*, WebCore::ResourceRequest&&, const WebCore::ResourceResponse& redirectResponse, std::function<void (WebCore::ResourceRequest&&)>&&) override;
+    void didReceiveResponse(WebCore::NetscapePlugInStreamLoader*, const WebCore::ResourceResponse&) override;
+    bool wantsAllStreams() const override;
     
     RefPtr<NetscapePluginInstanceProxy> m_instance;
     uint32_t m_streamID;

Modified: branches/safari-601.1-branch/Source/WebKit/mac/Plugins/Hosted/HostedNetscapePluginStream.mm (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebKit/mac/Plugins/Hosted/HostedNetscapePluginStream.mm	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebKit/mac/Plugins/Hosted/HostedNetscapePluginStream.mm	2015-08-06 23:09:38 UTC (rev 188076)
@@ -128,7 +128,13 @@
                                 m_streamID);
     m_instance->disconnectStream(this);
 }
-    
+
+void HostedNetscapePluginStream::willSendRequest(NetscapePlugInStreamLoader*, ResourceRequest&& request, const ResourceResponse&, std::function<void (WebCore::ResourceRequest&&)>&& callback)
+{
+    // FIXME: We should notify the plug-in with NPP_URLRedirectNotify here.
+    callback(WTF::move(request));
+}
+
 void HostedNetscapePluginStream::didReceiveResponse(NetscapePlugInStreamLoader*, const ResourceResponse& response)
 {
     NSURLResponse *r = response.nsURLResponse();

Modified: branches/safari-601.1-branch/Source/WebKit/mac/Plugins/WebNetscapePluginStream.h (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebKit/mac/Plugins/WebNetscapePluginStream.h	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebKit/mac/Plugins/WebNetscapePluginStream.h	2015-08-06 23:09:38 UTC (rev 188076)
@@ -79,10 +79,12 @@
     
     void startStreamWithResponse(NSURLResponse *response);
     
-    void didReceiveData(WebCore::NetscapePlugInStreamLoader*, const char* bytes, int length);
     void destroyStreamWithError(NSError *);
-    void didFinishLoading(WebCore::NetscapePlugInStreamLoader*);
 
+    // FIXME: Can these be made private?
+    void didReceiveData(WebCore::NetscapePlugInStreamLoader*, const char* bytes, int length) override;
+    void didFinishLoading(WebCore::NetscapePlugInStreamLoader*) override;
+
 private:
     void destroyStream();
     void cancelLoadWithError(NSError *);
@@ -95,6 +97,7 @@
     NSError *pluginCancelledConnectionError() const;
 
     // NetscapePlugInStreamLoaderClient methods.
+    void willSendRequest(WebCore::NetscapePlugInStreamLoader*, WebCore::ResourceRequest&&, const WebCore::ResourceResponse& redirectResponse, std::function<void (WebCore::ResourceRequest&&)>&&) override;
     void didReceiveResponse(WebCore::NetscapePlugInStreamLoader*, const WebCore::ResourceResponse&);
     void didFail(WebCore::NetscapePlugInStreamLoader*, const WebCore::ResourceError&);
     bool wantsAllStreams() const;

Modified: branches/safari-601.1-branch/Source/WebKit/mac/Plugins/WebNetscapePluginStream.mm (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebKit/mac/Plugins/WebNetscapePluginStream.mm	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebKit/mac/Plugins/WebNetscapePluginStream.mm	2015-08-06 23:09:38 UTC (rev 188076)
@@ -297,6 +297,12 @@
         cancelLoadAndDestroyStreamWithError(m_loader->cancelledError());
 }
 
+void WebNetscapePluginStream::willSendRequest(NetscapePlugInStreamLoader*, ResourceRequest&& request, const ResourceResponse&, std::function<void (WebCore::ResourceRequest&&)>&& callback)
+{
+    // FIXME: We should notify the plug-in with NPP_URLRedirectNotify here.
+    callback(WTF::move(request));
+}
+
 void WebNetscapePluginStream::didReceiveResponse(NetscapePlugInStreamLoader*, const ResourceResponse& response)
 {
     NSURLResponse *r = response.nsURLResponse();

Modified: branches/safari-601.1-branch/Source/WebKit/win/ChangeLog (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebKit/win/ChangeLog	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebKit/win/ChangeLog	2015-08-06 23:09:38 UTC (rev 188076)
@@ -1 +1,21 @@
+2015-08-06  Dana Burkart  <dburk...@apple.com>
+
+        Merge r187886. rdar://problem/15779101
+
+    2015-08-04  Alexey Proskuryakov  <a...@apple.com>
+
+            Implement NPAPI redirect handling
+            https://bugs.webkit.org/show_bug.cgi?id=138675
+            rdar://problem/15779101
+
+            Patch by Jeffrey Pfau, updated and tweaked by me.
+
+            Reviewed by Anders Carlsson.
+
+            * Plugins/PluginStream.cpp:
+            (WebCore::PluginStream::sendJavaScriptStream):
+            (WebCore::PluginStream::willSendRequest):
+            (WebCore::PluginStream::didReceiveResponse):
+            * Plugins/PluginStream.h:
+
 == Rolled over to ChangeLog-2015-07-23 ==

Modified: branches/safari-601.1-branch/Source/WebKit/win/Plugins/PluginStream.cpp (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebKit/win/Plugins/PluginStream.cpp	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebKit/win/Plugins/PluginStream.cpp	2015-08-06 23:09:38 UTC (rev 188076)
@@ -403,6 +403,12 @@
     destroyStream(resultString.isNull() ? NPRES_NETWORK_ERR : NPRES_DONE);
 }
 
+void PluginStream::willSendRequest(NetscapePlugInStreamLoader*, ResourceRequest&& request, const ResourceResponse&, std::function<void (WebCore::ResourceRequest&&)>&& callback)
+{
+    // FIXME: We should notify the plug-in with NPP_URLRedirectNotify here.
+    callback(WTF::move(request));
+}
+
 void PluginStream::didReceiveResponse(NetscapePlugInStreamLoader* loader, const ResourceResponse& response)
 {
     ASSERT_UNUSED(loader, loader == m_loader);

Modified: branches/safari-601.1-branch/Source/WebKit/win/Plugins/PluginStream.h (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebKit/win/Plugins/PluginStream.h	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebKit/win/Plugins/PluginStream.h	2015-08-06 23:09:38 UTC (rev 188076)
@@ -74,13 +74,6 @@
 
         static NPP ownerForStream(NPStream*);
 
-        // NetscapePlugInStreamLoaderClient
-        virtual void didReceiveResponse(NetscapePlugInStreamLoader*, const ResourceResponse&);
-        virtual void didReceiveData(NetscapePlugInStreamLoader*, const char*, int);
-        virtual void didFail(NetscapePlugInStreamLoader*, const ResourceError&);
-        virtual void didFinishLoading(NetscapePlugInStreamLoader*);
-        virtual bool wantsAllStreams() const;
-
     private:
         PluginStream(PluginStreamClient*, Frame*, const ResourceRequest&, bool sendNotification, void* notifyData, const NPPluginFuncs*, NPP instance, const PluginQuirkSet&);
 
@@ -88,6 +81,14 @@
         void destroyStream(NPReason);
         void destroyStream();
 
+        // NetscapePlugInStreamLoaderClient
+        void willSendRequest(NetscapePlugInStreamLoader*, ResourceRequest&&, const ResourceResponse& redirectResponse, std::function<void (ResourceRequest&&)>&&) override;
+        void didReceiveResponse(NetscapePlugInStreamLoader*, const ResourceResponse&) override;
+        void didReceiveData(NetscapePlugInStreamLoader*, const char*, int) override;
+        void didFail(NetscapePlugInStreamLoader*, const ResourceError&) override;
+        void didFinishLoading(NetscapePlugInStreamLoader*) override;
+        bool wantsAllStreams() const override;
+
         ResourceRequest m_resourceRequest;
         ResourceResponse m_resourceResponse;
 

Modified: branches/safari-601.1-branch/Source/WebKit2/ChangeLog (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebKit2/ChangeLog	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebKit2/ChangeLog	2015-08-06 23:09:38 UTC (rev 188076)
@@ -1,3 +1,81 @@
+2015-08-06  Dana Burkart  <dburk...@apple.com>
+
+        Merge r187886. rdar://problem/15779101
+
+    2015-08-04  Alexey Proskuryakov  <a...@apple.com>
+
+            Implement NPAPI redirect handling
+            https://bugs.webkit.org/show_bug.cgi?id=138675
+            rdar://problem/15779101
+
+            Patch by Jeffrey Pfau, updated and tweaked by me.
+
+            Reviewed by Anders Carlsson.
+
+            * PluginProcess/PluginControllerProxy.cpp:
+            (WebKit::PluginControllerProxy::loadURL):
+            (WebKit::PluginControllerProxy::continueStreamLoad):
+            (WebKit::PluginControllerProxy::cancelStreamLoad):
+            (WebKit::PluginControllerProxy::didEvaluateJavaScript):
+            (WebKit::PluginControllerProxy::streamWillSendRequest):
+            (WebKit::PluginControllerProxy::streamDidReceiveResponse):
+            * PluginProcess/PluginControllerProxy.h:
+            * PluginProcess/PluginControllerProxy.messages.in:
+            * WebProcess/Network/WebResourceLoader.cpp:
+            (WebKit::WebResourceLoader::willSendRequest):
+            * WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp:
+            (WebKit::NPN_ConvertPoint):
+            (WebKit::NPN_URLRedirectResponse):
+            (WebKit::initializeBrowserFuncs):
+            (WebKit::netscapeBrowserFuncs):
+            * WebProcess/Plugins/Netscape/NetscapePlugin.cpp:
+            (WebKit::NetscapePlugin::getAuthenticationInfo):
+            (WebKit::NetscapePlugin::registerRedirect):
+            (WebKit::NetscapePlugin::urlRedirectResponse):
+            (WebKit::NetscapePlugin::setIsPlayingAudio):
+            (WebKit::NetscapePlugin::NPP_URLNotify):
+            (WebKit::NetscapePlugin::NPP_URLRedirectNotify):
+            (WebKit::NetscapePlugin::NPP_GetValue):
+            (WebKit::NetscapePlugin::didEvaluateJavaScript):
+            (WebKit::NetscapePlugin::streamWillSendRequest):
+            (WebKit::NetscapePlugin::streamDidReceiveResponse):
+            * WebProcess/Plugins/Netscape/NetscapePlugin.h:
+            * WebProcess/Plugins/Netscape/NetscapePluginStream.cpp:
+            (WebKit::NetscapePluginStream::~NetscapePluginStream):
+            (WebKit::NetscapePluginStream::willSendRequest):
+            (WebKit::NetscapePluginStream::didReceiveResponse):
+            (WebKit::NetscapePluginStream::stop):
+            (WebKit::NetscapePluginStream::setURL):
+            (WebKit::NetscapePluginStream::cancel):
+            * WebProcess/Plugins/Netscape/NetscapePluginStream.h:
+            (WebKit::NetscapePluginStream::streamID):
+            (WebKit::NetscapePluginStream::npStream):
+            * WebProcess/Plugins/PDF/PDFPlugin.h:
+            * WebProcess/Plugins/Plugin.h:
+            * WebProcess/Plugins/PluginController.h:
+            * WebProcess/Plugins/PluginProxy.cpp:
+            (WebKit::PluginProxy::didEvaluateJavaScript):
+            (WebKit::PluginProxy::streamWillSendRequest):
+            (WebKit::PluginProxy::streamDidReceiveResponse):
+            (WebKit::PluginProxy::setPluginIsPlayingAudio):
+            (WebKit::PluginProxy::continueStreamLoad):
+            (WebKit::PluginProxy::cancelStreamLoad):
+            * WebProcess/Plugins/PluginProxy.h:
+            * WebProcess/Plugins/PluginProxy.messages.in:
+            * WebProcess/Plugins/PluginView.cpp:
+            (WebKit::PluginView::Stream::streamID):
+            (WebKit::PluginView::Stream::Stream):
+            (WebKit::PluginView::Stream::cancel):
+            (WebKit::PluginView::Stream::continueLoad):
+            (WebKit::buildHTTPHeaders):
+            (WebKit::lastModifiedDateMS):
+            (WebKit::PluginView::Stream::willSendRequest):
+            (WebKit::PluginView::Stream::didReceiveResponse):
+            (WebKit::PluginView::cancelStreamLoad):
+            (WebKit::PluginView::continueStreamLoad):
+            (WebKit::PluginView::cancelManualStreamLoad):
+            * WebProcess/Plugins/PluginView.h:
+
 2015-08-03  Matthew Hanson  <matthew_han...@apple.com>
 
         Merge r187691. rdar://problem/22060183

Modified: branches/safari-601.1-branch/Source/WebKit2/PluginProcess/PluginControllerProxy.cpp (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebKit2/PluginProcess/PluginControllerProxy.cpp	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebKit2/PluginProcess/PluginControllerProxy.cpp	2015-08-06 23:09:38 UTC (rev 188076)
@@ -241,6 +241,11 @@
     m_connection->connection()->send(Messages::PluginProxy::LoadURL(requestID, method, urlString, target, headerFields, httpBody, allowPopups), m_pluginInstanceID);
 }
 
+void PluginControllerProxy::continueStreamLoad(uint64_t streamID)
+{
+    m_connection->connection()->send(Messages::PluginProxy::ContinueStreamLoad(streamID), m_pluginInstanceID);
+}
+
 void PluginControllerProxy::cancelStreamLoad(uint64_t streamID)
 {
     m_connection->connection()->send(Messages::PluginProxy::CancelStreamLoad(streamID), m_pluginInstanceID);
@@ -463,6 +468,11 @@
     m_plugin->didEvaluateJavaScript(requestID, result);
 }
 
+void PluginControllerProxy::streamWillSendRequest(uint64_t streamID, const String& requestURLString, const String& redirectResponseURLString, uint32_t redirectResponseStatusCode)
+{
+    m_plugin->streamWillSendRequest(streamID, URL(ParsedURLString, requestURLString), URL(ParsedURLString, redirectResponseURLString), redirectResponseStatusCode);
+}
+
 void PluginControllerProxy::streamDidReceiveResponse(uint64_t streamID, const String& responseURLString, uint32_t streamLength, uint32_t lastModifiedTime, const String& mimeType, const String& headers)
 {
     m_plugin->streamDidReceiveResponse(streamID, URL(ParsedURLString, responseURLString), streamLength, lastModifiedTime, mimeType, headers, String());

Modified: branches/safari-601.1-branch/Source/WebKit2/PluginProcess/PluginControllerProxy.h (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebKit2/PluginProcess/PluginControllerProxy.h	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebKit2/PluginProcess/PluginControllerProxy.h	2015-08-06 23:09:38 UTC (rev 188076)
@@ -86,6 +86,7 @@
     virtual void invalidate(const WebCore::IntRect&) override;
     virtual String userAgent() override;
     virtual void loadURL(uint64_t requestID, const String& method, const String& urlString, const String& target, const WebCore::HTTPHeaderMap& headerFields, const Vector<uint8_t>& httpBody, bool allowPopups) override;
+    virtual void continueStreamLoad(uint64_t streamID) override;
     virtual void cancelStreamLoad(uint64_t streamID) override;
     virtual void cancelManualStreamLoad() override;
     virtual NPObject* windowScriptNPObject() override;
@@ -126,6 +127,7 @@
     void geometryDidChange(const WebCore::IntSize& pluginSize, const WebCore::IntRect& clipRect, const WebCore::AffineTransform& pluginToRootViewTransform, float contentsScaleFactor, const ShareableBitmap::Handle& backingStoreHandle);
     void visibilityDidChange(bool isVisible);
     void didEvaluateJavaScript(uint64_t requestID, const String& result);
+    void streamWillSendRequest(uint64_t streamID, const String& requestURLString, const String& redirectResponseURLString, uint32_t redirectResponseStatusCode);
     void streamDidReceiveResponse(uint64_t streamID, const String& responseURLString, uint32_t streamLength, uint32_t lastModifiedTime, const String& mimeType, const String& headers);
     void streamDidReceiveData(uint64_t streamID, const IPC::DataReference& data);
     void streamDidFinishLoading(uint64_t streamID);

Modified: branches/safari-601.1-branch/Source/WebKit2/PluginProcess/PluginControllerProxy.messages.in (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebKit2/PluginProcess/PluginControllerProxy.messages.in	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebKit2/PluginProcess/PluginControllerProxy.messages.in	2015-08-06 23:09:38 UTC (rev 188076)
@@ -38,6 +38,9 @@
     # Sent when _javascript_ that the plug-in asked to be evaluated has been evaluated.
     DidEvaluateJavaScript(uint64_t requestID, String result)
 
+    # Sent when the plug-in receives will send a request for a stream.
+    StreamWillSendRequest(uint64_t streamID, String requestURLString, String redirectResponseURLString, uint32_t redirectResponseStatusCode)
+
     # Sent when the plug-in receives a response for a stream.
     StreamDidReceiveResponse(uint64_t streamID, String responseURLString, uint32_t streamLength, uint32_t lastModifiedTime, String mimeType, String headers)
 

Modified: branches/safari-601.1-branch/Source/WebKit2/WebProcess/Network/WebResourceLoader.cpp (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebKit2/WebProcess/Network/WebResourceLoader.cpp	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebKit2/WebProcess/Network/WebResourceLoader.cpp	2015-08-06 23:09:38 UTC (rev 188076)
@@ -89,14 +89,11 @@
     if (m_coreLoader->documentLoader()->applicationCacheHost()->maybeLoadFallbackForRedirect(m_coreLoader.get(), newRequest, redirectResponse))
         return;
     // FIXME: Do we need to update NetworkResourceLoader clientCredentialPolicy in case loader policy is DoNotAskClientForCrossOriginCredentials?
-    m_coreLoader->willSendRequest(WTF::move(newRequest), redirectResponse, [protect](ResourceRequest& request) {
+    m_coreLoader->willSendRequest(WTF::move(newRequest), redirectResponse, [protect](ResourceRequest&& request) {
         if (!protect->m_coreLoader)
             return;
 
-        if (!request.isNull())
-            protect->send(Messages::NetworkResourceLoader::ContinueWillSendRequest(request));
-        else
-            protect->m_coreLoader->cancel();
+        protect->send(Messages::NetworkResourceLoader::ContinueWillSendRequest(request));
     });
 }
 

Modified: branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp	2015-08-06 23:09:38 UTC (rev 188076)
@@ -983,6 +983,13 @@
 }
 #endif
 
+static void NPN_URLRedirectResponse(NPP npp, void* notifyData, NPBool allow)
+{
+    RefPtr<NetscapePlugin> plugin = NetscapePlugin::fromNPP(npp);
+
+    plugin->urlRedirectResponse(notifyData, allow);
+}
+
 static void initializeBrowserFuncs(NPNetscapeFuncs &netscapeFuncs)
 {
     netscapeFuncs.size = sizeof(NPNetscapeFuncs);
@@ -1046,6 +1053,11 @@
     netscapeFuncs.popupcontextmenu = 0;
     netscapeFuncs.convertpoint = 0;
 #endif
+#if ENABLE(NETWORK_PROCESS)
+    netscapeFuncs.urlredirectresponse = NPN_URLRedirectResponse;
+#else
+    netscapeFuncs.urlredirectresponse = 0;
+#endif
 }
     
 NPNetscapeFuncs* netscapeBrowserFuncs()

Modified: branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.cpp (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.cpp	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.cpp	2015-08-06 23:09:38 UTC (rev 188076)
@@ -396,8 +396,41 @@
 bool NetscapePlugin::getAuthenticationInfo(const ProtectionSpace& protectionSpace, String& username, String& password)
 {
     return controller()->getAuthenticationInfo(protectionSpace, username, password);
-}    
+}
 
+void NetscapePlugin::registerRedirect(NetscapePluginStream* stream, const URL& requestURL, int redirectResponseStatus, void* notificationData)
+{
+#if ENABLE(NETWORK_PROCESS)
+    // NPP_URLRedirectNotify may synchronously request this stream back out, so set it first
+    m_redirects.set(notificationData, std::make_pair(stream, requestURL.string()));
+    if (!NPP_URLRedirectNotify(requestURL.string().utf8().data(), redirectResponseStatus, notificationData)) {
+        m_redirects.take(notificationData);
+        controller()->continueStreamLoad(stream->streamID());
+    }
+#else
+    controller()->continueStreamLoad(stream->streamID());
+#endif
+}
+
+void NetscapePlugin::urlRedirectResponse(void* notifyData, bool allow)
+{
+    if (!m_redirects.contains(notifyData))
+        return;
+
+    auto redirect = m_redirects.take(notifyData);
+    if (!redirect.first)
+        return;
+
+    RefPtr<NetscapePluginStream> stream = redirect.first;
+    if (!allow) {
+        controller()->cancelStreamLoad(stream->streamID());
+        stream->stop(NPRES_USER_BREAK);
+    } else {
+        stream->setURL(redirect.second);
+        controller()->continueStreamLoad(stream->streamID());
+    }
+}
+
 void NetscapePlugin::setIsPlayingAudio(bool isPlayingAudio)
 {
     controller()->setPluginIsPlayingAudio(isPlayingAudio);
@@ -453,6 +486,15 @@
     m_pluginModule->pluginFuncs().urlnotify(&m_npp, url, reason, notifyData);
 }
 
+bool NetscapePlugin::NPP_URLRedirectNotify(const char* url, int32_t status, void* notifyData)
+{
+    if (!m_pluginModule->pluginFuncs().urlredirectnotify)
+        return false;
+
+    m_pluginModule->pluginFuncs().urlredirectnotify(&m_npp, url, status, notifyData);
+    return true;
+}
+
 NPError NetscapePlugin::NPP_GetValue(NPPVariable variable, void *value)
 {
     if (!m_pluginModule->pluginFuncs().getvalue)
@@ -814,6 +856,14 @@
         pluginStream->sendJavaScriptStream(result);
 }
 
+void NetscapePlugin::streamWillSendRequest(uint64_t streamID, const URL& requestURL, const URL& redirectResponseURL, int redirectResponseStatus)
+{
+    ASSERT(m_isStarted);
+
+    if (NetscapePluginStream* pluginStream = streamFromID(streamID))
+        pluginStream->willSendRequest(requestURL, redirectResponseURL, redirectResponseStatus);
+}
+
 void NetscapePlugin::streamDidReceiveResponse(uint64_t streamID, const URL& responseURL, uint32_t streamLength, 
                                               uint32_t lastModifiedTime, const String& mimeType, const String& headers, const String& /* suggestedFileName */)
 {

Modified: branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.h (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.h	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.h	2015-08-06 23:09:38 UTC (rev 188076)
@@ -141,6 +141,9 @@
 
     void setIsPlayingAudio(bool);
 
+    void registerRedirect(NetscapePluginStream*, const WebCore::URL& requestURL, int redirectResponseStatus, void* notificationData);
+    void urlRedirectResponse(void* notifyData, bool allow);
+
     // Member functions for calling into the plug-in.
     NPError NPP_New(NPMIMEType pluginType, uint16_t mode, int16_t argc, char* argn[], char* argv[], NPSavedData*);
     NPError NPP_Destroy(NPSavedData**);
@@ -152,6 +155,7 @@
     int32_t NPP_Write(NPStream*, int32_t offset, int32_t len, void* buffer);
     int16_t NPP_HandleEvent(void* event);
     void NPP_URLNotify(const char* url, NPReason, void* notifyData);
+    bool NPP_URLRedirectNotify(const char* url, int32_t status, void* notifyData);
     NPError NPP_GetValue(NPPVariable, void *value);
     NPError NPP_SetValue(NPNVariable, void *value);
 
@@ -199,7 +203,8 @@
     virtual void frameDidFinishLoading(uint64_t requestID) override;
     virtual void frameDidFail(uint64_t requestID, bool wasCancelled) override;
     virtual void didEvaluateJavaScript(uint64_t requestID, const String& result) override;
-    virtual void streamDidReceiveResponse(uint64_t streamID, const WebCore::URL& responseURL, uint32_t streamLength, 
+    virtual void streamWillSendRequest(uint64_t streamID, const WebCore::URL& requestURL, const WebCore::URL& responseURL, int responseStatus) override;
+    virtual void streamDidReceiveResponse(uint64_t streamID, const WebCore::URL& responseURL, uint32_t streamLength,
                                           uint32_t lastModifiedTime, const String& mimeType, const String& headers, const String& suggestedFileName) override;
     virtual void streamDidReceiveData(uint64_t streamID, const char* bytes, int length) override;
     virtual void streamDidFinishLoading(uint64_t streamID) override;
@@ -288,6 +293,7 @@
 
     typedef HashMap<uint64_t, RefPtr<NetscapePluginStream>> StreamsMap;
     StreamsMap m_streams;
+    HashMap<void*, std::pair<RefPtr<NetscapePluginStream>, String>> m_redirects;
 
     RefPtr<NetscapePluginModule> m_pluginModule;
     NPP_t m_npp;

Modified: branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePluginStream.cpp (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePluginStream.cpp	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePluginStream.cpp	2015-08-06 23:09:38 UTC (rev 188076)
@@ -62,6 +62,14 @@
     ASSERT(m_fileHandle == invalidPlatformFileHandle);
 }
 
+void NetscapePluginStream::willSendRequest(const URL& requestURL, const URL& redirectResponseURL, int redirectResponseStatus)
+{
+    Ref<NetscapePluginStream> protect(*this);
+
+    if (redirectResponseStatus >= 300 && redirectResponseStatus < 400)
+        m_plugin->registerRedirect(this, requestURL, redirectResponseStatus, m_notificationData);
+}
+
 void NetscapePluginStream::didReceiveResponse(const URL& responseURL, uint32_t streamLength, uint32_t lastModifiedTime, const String& mimeType, const String& headers)
 {
     // Starting the stream could cause the plug-in stream to go away so we keep a reference to it here.
@@ -338,6 +346,11 @@
     notifyAndDestroyStream(reason);
 }
 
+void NetscapePluginStream::setURL(const String& newURLString)
+{
+    m_requestURLString = newURLString;
+}
+
 void NetscapePluginStream::cancel()
 {
     m_plugin->cancelStreamLoad(this);

Modified: branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePluginStream.h (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePluginStream.h	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePluginStream.h	2015-08-06 23:09:38 UTC (rev 188076)
@@ -57,6 +57,7 @@
     uint64_t streamID() const { return m_streamID; }
     const NPStream* npStream() const { return &m_npStream; }
 
+    void willSendRequest(const WebCore::URL& requestURL, const WebCore::URL& redirectResponseURL, int redirectResponseStatus);
     void didReceiveResponse(const WebCore::URL& responseURL, uint32_t streamLength,
                             uint32_t lastModifiedTime, const String& mimeType, const String& headers);
     void didReceiveData(const char* bytes, int length);
@@ -67,6 +68,7 @@
 
     void stop(NPReason);
     NPError destroy(NPReason);
+    void setURL(const String& newURLString);
 
 private:
     NetscapePluginStream(PassRefPtr<NetscapePlugin>, uint64_t streamID, const String& requestURLString, bool sendNotification, void* notificationData);

Modified: branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.h (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.h	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.h	2015-08-06 23:09:38 UTC (rev 188076)
@@ -128,6 +128,7 @@
     virtual void frameDidFinishLoading(uint64_t requestID) override;
     virtual void frameDidFail(uint64_t requestID, bool wasCancelled) override;
     virtual void didEvaluateJavaScript(uint64_t requestID, const String& result) override;
+    virtual void streamWillSendRequest(uint64_t streamID, const WebCore::URL& requestURL, const WebCore::URL& responseURL, int responseStatus) override { }
     virtual void streamDidReceiveResponse(uint64_t streamID, const WebCore::URL& responseURL, uint32_t streamLength, uint32_t lastModifiedTime, const String& mimeType, const String& headers, const String& suggestedFileName) override;
     virtual void streamDidReceiveData(uint64_t streamID, const char* bytes, int length) override;
     virtual void streamDidFinishLoading(uint64_t streamID) override;

Modified: branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/Plugin.h (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/Plugin.h	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/Plugin.h	2015-08-06 23:09:38 UTC (rev 188076)
@@ -165,6 +165,9 @@
     // back the result. If evaluating the script failed, result will be null.
     virtual void didEvaluateJavaScript(uint64_t requestID, const String& result) = 0;
 
+    // Tells the plug-in that a stream may send an HTTP request.
+    virtual void streamWillSendRequest(uint64_t streamID, const WebCore::URL& requestURL, const WebCore::URL& responseURL, int responseStatusCode) = 0;
+
     // Tells the plug-in that a stream has received its HTTP response.
     virtual void streamDidReceiveResponse(uint64_t streamID, const WebCore::URL& responseURL, uint32_t streamLength, 
                                           uint32_t lastModifiedTime, const String& mimeType, const String& headers, const String& suggestedFileName) = 0;

Modified: branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/PluginController.h (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/PluginController.h	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/PluginController.h	2015-08-06 23:09:38 UTC (rev 188076)
@@ -64,7 +64,10 @@
     virtual void loadURL(uint64_t requestID, const String& method, const String& urlString, const String& target, 
                          const WebCore::HTTPHeaderMap& headerFields, const Vector<uint8_t>& httpBody, bool allowPopups) = 0;
 
-    /// Cancels the load of a stream that was requested by loadURL.
+    // Continues the load of a stream that was requested by loadURL.
+    virtual void continueStreamLoad(uint64_t streamID) = 0;
+
+    // Cancels the load of a stream that was requested by loadURL.
     virtual void cancelStreamLoad(uint64_t streamID) = 0;
 
     // Cancels the load of the manual stream.

Modified: branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/PluginProxy.cpp (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/PluginProxy.cpp	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/PluginProxy.cpp	2015-08-06 23:09:38 UTC (rev 188076)
@@ -321,6 +321,11 @@
     m_connection->connection()->send(Messages::PluginControllerProxy::DidEvaluateJavaScript(requestID, result), m_pluginInstanceID);
 }
 
+void PluginProxy::streamWillSendRequest(uint64_t streamID, const URL& requestURL, const URL& responseURL, int responseStatus)
+{
+    m_connection->connection()->send(Messages::PluginControllerProxy::StreamWillSendRequest(streamID, requestURL.string(), responseURL.string(), responseStatus), m_pluginInstanceID);
+}
+
 void PluginProxy::streamDidReceiveResponse(uint64_t streamID, const URL& responseURL, uint32_t streamLength, uint32_t lastModifiedTime, const WTF::String& mimeType, const WTF::String& headers, const String& /* suggestedFileName */)
 {
     m_connection->connection()->send(Messages::PluginControllerProxy::StreamDidReceiveResponse(streamID, responseURL.string(), streamLength, lastModifiedTime, mimeType, headers), m_pluginInstanceID);
@@ -661,6 +666,11 @@
     controller()->setPluginIsPlayingAudio(pluginIsPlayingAudio);
 }
 
+void PluginProxy::continueStreamLoad(uint64_t streamID)
+{
+    controller()->continueStreamLoad(streamID);
+}
+
 void PluginProxy::cancelStreamLoad(uint64_t streamID)
 {
     controller()->cancelStreamLoad(streamID);

Modified: branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/PluginProxy.h (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/PluginProxy.h	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/PluginProxy.h	2015-08-06 23:09:38 UTC (rev 188076)
@@ -90,6 +90,7 @@
     virtual void frameDidFinishLoading(uint64_t requestID) override;
     virtual void frameDidFail(uint64_t requestID, bool wasCancelled) override;
     virtual void didEvaluateJavaScript(uint64_t requestID, const String& result) override;
+    virtual void streamWillSendRequest(uint64_t streamID, const WebCore::URL& requestURL, const WebCore::URL& responseURL, int responseStatus) override;
     virtual void streamDidReceiveResponse(uint64_t streamID, const WebCore::URL& responseURL, uint32_t streamLength, uint32_t lastModifiedTime, const String& mimeType, const String& headers, const String& suggestedFileName) override;
     virtual void streamDidReceiveData(uint64_t streamID, const char* bytes, int length) override;
     virtual void streamDidFinishLoading(uint64_t streamID) override;
@@ -168,6 +169,7 @@
     void getPluginElementNPObject(uint64_t& pluginElementNPObjectID);
     void evaluate(const NPVariantData& npObjectAsVariantData, const String& scriptString, bool allowPopups, bool& returnValue, NPVariantData& resultData);
     void setPluginIsPlayingAudio(bool);
+    void continueStreamLoad(uint64_t streamID);
     void cancelStreamLoad(uint64_t streamID);
     void cancelManualStreamLoad();
     void setStatusbarText(const String& statusbarText);

Modified: branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/PluginProxy.messages.in (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/PluginProxy.messages.in	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/PluginProxy.messages.in	2015-08-06 23:09:38 UTC (rev 188076)
@@ -50,6 +50,9 @@
     # Cancels the given stream load.
     CancelStreamLoad(uint64_t streamID)
 
+    # Continues the given stream load.
+    ContinueStreamLoad(uint64_t streamID)
+
     # Cancel the manual stream load.
     CancelManualStreamLoad()
 

Modified: branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/PluginView.cpp (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/PluginView.cpp	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/PluginView.cpp	2015-08-06 23:09:38 UTC (rev 188076)
@@ -115,6 +115,7 @@
 
     void start();
     void cancel();
+    void continueLoad();
 
     uint64_t streamID() const { return m_streamID; }
 
@@ -128,15 +129,17 @@
     }
 
     // NetscapePluginStreamLoaderClient
-    virtual void didReceiveResponse(NetscapePlugInStreamLoader*, const ResourceResponse&);
-    virtual void didReceiveData(NetscapePlugInStreamLoader*, const char*, int);
-    virtual void didFail(NetscapePlugInStreamLoader*, const ResourceError&);
-    virtual void didFinishLoading(NetscapePlugInStreamLoader*);
+    void willSendRequest(NetscapePlugInStreamLoader*, ResourceRequest&&, const ResourceResponse& redirectResponse, std::function<void (ResourceRequest&&)>&&) override;
+    void didReceiveResponse(NetscapePlugInStreamLoader*, const ResourceResponse&) override;
+    void didReceiveData(NetscapePlugInStreamLoader*, const char*, int) override;
+    void didFail(NetscapePlugInStreamLoader*, const ResourceError&) override;
+    void didFinishLoading(NetscapePlugInStreamLoader*) override;
 
     PluginView* m_pluginView;
     uint64_t m_streamID;
-    const ResourceRequest m_request;
-    
+    ResourceRequest m_request;
+    std::function<void (ResourceRequest)> m_loadCallback;
+
     // True if the stream was explicitly cancelled by calling cancel().
     // (As opposed to being cancelled by the user hitting the stop button for example.
     bool m_streamWasCancelled;
@@ -169,6 +172,14 @@
     m_loader = nullptr;
 }
 
+void PluginView::Stream::continueLoad()
+{
+    ASSERT(m_pluginView->m_plugin);
+    ASSERT(m_loadCallback);
+
+    m_loadCallback(m_request);
+}
+
 static String buildHTTPHeaders(const ResourceResponse& response, long long& expectedContentLength)
 {
     if (!response.isHTTP())
@@ -210,6 +221,16 @@
     return std::chrono::duration_cast<std::chrono::milliseconds>(lastModified.value().time_since_epoch()).count();
 }
 
+void PluginView::Stream::willSendRequest(NetscapePlugInStreamLoader*, ResourceRequest&& request, const ResourceResponse& redirectResponse, std::function<void (ResourceRequest&&)>&& decisionHandler)
+{
+    const URL& requestURL = request.url();
+    const URL& redirectResponseURL = redirectResponse.url();
+
+    m_loadCallback = decisionHandler;
+    m_request = request;
+    m_pluginView->m_plugin->streamWillSendRequest(m_streamID, requestURL, redirectResponseURL, redirectResponse.httpStatusCode());
+}
+
 void PluginView::Stream::didReceiveResponse(NetscapePlugInStreamLoader*, const ResourceResponse& response)
 {
     // Compute the stream related data from the resource response.
@@ -1404,6 +1425,15 @@
     ASSERT(!m_streams.contains(streamID));
 }
 
+void PluginView::continueStreamLoad(uint64_t streamID)
+{
+    RefPtr<Stream> stream = m_streams.get(streamID);
+    if (!stream)
+        return;
+
+    stream->continueLoad();
+}
+
 void PluginView::cancelManualStreamLoad()
 {
     if (!frame())

Modified: branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/PluginView.h (188075 => 188076)


--- branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/PluginView.h	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Source/WebKit2/WebProcess/Plugins/PluginView.h	2015-08-06 23:09:38 UTC (rev 188076)
@@ -196,6 +196,7 @@
     virtual String userAgent() override;
     virtual void loadURL(uint64_t requestID, const String& method, const String& urlString, const String& target, const WebCore::HTTPHeaderMap& headerFields, const Vector<uint8_t>& httpBody, bool allowPopups) override;
     virtual void cancelStreamLoad(uint64_t streamID) override;
+    virtual void continueStreamLoad(uint64_t streamID) override;
     virtual void cancelManualStreamLoad() override;
 #if ENABLE(NETSCAPE_PLUGIN_API)
     virtual NPObject* windowScriptNPObject() override;

Modified: branches/safari-601.1-branch/Tools/ChangeLog (188075 => 188076)


--- branches/safari-601.1-branch/Tools/ChangeLog	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Tools/ChangeLog	2015-08-06 23:09:38 UTC (rev 188076)
@@ -1,3 +1,47 @@
+2015-08-06  Dana Burkart  <dburk...@apple.com>
+
+        Merge r187886. rdar://problem/15779101
+
+    2015-08-04  Alexey Proskuryakov  <a...@apple.com>
+
+            Implement NPAPI redirect handling
+            https://bugs.webkit.org/show_bug.cgi?id=138675
+            rdar://problem/15779101
+
+            Patch by Jeffrey Pfau, updated and tweaked by me.
+
+            Reviewed by Anders Carlsson.
+
+            * DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePlugin.vcxproj:
+            * DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePlugin.vcxproj.filters:
+            * DumpRenderTree/DumpRenderTree.xcodeproj/project.pbxproj:
+            * DumpRenderTree/TestNetscapePlugIn/CMakeLists.txt:
+            * DumpRenderTree/TestNetscapePlugIn/PluginTest.cpp:
+            (PluginTest::NPP_URLNotify):
+            (PluginTest::NPP_URLRedirectNotify):
+            (PluginTest::NPP_GetValue):
+            (PluginTest::NPN_GetURLNotify):
+            (PluginTest::NPN_PostURLNotify):
+            (PluginTest::NPN_GetValue):
+            (PluginTest::NPN_ReleaseVariantValue):
+            (PluginTest::NPN_URLRedirectResponse):
+            (PluginTest::NPN_ConvertPoint):
+            * DumpRenderTree/TestNetscapePlugIn/PluginTest.h:
+            * DumpRenderTree/TestNetscapePlugIn/Tests/URLRedirect.cpp: Added.
+            (URLRedirect::URLRedirect):
+            (URLRedirect::ScriptableObject::hasMethod):
+            (URLRedirect::ScriptableObject::get):
+            (URLRedirect::ScriptableObject::serviceAsync):
+            (URLRedirect::ScriptableObject::invoke):
+            (URLRedirect::NPP_GetValue):
+            (URLRedirect::NPP_URLNotify):
+            (URLRedirect::NPP_URLRedirectNotify):
+            * DumpRenderTree/TestNetscapePlugIn/main.cpp:
+            (NP_GetEntryPoints):
+            (NPP_URLNotify):
+            (NPP_URLRedirectNotify):
+            (NPP_GetValue):
+
 2015-07-27  Babak Shafiei  <bshaf...@apple.com>
 
         Merge r187371.

Modified: branches/safari-601.1-branch/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePlugin.vcxproj (188075 => 188076)


--- branches/safari-601.1-branch/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePlugin.vcxproj	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePlugin.vcxproj	2015-08-06 23:09:38 UTC (rev 188076)
@@ -75,6 +75,7 @@
     <ClCompile Include="..\..\TestNetscapePlugIn\Tests\PluginScriptableObjectOverridesAllProperties.cpp" />
     <ClCompile Include="..\..\TestNetscapePlugIn\Tests\PrivateBrowsing.cpp" />
     <ClCompile Include="..\..\TestNetscapePlugIn\Tests\ToStringAndValueOfObject.cpp" />
+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\URLRedirect.cpp" />
     <ClCompile Include="..\..\TestNetscapePlugIn\Tests\win\CallJSThatDestroysPlugin.cpp" />
     <ClCompile Include="..\..\TestNetscapePlugIn\Tests\win\DrawsGradient.cpp" />
     <ClCompile Include="..\..\TestNetscapePlugIn\Tests\win\DumpWindowRect.cpp" />
@@ -234,4 +235,4 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
\ No newline at end of file
+</Project>

Modified: branches/safari-601.1-branch/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePlugin.vcxproj.filters (188075 => 188076)


--- branches/safari-601.1-branch/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePlugin.vcxproj.filters	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Tools/DumpRenderTree/DumpRenderTree.vcxproj/TestNetscapePlugin/TestNetscapePlugin.vcxproj.filters	2015-08-06 23:09:38 UTC (rev 188076)
@@ -71,6 +71,9 @@
     <ClCompile Include="..\..\TestNetscapePlugIn\Tests\ToStringAndValueOfObject.cpp">
       <Filter>Tests</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\TestNetscapePlugIn\Tests\URLRedirect.cpp">
+      <Filter>Tests</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\TestNetscapePlugIn\Tests\win\CallJSThatDestroysPlugin.cpp">
       <Filter>Tests\win</Filter>
     </ClCompile>
@@ -136,4 +139,4 @@
       <Filter>Resources</Filter>
     </ResourceCompile>
   </ItemGroup>
-</Project>
\ No newline at end of file
+</Project>

Modified: branches/safari-601.1-branch/Tools/DumpRenderTree/DumpRenderTree.xcodeproj/project.pbxproj (188075 => 188076)


--- branches/safari-601.1-branch/Tools/DumpRenderTree/DumpRenderTree.xcodeproj/project.pbxproj	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Tools/DumpRenderTree/DumpRenderTree.xcodeproj/project.pbxproj	2015-08-06 23:09:38 UTC (rev 188076)
@@ -24,6 +24,7 @@
 /* End PBXAggregateTarget section */
 
 /* Begin PBXBuildFile section */
+		00F048541A0C3C9A000244DB /* URLRedirect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 00F048531A0C3C9A000244DB /* URLRedirect.cpp */; };
 		0F37A4A711E6628700275F54 /* PluginObjectMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0F37A4A611E6628700275F54 /* PluginObjectMac.mm */; };
 		0F37A4AA11E6629100275F54 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B5A752A108AF5D1F00138E45 /* QuartzCore.framework */; };
 		141BF435096A455900E0753C /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9335435F03D75502008635CE /* WebKit.framework */; };
@@ -200,6 +201,7 @@
 /* End PBXCopyFilesBuildPhase section */
 
 /* Begin PBXFileReference section */
+		00F048531A0C3C9A000244DB /* URLRedirect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = URLRedirect.cpp; sourceTree = "<group>"; };
 		0F37A4A611E6628700275F54 /* PluginObjectMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PluginObjectMac.mm; sourceTree = "<group>"; };
 		141BF233096A44CF00E0753C /* TestNetscapePlugIn.plugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TestNetscapePlugIn.plugin; sourceTree = BUILT_PRODUCTS_DIR; };
 		141BF447096A45C800E0753C /* PluginObject.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PluginObject.h; sourceTree = "<group>"; };
@@ -561,6 +563,7 @@
 				1A1E4296141141C400388758 /* PrivateBrowsing.cpp */,
 				5106803D15CC7B10001A8A23 /* SlowNPPNew.cpp */,
 				1A4CCD4E171375A300981040 /* ToStringAndValueOfObject.cpp */,
+				00F048531A0C3C9A000244DB /* URLRedirect.cpp */,
 			);
 			path = Tests;
 			sourceTree = "<group>";
@@ -924,6 +927,7 @@
 				5106803E15CC7B10001A8A23 /* SlowNPPNew.cpp in Sources */,
 				1A14C8A51406DE0400B254F7 /* SupportsCarbonEventModel.cpp in Sources */,
 				1AC6C84B0D07638600CD3161 /* TestObject.cpp in Sources */,
+				00F048541A0C3C9A000244DB /* URLRedirect.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

Modified: branches/safari-601.1-branch/Tools/DumpRenderTree/TestNetscapePlugIn/CMakeLists.txt (188075 => 188076)


--- branches/safari-601.1-branch/Tools/DumpRenderTree/TestNetscapePlugIn/CMakeLists.txt	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Tools/DumpRenderTree/TestNetscapePlugIn/CMakeLists.txt	2015-08-06 23:09:38 UTC (rev 188076)
@@ -26,6 +26,7 @@
     ${WEBKIT_TESTNETSCAPEPLUGIN_DIR}/Tests/PluginScriptableObjectOverridesAllProperties.cpp
     ${WEBKIT_TESTNETSCAPEPLUGIN_DIR}/Tests/PrivateBrowsing.cpp
     ${WEBKIT_TESTNETSCAPEPLUGIN_DIR}/Tests/ToStringAndValueOfObject.cpp
+    ${WEBKIT_TESTNETSCAPEPLUGIN_DIR}/Tests/URLRedirect.cpp
     ${WEBKIT_TESTNETSCAPEPLUGIN_DIR}/Tests/x11/CallInvalidateRectWithNullNPPArgument.cpp
 )
 

Modified: branches/safari-601.1-branch/Tools/DumpRenderTree/TestNetscapePlugIn/PluginTest.cpp (188075 => 188076)


--- branches/safari-601.1-branch/Tools/DumpRenderTree/TestNetscapePlugIn/PluginTest.cpp	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Tools/DumpRenderTree/TestNetscapePlugIn/PluginTest.cpp	2015-08-06 23:09:38 UTC (rev 188076)
@@ -136,6 +136,11 @@
     return false;
 }
 
+void PluginTest::NPP_URLRedirectNotify(const char*, int32_t, void* notifyData)
+{
+    NPN_URLRedirectResponse(notifyData, true);
+}
+
 NPError PluginTest::NPP_GetValue(NPPVariable variable, void *value)
 {
     // We don't know anything about plug-in values so just return NPERR_GENERIC_ERROR.
@@ -159,6 +164,11 @@
     return browser->geturlnotify(m_npp, url, target, notifyData);
 }
 
+NPError PluginTest::NPN_PostURLNotify(const char *url, const char *target, uint32_t len, const char* buf, NPBool file, void *notifyData)
+{
+    return browser->posturlnotify(m_npp, url, target, len, buf, file, notifyData);
+}
+
 NPError PluginTest::NPN_GetValue(NPNVariable variable, void* value)
 {
     return browser->getvalue(m_npp, variable, value);
@@ -231,6 +241,11 @@
     browser->releasevariantvalue(variant);
 }
 
+void PluginTest::NPN_URLRedirectResponse(void* notifyData, NPBool allow)
+{
+    browser->urlredirectresponse(m_npp, notifyData, allow);
+}
+
 #ifdef XP_MACOSX
 bool PluginTest::NPN_ConvertPoint(double sourceX, double sourceY, NPCoordinateSpace sourceSpace, double *destX, double *destY, NPCoordinateSpace destSpace)
 {

Modified: branches/safari-601.1-branch/Tools/DumpRenderTree/TestNetscapePlugIn/PluginTest.h (188075 => 188076)


--- branches/safari-601.1-branch/Tools/DumpRenderTree/TestNetscapePlugIn/PluginTest.h	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Tools/DumpRenderTree/TestNetscapePlugIn/PluginTest.h	2015-08-06 23:09:38 UTC (rev 188076)
@@ -68,12 +68,14 @@
     
     virtual int16_t NPP_HandleEvent(void* event);
     virtual bool NPP_URLNotify(const char* url, NPReason, void* notifyData);
+    virtual void NPP_URLRedirectNotify(const char* url, int32_t status, void* notifyData);
     virtual NPError NPP_GetValue(NPPVariable, void* value);
     virtual NPError NPP_SetValue(NPNVariable, void *value);
 
     // NPN functions.
     NPError NPN_GetURL(const char* url, const char* target);
     NPError NPN_GetURLNotify(const char* url, const char* target, void* notifyData);
+    NPError NPN_PostURLNotify(const char *url, const char *target, uint32_t len, const char* buf, NPBool file, void *notifyData);
     NPError NPN_GetValue(NPNVariable, void* value);
     void NPN_InvalidateRect(NPRect* invalidRect);
     bool NPN_Invoke(NPObject *, NPIdentifier methodName, const NPVariant *args, uint32_t argCount, NPVariant *result);
@@ -91,6 +93,7 @@
     void NPN_ReleaseObject(NPObject*);
     bool NPN_RemoveProperty(NPObject*, NPIdentifier propertyName);
     void NPN_ReleaseVariantValue(NPVariant*);
+    void NPN_URLRedirectResponse(void* notifyData, NPBool allow);
 
 #ifdef XP_MACOSX
     bool NPN_ConvertPoint(double sourceX, double sourceY, NPCoordinateSpace sourceSpace, double *destX, double *destY, NPCoordinateSpace destSpace);

Added: branches/safari-601.1-branch/Tools/DumpRenderTree/TestNetscapePlugIn/Tests/URLRedirect.cpp (0 => 188076)


--- branches/safari-601.1-branch/Tools/DumpRenderTree/TestNetscapePlugIn/Tests/URLRedirect.cpp	                        (rev 0)
+++ branches/safari-601.1-branch/Tools/DumpRenderTree/TestNetscapePlugIn/Tests/URLRedirect.cpp	2015-08-06 23:09:38 UTC (rev 188076)
@@ -0,0 +1,167 @@
+/*
+ * Copyright (C) 2014 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.
+ */
+
+#include "PluginTest.h"
+
+#include <string.h>
+
+using namespace std;
+
+class URLRedirect : public PluginTest {
+public:
+    URLRedirect(NPP npp, const string& identifier)
+        : PluginTest(npp, identifier)
+    {
+    }
+
+    struct Redirect {
+        int redirectsRemaining;
+        bool async;
+        bool hasFired;
+    };
+
+    std::map<void*, Redirect> redirects;
+
+private:
+    // This is the test object.
+    class TestObject : public Object<TestObject> { };
+
+    // This is the scriptable object. It has a single "testObject" property and an "evaluate" function.
+    class ScriptableObject : public Object<ScriptableObject> {
+    public:
+        bool hasMethod(NPIdentifier methodName)
+        {
+            return identifierIs(methodName, "get") || identifierIs(methodName, "getAsync") || identifierIs(methodName, "serviceAsync");
+        }
+
+        bool get(const NPVariant* args, uint32_t argCount, NPVariant* result, bool async)
+        {
+            if (argCount != 3 || !NPVARIANT_IS_STRING(args[0]) || !(NPVARIANT_IS_BOOLEAN(args[1]) || NPVARIANT_IS_DOUBLE(args[1]) || NPVARIANT_IS_INT32(args[1])) || !NPVARIANT_IS_STRING(args[2]))
+                return false;
+
+            const NPString* notifyString = &NPVARIANT_TO_STRING(args[2]);
+            basic_string<NPUTF8> notify(notifyString->UTF8Characters, notifyString->UTF8Length);
+            NPIdentifier notifyMethod = pluginTest()->NPN_GetStringIdentifier(notify.c_str());
+
+            Redirect& redirect = static_cast<URLRedirect*>(pluginTest())->redirects[reinterpret_cast<void*>(notifyMethod)];
+            if (NPVARIANT_IS_DOUBLE(args[1]))
+                redirect.redirectsRemaining = NPVARIANT_TO_DOUBLE(args[1]);
+            else if (NPVARIANT_IS_INT32(args[1]))
+                redirect.redirectsRemaining = NPVARIANT_TO_INT32(args[1]);
+            else if (NPVARIANT_IS_BOOLEAN(args[1]))
+                redirect.redirectsRemaining = NPVARIANT_TO_BOOLEAN(args[1]);
+            redirect.async = async;
+            redirect.hasFired = true;
+
+            const NPString* urlString = &NPVARIANT_TO_STRING(args[0]);
+            basic_string<NPUTF8> url(urlString->UTF8Characters, urlString->UTF8Length);
+
+            pluginTest()->NPN_GetURLNotify(url.c_str(), 0, reinterpret_cast<void*>(notifyMethod));
+
+            VOID_TO_NPVARIANT(*result);
+            return true;
+        }
+
+        bool serviceAsync(const NPVariant* args, uint32_t argCount, NPVariant* result)
+        {
+            if (argCount)
+                return false;
+
+            NPBool seen = 0;
+            URLRedirect* plugin = static_cast<URLRedirect*>(pluginTest());
+            for (auto& redirect : plugin->redirects) {
+                if (redirect.second.hasFired)
+                    continue;
+                redirect.second.hasFired = true;
+                plugin->NPN_URLRedirectResponse(redirect.first, redirect.second.redirectsRemaining);
+                if (redirect.second.redirectsRemaining)
+                    --redirect.second.redirectsRemaining;
+                seen = 1;
+            }
+
+            BOOLEAN_TO_NPVARIANT(seen, *result);
+            return true;
+        }
+
+        bool invoke(NPIdentifier methodName, const NPVariant* args, uint32_t argCount, NPVariant* result)
+        {
+            if (identifierIs(methodName, "get"))
+                return get(args, argCount, result, false);
+
+            if (identifierIs(methodName, "getAsync"))
+                return get(args, argCount, result, true);
+
+            if (identifierIs(methodName, "serviceAsync"))
+                return serviceAsync(args, argCount, result);
+
+            return false;
+        }
+    };
+
+    virtual NPError NPP_GetValue(NPPVariable variable, void *value)
+    {
+        if (variable != NPPVpluginScriptableNPObject)
+            return NPERR_GENERIC_ERROR;
+
+        *(NPObject**)value = ScriptableObject::create(this);
+
+        return NPERR_NO_ERROR;
+    }
+
+    virtual bool NPP_URLNotify(const char* url, NPReason reason, void* notifyData)
+    {
+        NPVariant args[2];
+
+        NPObject* windowScriptObject;
+        NPN_GetValue(NPNVWindowNPObject, &windowScriptObject);
+
+        NPIdentifier callbackIdentifier = notifyData;
+
+        INT32_TO_NPVARIANT(reason, args[0]);
+        STRINGZ_TO_NPVARIANT(url, args[1]);
+
+        NPVariant browserResult;
+        if (NPN_Invoke(windowScriptObject, callbackIdentifier, args, 2, &browserResult))
+            NPN_ReleaseVariantValue(&browserResult);
+
+        return true;
+    }
+
+    virtual void NPP_URLRedirectNotify(const char*, int32_t, void* notifyData)
+    {
+        Redirect& redirect = redirects[notifyData];
+        if (redirect.async) {
+            redirect.hasFired = false;
+            return;
+        }
+
+        NPN_URLRedirectResponse(notifyData, redirect.redirectsRemaining);
+        if (redirect.redirectsRemaining)
+            --redirect.redirectsRemaining;
+    }
+};
+
+static PluginTest::Register<URLRedirect> urlRedirect("url-redirect");
+

Modified: branches/safari-601.1-branch/Tools/DumpRenderTree/TestNetscapePlugIn/main.cpp (188075 => 188076)


--- branches/safari-601.1-branch/Tools/DumpRenderTree/TestNetscapePlugIn/main.cpp	2015-08-06 23:08:48 UTC (rev 188075)
+++ branches/safari-601.1-branch/Tools/DumpRenderTree/TestNetscapePlugIn/main.cpp	2015-08-06 23:09:38 UTC (rev 188076)
@@ -116,6 +116,7 @@
     pluginFuncs->print = NPP_Print;
     pluginFuncs->event = NPP_HandleEvent;
     pluginFuncs->urlnotify = NPP_URLNotify;
+    pluginFuncs->urlredirectnotify = NPP_URLRedirectNotify;
     pluginFuncs->getvalue = NPP_GetValue;
     pluginFuncs->setvalue = NPP_SetValue;
     
@@ -799,6 +800,12 @@
     handleCallback(obj, url, reason, notifyData);
 }
 
+void NPP_URLRedirectNotify(NPP instance, const char *url, int32_t status, void *notifyData)
+{
+    PluginObject* obj = static_cast<PluginObject*>(instance->pdata);
+    obj->pluginTest->NPP_URLRedirectNotify(url, status, notifyData);
+}
+
 NPError NPP_GetValue(NPP instance, NPPVariable variable, void *value)
 {
 #ifdef XP_UNIX
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to