Browse Source

feat: add <webview> 'did-redirect-navigation' event (#30457)

Milan Burda 3 years ago
parent
commit
aad1c0d493
3 changed files with 53 additions and 0 deletions
  1. 13 0
      docs/api/webview-tag.md
  2. 1 0
      lib/common/web-view-events.ts
  3. 39 0
      spec/webview-spec.js

+ 13 - 0
docs/api/webview-tag.md

@@ -847,6 +847,19 @@ Returns:
 Emitted when any frame (including main) starts navigating. `isInPlace` will be
 `true` for in-page navigations.
 
+### Event: 'did-redirect-navigation'
+
+Returns:
+
+* `url` String
+* `isInPlace` Boolean
+* `isMainFrame` Boolean
+* `frameProcessId` Integer
+* `frameRoutingId` Integer
+
+Emitted after a server side redirect occurs during navigation. For example a 302
+redirect.
+
 ### Event: 'did-navigate'
 
 Returns:

+ 1 - 0
lib/common/web-view-events.ts

@@ -14,6 +14,7 @@ export const webViewEvents: Record<string, readonly string[]> = {
   'devtools-focused': [],
   'will-navigate': ['url'],
   'did-start-navigation': ['url', 'isInPlace', 'isMainFrame', 'frameProcessId', 'frameRoutingId'],
+  'did-redirect-navigation': ['url', 'isInPlace', 'isMainFrame', 'frameProcessId', 'frameRoutingId'],
   'did-navigate': ['url', 'httpResponseCode', 'httpStatusText'],
   'did-frame-navigate': ['url', 'httpResponseCode', 'httpStatusText', 'isMainFrame', 'frameProcessId', 'frameRoutingId'],
   'did-navigate-in-page': ['url', 'isMainFrame', 'frameProcessId', 'frameRoutingId'],

+ 39 - 0
spec/webview-spec.js

@@ -564,6 +564,45 @@ describe('<webview> tag', function () {
     });
   });
 
+  describe('did-redirect-navigation event', () => {
+    let server = null;
+    let uri = null;
+
+    before((done) => {
+      server = http.createServer((req, res) => {
+        if (req.url === '/302') {
+          res.setHeader('Location', '/200');
+          res.statusCode = 302;
+          res.end();
+        } else {
+          res.end();
+        }
+      });
+      server.listen(0, '127.0.0.1', () => {
+        uri = `http://127.0.0.1:${(server.address()).port}`;
+        done();
+      });
+    });
+
+    after(() => {
+      server.close();
+    });
+
+    it('is emitted on redirects', async () => {
+      loadWebView(webview, {
+        src: `${uri}/302`
+      });
+
+      const event = await waitForEvent(webview, 'did-redirect-navigation');
+
+      expect(event.url).to.equal(`${uri}/200`);
+      expect(event.isInPlace).to.be.false();
+      expect(event.isMainFrame).to.be.true();
+      expect(event.frameProcessId).to.be.a('number');
+      expect(event.frameRoutingId).to.be.a('number');
+    });
+  });
+
   describe('will-navigate event', () => {
     it('emits when a url that leads to oustide of the page is clicked', async () => {
       loadWebView(webview, {