Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(71)

Side by Side Diff: ios/web/web_state/js/resources/dialog_overrides.js

Issue 1806043004: [ios] Refactored dialogs suppression. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Self review Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 goog.provide('__crWeb.dialogOverrides'); 5 goog.provide('__crWeb.dialogOverrides');
6 6
7 goog.require('__crWeb.core'); 7 goog.require('__crWeb.core');
8 8
9 // Namespace for this module.
10 __gCrWeb.dialogOverrides = {}; 9 __gCrWeb.dialogOverrides = {};
11 10
12 // Beginning of anonymous object.
13 (function() { 11 (function() {
14 /* 12 /*
15 * Install a wrapper around functions displaying dialogs in order to catch 13 * Installs a wrapper around geolocation functions displaying dialogs in order
16 * code displaying dialog. 14 * to control their suppression.
17 * 15 *
18 * Since the Javascript on the page may cache the value of those functions 16 * Since the Javascript on the page may cache the value of those functions
19 * and invoke them later, we must only install the wrapper once and change 17 * and invoke them later, we must only install the wrapper once and change
20 * their behaviour when required. 18 * their behaviour when required.
21 * 19 *
22 * Returns a function that allows changing the value of the two booleans 20 * Returns a function that allows changing the value of
23 * |suppressDialogs| and |notifyAboutDialogs| that are tested by the wrappers. 21 * |suppressGeolocationDialogs| that is tested by the wrappers.
24 */ 22 */
25 var installDialogOverridesMethods = function() { 23 var installGeolocationDialogOverridesMethods = function() {
26 var suppressDialogs = false; 24 var suppressGeolocationDialogs = false;
27 var notifyAboutDialogs = false;
28 25
29 // Returns a wrapper function around |originalDialog|. The wrapper may 26 // Returns a wrapper function around original dialog function. The wrapper
30 // suppress the dialog and notify host about show/suppress. 27 // may suppress the dialog and notify host about that.
Jackie Quinn 2016/03/17 17:46:41 Nit: probably could remove "about that"
Eugene But (OOO till 7-30) 2016/03/17 17:53:21 Done.
31 var makeDialogWrapper = function(originalDialogGetter) { 28 var makeDialogWrapper = function(originalDialogGetter) {
32 return function() { 29 return function() {
33 if (!suppressDialogs) { 30 if (suppressGeolocationDialogs) {
31 __gCrWeb.message.invokeOnHost({
32 'command': 'geolocationDialog.suppressed'
33 });
34 } else {
34 return originalDialogGetter().apply(null, arguments); 35 return originalDialogGetter().apply(null, arguments);
35 } else if (notifyAboutDialogs) {
36 __gCrWeb.message.invokeOnHost({'command': 'dialog.suppressed'});
37 } 36 }
38 }; 37 };
39 }; 38 };
40 39
41 // Install wrapper around the following properties of |window|.
42 var wrappedFunctionNames = ['alert', 'confirm', 'prompt', 'open'];
43 var len = wrappedFunctionNames.length;
44 for (var i = 0; i < len; i++) {
45 (function(wrappedFunctionName) {
46 var wrappedDialogMethod = window[wrappedFunctionName];
47 window[wrappedFunctionName] = makeDialogWrapper(
48 function() { return wrappedDialogMethod; });
49 })(wrappedFunctionNames[i]);
50 }
51
52 // Reading or writing to the property 'geolocation' too early breaks 40 // Reading or writing to the property 'geolocation' too early breaks
53 // the API. Make a copy of navigator and stub in the required methods 41 // the API. Make a copy of navigator and stub in the required methods
54 // without touching the property. See crbug.com/280818 for more 42 // without touching the property. See crbug.com/280818 for more
55 // details. 43 // details.
56 var stubNavigator = {}; 44 var stubNavigator = {};
57 45
58 // Copy all properties and functions without touching 'geolocation'. 46 // Copy all properties and functions without touching 'geolocation'.
59 var oldNavigator = navigator; 47 var oldNavigator = navigator;
60 for (var keyName in navigator) { 48 for (var keyName in navigator) {
61 if (keyName !== 'geolocation') { 49 if (keyName !== 'geolocation') {
(...skipping 30 matching lines...) Expand all
92 }); 80 });
93 })(geoPropNames[i]); 81 })(geoPropNames[i]);
94 } 82 }
95 stubNavigator.geolocation = geolocation; 83 stubNavigator.geolocation = geolocation;
96 } 84 }
97 85
98 // Install |stubNavigator| as |navigator|. 86 // Install |stubNavigator| as |navigator|.
99 /** @suppress {const} */ 87 /** @suppress {const} */
100 navigator = stubNavigator; 88 navigator = stubNavigator;
101 89
102 // Returns the closure allowing to change |suppressDialogs| and 90 // Returns the closure allowing to change |suppressGeolocationDialogs|.
103 // |notifyAboutDialogs| variables. 91 return function(setEnabled) {
104 return function(setEnabled, setNotify) { 92 suppressGeolocationDialogs = setEnabled;
105 suppressDialogs = setEnabled;
106 notifyAboutDialogs = setNotify;
107 }; 93 };
108 }; 94 };
109 95
110 // Override certain methods that produce dialogs. This needs to be installed 96 // Override geolocation methods that produce dialogs.
111 // after other window methods overrides. 97 __gCrWeb['setSuppressGeolocationDialogs'] =
112 __gCrWeb['setSuppressDialogs'] = installDialogOverridesMethods(); 98 installGeolocationDialogOverridesMethods();
113 99
114 }()); // End of anonymous object 100 }()); // End of anonymous object
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698