From 39d9079cd60c57db7c588256c244b7d08361dc03 Mon Sep 17 00:00:00 2001 From: "fsamuel@chromium.org" Date: Thu, 29 Aug 2013 05:12:27 +0000 Subject: : Removing a should not remove all WebRequest event listeners Only WebRequest event listeners on the being destroyed should lose its listeners in the browser process. Add a routing ID parameter to ExtensionWebRequestEventRouter::RemoveWebViewEventListeners so that it only removes the webrequest event listeners of the WebContents being destroyed. BUG=280468 Test=WebViewInteractiveTest.NewWindow_WebRequestRemoveElement Review URL: https://chromiumcodereview.appspot.com/23640008 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@220209 0039d316-1c4b-4281-b951-d872f2087c98 --- .../platform_apps/web_view/newwindow/embedder.js | 77 +++++++++++++++++----- .../web_view/newwindow/newwindow.html | 10 +++ 2 files changed, 70 insertions(+), 17 deletions(-) create mode 100644 chrome/test/data/extensions/platform_apps/web_view/newwindow/newwindow.html (limited to 'chrome/test') diff --git a/chrome/test/data/extensions/platform_apps/web_view/newwindow/embedder.js b/chrome/test/data/extensions/platform_apps/web_view/newwindow/embedder.js index ce32602..7a5fb27 100644 --- a/chrome/test/data/extensions/platform_apps/web_view/newwindow/embedder.js +++ b/chrome/test/data/extensions/platform_apps/web_view/newwindow/embedder.js @@ -279,33 +279,74 @@ function testNewWindowExecuteScript() { }; function testNewWindowWebRequest() { - var testName = 'testNewWindowExecuteScript'; + var testName = 'testNewWindowWebRequest'; var webview = embedder.setUpGuest_('foobar'); var onNewWindow = function(e) { chrome.test.log('Embedder notified on newwindow'); embedder.assertCorrectEvent_(e, ''); - var newwebview = document.createElement('webview'); - document.querySelector('#webview-tag-container').appendChild(newwebview); + var newwebview = new WebView(); var calledWebRequestEvent = false; + newwebview.request.onBeforeRequest.addListener(function(e) { + if (!calledWebRequestEvent) { + calledWebRequestEvent = true; + embedder.test.succeed(); + } + }, {urls: ['']}); + document.querySelector('#webview-tag-container').appendChild(newwebview); e.preventDefault(); - // The WebRequest API is not exposed until the MutationObserver - // picks up the in the DOM. Thus, we cannot immediately access - // WebRequest API. - window.setTimeout(function() { - newwebview.onBeforeRequest.addListener(function(e) { + try { + e.window.attach(newwebview); + } catch (e) { + embedder.test.fail(); + } + }; + webview.addEventListener('newwindow', onNewWindow); + + // Load a new window with the given name. + embedder.setUpNewWindowRequest_(webview, 'guest.html', '', testName); +}; + +function testNewWindowWebRequestRemoveElement() { + var testName = 'testNewWindowWebRequestRemoveElement'; + var dataUrl = 'data:text/html,foobar'; + var webview = embedder.setUpGuest_('foobar'); + var calledWebRequestEvent = false; + webview.request.onBeforeRequest.addListener(function(e) { + if (e.url == embedder.guestURL && calledWebRequestEvent) { + embedder.test.succeed(); + } + }, {urls: ['']}); + + var onNewWindow = function(e) { + chrome.test.log('Embedder notified on newwindow'); + embedder.assertCorrectEvent_(e, ''); + + e.preventDefault(); + chrome.app.window.create('newwindow.html', { + width: 640, + height: 480 + }, function(newwindow) { + newwindow.contentWindow.onload = function(evt) { + var newwebview = + newwindow.contentWindow.document.querySelector('webview'); + newwebview.request.onBeforeRequest.addListener(function(e) { if (!calledWebRequestEvent) { calledWebRequestEvent = true; - embedder.test.succeed(); + newwebview.parentElement.removeChild(newwebview); + setTimeout(function() { + webview.src = embedder.guestURL; + }, 0); } - }, { urls: [''] }, ['blocking']); - try { - e.window.attach(newwebview); - } catch (e) { - embedder.test.fail(); - } - }, 0); + }, {urls: ['']}); + try { + e.window.attach(newwebview); + } catch (e) { + embedder.test.fail(); + } + }; + }); }; webview.addEventListener('newwindow', onNewWindow); @@ -313,6 +354,7 @@ function testNewWindowWebRequest() { embedder.setUpNewWindowRequest_(webview, 'guest.html', '', testName); }; + embedder.test.testList = { 'testNewWindowNameTakesPrecedence': testNewWindowNameTakesPrecedence, 'testWebViewNameTakesPrecedence': testWebViewNameTakesPrecedence, @@ -320,7 +362,8 @@ embedder.test.testList = { 'testNewWindowRedirect': testNewWindowRedirect, 'testNewWindowClose': testNewWindowClose, 'testNewWindowExecuteScript': testNewWindowExecuteScript, - 'testNewWindowWebRequest': testNewWindowWebRequest + 'testNewWindowWebRequest': testNewWindowWebRequest, + 'testNewWindowWebRequestRemoveElement': testNewWindowWebRequestRemoveElement }; onload = function() { diff --git a/chrome/test/data/extensions/platform_apps/web_view/newwindow/newwindow.html b/chrome/test/data/extensions/platform_apps/web_view/newwindow/newwindow.html new file mode 100644 index 0000000..5c6b9de --- /dev/null +++ b/chrome/test/data/extensions/platform_apps/web_view/newwindow/newwindow.html @@ -0,0 +1,10 @@ + + + + + + -- cgit v1.1