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

Unified Diff: ios/web/web_state/js/resources/dialog_overrides.js

Issue 1029983002: Upstream ios/web/ JS files (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ios/web/web_state/js/resources/core_dynamic_wk.js ('k') | ios/web/web_state/js/resources/message.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ios/web/web_state/js/resources/dialog_overrides.js
diff --git a/ios/web/web_state/js/resources/dialog_overrides.js b/ios/web/web_state/js/resources/dialog_overrides.js
new file mode 100644
index 0000000000000000000000000000000000000000..d5c582ef51fe60bcf84caf70b8fc2790acf43a85
--- /dev/null
+++ b/ios/web/web_state/js/resources/dialog_overrides.js
@@ -0,0 +1,114 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+goog.provide('__crweb.dialog_overrides');
+
+// Namespace for this module.
+__gCrWeb.dialogOverrides = {};
+
+// Beginning of anonymous object.
+new function() {
+ /*
+ * Install a wrapper around functions displaying dialogs in order to catch
+ * code displaying dialog.
+ *
+ * Since the Javascript on the page may cache the value of those functions
+ * and invoke them later, we must only install the wrapper once and change
+ * their behaviour when required.
+ *
+ * Returns a function that allows changing the value of the two booleans
+ * |suppressDialogs| and |notifyAboutDialogs| that are tested by the wrappers.
+ */
+ var installDialogOverridesMethods = function() {
+ var suppressDialogs = false;
+ var notifyAboutDialogs = false;
+
+ // Returns a wrapper function around |originalDialog|. The wrapper may
+ // suppress the dialog and notify host about show/suppress.
+ var makeDialogWrapper = function(originalDialogGetter) {
+ return function() {
+ if (!suppressDialogs) {
+ if (notifyAboutDialogs) {
+ __gCrWeb.message.invokeOnHost({'command': 'dialog.willShow'});
+ }
+ return originalDialogGetter().apply(null, arguments);
+ } else if (notifyAboutDialogs) {
+ __gCrWeb.message.invokeOnHost({'command': 'dialog.suppressed'});
+ }
+ };
+ };
+
+ // Install wrapper around the following properties of |window|.
+ var wrappedFunctionNames = ['alert', 'confirm', 'prompt', 'open'];
+ var len = wrappedFunctionNames.length;
+ for (var i = 0; i < len; i++) {
+ (function(wrappedFunctionName) {
+ var wrappedDialogMethod = window[wrappedFunctionName];
+ window[wrappedFunctionName] = makeDialogWrapper(
+ function() { return wrappedDialogMethod; });
+ })(wrappedFunctionNames[i]);
+ }
+
+ // Reading or writing to the property 'geolocation' too early breaks
+ // the API. Make a copy of navigator and stub in the required methods
+ // without touching the property. See crbug.com/280818 for more
+ // details.
+ var stubNavigator = {};
+
+ // Copy all properties and functions without touching 'geolocation'.
+ var oldNavigator = navigator;
+ for (var keyName in navigator) {
+ if (keyName !== 'geolocation') {
+ var value = navigator[keyName];
+ if (typeof(value) == 'function') {
+ // Forward functions calls to real navigator.
+ stubNavigator[keyName] = function() {
+ return value.apply(oldNavigator, arguments);
+ }
+ } else {
+ Object['defineProperty'](stubNavigator, keyName, {
+ value: value,
+ configurable: false,
+ writable: false,
+ enumerable: true
+ });
+ }
+ }
+ }
+
+ // Stub in 'geolocation' if necessary, using delayed accessor for the
+ // 'geolocation' property of the original |navigator|.
+ if ('geolocation' in navigator) {
+ var geolocation = {};
+ var geoPropNames = ['getCurrentPosition', 'watchPosition', 'clearWatch'];
+ var len = geoPropNames.length;
+ for (var i = 0; i < len; i++) {
+ (function(geoPropName) {
+ geolocation[geoPropName] = makeDialogWrapper(function() {
+ return function() {
+ return oldNavigator.geolocation[geoPropName].apply(
+ oldNavigator.geolocation, arguments);
+ };
+ });
+ })(geoPropNames[i]);
+ }
+ stubNavigator.geolocation = geolocation;
+ }
+
+ // Install |stubNavigator| as |navigator|.
+ navigator = stubNavigator;
+
+ // Returns the closure allowing to change |suppressDialogs| and
+ // |notifyAboutDialogs| variables.
+ return function(setEnabled, setNotify) {
+ suppressDialogs = setEnabled;
+ notifyAboutDialogs = setNotify;
+ };
+ };
+
+ // Override certain methods that produce dialogs. This needs to be installed
+ // after other window methods overrides.
+ __gCrWeb['setSuppressDialogs'] = installDialogOverridesMethods();
+
+} // End of anonymous object
« no previous file with comments | « ios/web/web_state/js/resources/core_dynamic_wk.js ('k') | ios/web/web_state/js/resources/message.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698