diff --git a/web/pgadmin/browser/static/js/browser.js b/web/pgadmin/browser/static/js/browser.js index 38252887..f492a1f5 100644 --- a/web/pgadmin/browser/static/js/browser.js +++ b/web/pgadmin/browser/static/js/browser.js @@ -12,7 +12,7 @@ define('pgadmin.browser', [ 'sources/gettext', 'sources/url_for', 'require', 'jquery', 'underscore', 'underscore.string', 'bootstrap', 'sources/pgadmin', 'pgadmin.alertifyjs', 'bundled_codemirror', 'sources/check_node_visibility', './toolbar', 'pgadmin.help', - 'sources/csrf', 'sources/utils', 'pgadmin.browser.utils', + 'sources/csrf', 'sources/utils', 'sources/window', 'pgadmin.browser.utils', 'wcdocker', 'jquery.contextmenu', 'jquery.aciplugin', 'jquery.acitree', 'pgadmin.browser.preferences', 'pgadmin.browser.messages', 'pgadmin.browser.menu', 'pgadmin.browser.panel', 'pgadmin.browser.layout', @@ -24,7 +24,7 @@ define('pgadmin.browser', [ tree, gettext, url_for, require, $, _, S, Bootstrap, pgAdmin, Alertify, codemirror, - checkNodeVisibility, toolBar, help, csrfToken, pgadminUtils, + checkNodeVisibility, toolBar, help, csrfToken, pgadminUtils, pgWindow ) { window.jQuery = window.$ = $; // Some scripts do export their object in the window only. @@ -714,8 +714,7 @@ define('pgadmin.browser', [ bind_beforeunload: function() { $(window).on('beforeunload', function(e) { /* Can open you in new tab */ - let openerBrowser = window.opener ? - window.opener.pgAdmin.Browser : window.top.pgAdmin.Browser; + let openerBrowser = pgWindow.default.pgAdmin.Browser; let tree_save_interval = pgBrowser.get_preference('browser', 'browser_tree_state_save_interval'), confirm_on_refresh_close = openerBrowser.get_preference('browser', 'confirm_on_refresh_close'); diff --git a/web/pgadmin/browser/static/js/layout.js b/web/pgadmin/browser/static/js/layout.js index a4aaa0e7..36669783 100644 --- a/web/pgadmin/browser/static/js/layout.js +++ b/web/pgadmin/browser/static/js/layout.js @@ -13,6 +13,7 @@ import $ from 'jquery'; import * as Alertify from 'pgadmin.alertifyjs'; import gettext from 'sources/gettext'; import 'wcdocker'; +import pgWindow from 'sources/window'; const pgBrowser = pgAdmin.Browser = pgAdmin.Browser || {}; @@ -74,8 +75,7 @@ _.extend(pgBrowser, { } /* preference available only with top/opener browser. */ - let browser = window.opener ? - window.opener.pgAdmin.Browser : window.top.pgAdmin.Browser; + let browser = pgWindow.pgAdmin.Browser; /* interval required initially as preference load may take time */ let cacheIntervalId = setInterval(()=> { @@ -93,8 +93,7 @@ _.extend(pgBrowser, { }, reflectLocklayoutChange: function(docker) { - let browser = window.opener ? - window.opener.pgAdmin.Browser : window.top.pgAdmin.Browser; + let browser = pgWindow.pgAdmin.Browser; let browserPref = browser.get_preferences_for_module('browser'); browser.lock_layout(docker, browserPref.lock_layout); @@ -125,8 +124,7 @@ _.extend(pgBrowser, { }, save_lock_layout: function(op) { - let browser = window.opener ? - window.opener.pgAdmin.Browser : window.top.pgAdmin.Browser; + let browser = pgWindow.pgAdmin.Browser; $.ajax({ url: url_for('browser.lock_layout'), diff --git a/web/pgadmin/browser/static/js/preferences.js b/web/pgadmin/browser/static/js/preferences.js index 680d18f4..00f566fc 100644 --- a/web/pgadmin/browser/static/js/preferences.js +++ b/web/pgadmin/browser/static/js/preferences.js @@ -12,6 +12,7 @@ import url_for from 'sources/url_for'; import $ from 'jquery'; import * as Alertify from 'pgadmin.alertifyjs'; import * as SqlEditorUtils from 'sources/sqleditor_utils'; +import pgWindow from 'sources/window'; var modifyAnimation = require('sources/modify_animation'); @@ -148,16 +149,8 @@ _.extend(pgBrowser, { }, onPreferencesChange: function(module, eventHandler) { - window.parent.$(parent.document).on('prefchange:'+module, function(event) { - /* If a sqleditor is closed, event handler will be called - * but the window.top will be null. Unbind the event handler - */ - if(window.top === null) { - window.$(document).off(event); - } - else { - eventHandler(event); - } + $(pgWindow).on('prefchange:'+module, function(event) { + eventHandler(event); }); }, diff --git a/web/pgadmin/dashboard/static/js/dashboard.js b/web/pgadmin/dashboard/static/js/dashboard.js index 77572618..39132dd5 100644 --- a/web/pgadmin/dashboard/static/js/dashboard.js +++ b/web/pgadmin/dashboard/static/js/dashboard.js @@ -11,10 +11,10 @@ define('pgadmin.dashboard', [ 'sources/url_for', 'sources/gettext', 'require', 'jquery', 'underscore', 'sources/pgadmin', 'backbone', 'backgrid', './charting', 'pgadmin.alertifyjs', 'pgadmin.backform', 'sources/nodes/dashboard', - 'sources/utils', 'pgadmin.browser', 'bootstrap', 'wcdocker', + 'sources/utils', 'sources/window', 'pgadmin.browser', 'bootstrap', 'wcdocker', ], function( url_for, gettext, r, $, _, pgAdmin, Backbone, Backgrid, charting, - Alertify, Backform, NodesDashboard, commonUtils + Alertify, Backform, NodesDashboard, commonUtils, pgWindow ) { pgAdmin.Browser = pgAdmin.Browser || {}; @@ -770,7 +770,7 @@ define('pgadmin.dashboard', [ */ let cacheIntervalId = setInterval(function() { try { - if(window.top.pgAdmin.Browser.preference_version() > 0) { + if(pgWindow.default.pgAdmin.Browser.preference_version() > 0) { clearInterval(cacheIntervalId); self.reflectPreferences(); } @@ -794,10 +794,10 @@ define('pgadmin.dashboard', [ /* We will use old preferences for selective graph updates on preference change */ if(self.preferences) { self.old_preferences = self.preferences; - self.preferences = window.top.pgAdmin.Browser.get_preferences_for_module('dashboards'); + self.preferences = pgWindow.default.pgAdmin.Browser.get_preferences_for_module('dashboards'); } else { - self.preferences = window.top.pgAdmin.Browser.get_preferences_for_module('dashboards'); + self.preferences = pgWindow.default.pgAdmin.Browser.get_preferences_for_module('dashboards'); self.old_preferences = self.preferences; } diff --git a/web/pgadmin/static/js/backform.pgadmin.js b/web/pgadmin/static/js/backform.pgadmin.js index 33d264ab..559a4dd5 100644 --- a/web/pgadmin/static/js/backform.pgadmin.js +++ b/web/pgadmin/static/js/backform.pgadmin.js @@ -10,10 +10,10 @@ define([ 'sources/gettext', 'underscore', 'underscore.string', 'jquery', 'backbone', 'backform', 'backgrid', 'codemirror', 'sources/sqleditor_utils', - 'sources/keyboard_shortcuts', + 'sources/keyboard_shortcuts', 'sources/window', 'spectrum', 'pgadmin.backgrid', 'select2', 'bootstrap.toggle', ], function(gettext, _, S, $, Backbone, Backform, Backgrid, CodeMirror, - SqlEditorUtils, keyboardShortcuts) { + SqlEditorUtils, keyboardShortcuts, pgWindow) { var pgAdmin = (window.pgAdmin = window.pgAdmin || {}), pgBrowser = pgAdmin.Browser; @@ -1303,7 +1303,7 @@ define([ let tmp_browser = pgBrowser; if (pgBrowser.preferences_cache.length == 0) - tmp_browser = window.opener ? window.opener.pgAdmin.Browser : window.top.pgAdmin.Browser; + tmp_browser = pgWindow.default.pgAdmin.Browser; let preferences = tmp_browser.get_preferences_for_module('browser'); @@ -1602,7 +1602,7 @@ define([ let tmp_browser = pgBrowser; if (pgBrowser.preferences_cache.length == 0) - tmp_browser = window.opener ? window.opener.pgAdmin.Browser : window.top.pgAdmin.Browser; + tmp_browser = pgWindow.default.pgAdmin.Browser; let preferences = tmp_browser.get_preferences_for_module('browser'); @@ -2383,8 +2383,7 @@ define([ /* This control is used by filter dialog in query editor, so taking preferences from window * SQL Editor can be in different tab */ - let browser = window.opener ? - window.opener.pgAdmin.Browser : window.top.pgAdmin.Browser; + let browser = pgWindow.default.pgAdmin.Browser; let sqlEditPreferences = browser.get_preferences_for_module('sqleditor'); diff --git a/web/pgadmin/static/js/modify_animation.js b/web/pgadmin/static/js/modify_animation.js index 420c9433..8852ecd0 100644 --- a/web/pgadmin/static/js/modify_animation.js +++ b/web/pgadmin/static/js/modify_animation.js @@ -9,13 +9,10 @@ import $ from 'jquery'; import _ from 'underscore'; +import pgWindow from 'sources/window'; function getBrowserInstance() { - if (!_.isUndefined(window.opener) && !_.isNull(window.opener)) { - return window.opener.pgAdmin.Browser; - } else { - return window.parent.pgAdmin.Browser; - } + return pgWindow.pgAdmin.Browser; } function modifyAcitreeAnimation(pgBrowser, tree) { diff --git a/web/pgadmin/static/js/selection/xcell_selection_model.js b/web/pgadmin/static/js/selection/xcell_selection_model.js index 9a9a66f3..cfb7bded 100644 --- a/web/pgadmin/static/js/selection/xcell_selection_model.js +++ b/web/pgadmin/static/js/selection/xcell_selection_model.js @@ -11,9 +11,9 @@ define([ 'jquery', 'underscore', 'sources/selection/range_selection_helper', - + 'sources/window', 'slickgrid', -], function ($, _, RangeSelectionHelper) { +], function ($, _, RangeSelectionHelper, pgWindow) { var XCellSelectionModel = function (options) { var KEY_ARROW_RIGHT = 39; @@ -50,7 +50,7 @@ define([ grid.registerPlugin(_selector); _selector.onCellRangeSelected.subscribe(handleCellRangeSelected); _selector.onBeforeCellRangeSelected.subscribe(handleBeforeCellRangeSelected); - $(window.parent).on('mouseup',handleWindowMouseUp); + $(pgWindow.default).on('mouseup',handleWindowMouseUp); } function destroy() { @@ -59,7 +59,7 @@ define([ _selector.onCellRangeSelected.unsubscribe(handleCellRangeSelected); _selector.onBeforeCellRangeSelected.unsubscribe(handleBeforeCellRangeSelected); _grid.unregisterPlugin(_selector); - $(window.parent).off('mouseup', handleWindowMouseUp); + $(pgWindow.default).off('mouseup', handleWindowMouseUp); } function removeInvalidRanges(ranges) { diff --git a/web/pgadmin/static/js/sqleditor/query_tool_actions.js b/web/pgadmin/static/js/sqleditor/query_tool_actions.js index 34b6827a..c804ff45 100644 --- a/web/pgadmin/static/js/sqleditor/query_tool_actions.js +++ b/web/pgadmin/static/js/sqleditor/query_tool_actions.js @@ -8,6 +8,7 @@ ////////////////////////////////////////////////////////////// import $ from 'jquery'; +import pgWindow from 'sources/window'; let queryToolActions = { _verbose: function () { @@ -124,7 +125,7 @@ let queryToolActions = { focusOut: function () { document.activeElement.blur(); - window.top.document.activeElement.blur(); + pgWindow.document.activeElement.blur(); }, toggleCaseOfSelectedText: function (sqlEditorController) { diff --git a/web/pgadmin/static/js/window.js b/web/pgadmin/static/js/window.js new file mode 100644 index 00000000..5969b93a --- /dev/null +++ b/web/pgadmin/static/js/window.js @@ -0,0 +1,28 @@ +///////////////////////////////////////////////////////////// +// +// pgAdmin 4 - PostgreSQL Tools +// +// Copyright (C) 2013 - 2019, The pgAdmin Development Team +// This software is released under the PostgreSQL Licence +// +////////////////////////////////////////////////////////////// + +let pgWindow = function() { + let pgWindow = null; + try { + if(window.opener && window.opener.pgAdmin) { + pgWindow = window.opener; + } else if(window.parent && window.parent.pgAdmin){ + pgWindow = window.parent; + } else if(window.top && window.top.pgAdmin){ + pgWindow = window.top; + } else { + pgWindow = window; + } + } catch (error) { + pgWindow = window; + } + return pgWindow; +}(); + +export default pgWindow; diff --git a/web/pgadmin/tools/debugger/static/js/debugger_ui.js b/web/pgadmin/tools/debugger/static/js/debugger_ui.js index f05a22dc..4c95d7c1 100644 --- a/web/pgadmin/tools/debugger/static/js/debugger_ui.js +++ b/web/pgadmin/tools/debugger/static/js/debugger_ui.js @@ -10,9 +10,9 @@ define([ 'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'backbone', 'pgadmin.alertifyjs', 'sources/pgadmin', 'pgadmin.browser', - 'pgadmin.backgrid', 'wcdocker', + 'pgadmin.backgrid', 'sources/window', 'wcdocker', ], function( - gettext, url_for, $, _, Backbone, Alertify, pgAdmin, pgBrowser, Backgrid + gettext, url_for, $, _, Backbone, Alertify, pgAdmin, pgBrowser, Backgrid, pgWindow ) { var wcDocker = window.wcDocker; @@ -168,7 +168,7 @@ define([ Alertify.dialog('debuggerInputArgsDialog', function factory() { return { main: function(title, debug_info, restart_debug, is_edb_proc, trans_id) { - this.preferences = window.top.pgAdmin.Browser.get_preferences_for_module('debugger'); + this.preferences = pgWindow.default.pgAdmin.Browser.get_preferences_for_module('debugger'); this.set('title', title); // setting value in alertify settings allows us to access it from diff --git a/web/pgadmin/tools/debugger/static/js/direct.js b/web/pgadmin/tools/debugger/static/js/direct.js index b7ee19c8..96a0eaa5 100644 --- a/web/pgadmin/tools/debugger/static/js/direct.js +++ b/web/pgadmin/tools/debugger/static/js/direct.js @@ -12,10 +12,11 @@ define([ 'pgadmin.alertifyjs', 'sources/pgadmin', 'pgadmin.browser', 'backbone', 'pgadmin.backgrid', 'pgadmin.backform', 'sources/../bundle/codemirror', 'pgadmin.tools.debugger.ui', 'sources/keyboard_shortcuts', - 'pgadmin.tools.debugger.utils', 'wcdocker', + 'pgadmin.tools.debugger.utils', 'sources/window', 'wcdocker', ], function( gettext, url_for, $, _, Alertify, pgAdmin, pgBrowser, Backbone, Backgrid, - Backform, codemirror, debug_function_again, keyboardShortcuts, debuggerUtils + Backform, codemirror, debug_function_again, keyboardShortcuts, debuggerUtils, + pgWindow ) { var CodeMirror = codemirror.default, @@ -1525,8 +1526,7 @@ define([ this.function_name_with_arguments = function_name_with_arguments; this.layout = layout; - let browser = window.opener ? - window.opener.pgAdmin.Browser : window.top.pgAdmin.Browser; + let browser = pgWindow.default.pgAdmin.Browser; this.preferences = browser.get_preferences_for_module('debugger'); this.docker = new wcDocker( @@ -1835,7 +1835,7 @@ define([ let cacheIntervalId = setInterval(function() { try { - let browser = window.opener ? window.opener.pgAdmin.Browser : window.top.pgAdmin.Browser; + let browser = pgWindow.default.pgAdmin.Browser; if(browser.preference_version() > 0) { clearInterval(cacheIntervalId); self.reflectPreferences(); @@ -1846,7 +1846,7 @@ define([ if(self.preferences.debugger_new_browser_tab) { pgBrowser.bind_beforeunload(); let pollIntervalId = setInterval(()=>{ - if(window.opener && window.opener.pgAdmin) { + if(pgWindow.default.pgAdmin) { self.reflectPreferences(); } else { @@ -1888,13 +1888,13 @@ define([ /* Register for preference changed event broadcasted in parent * to reload the shorcuts. */ - pgBrowser.onPreferencesChange('debugger', function() { + pgWindow.default.pgAdmin.Browser.onPreferencesChange('debugger', function() { self.reflectPreferences(); }); }, reflectPreferences: function() { let self = this, - browser = window.opener ? window.opener.pgAdmin.Browser : window.top.pgAdmin.Browser; + browser = pgWindow.default.pgAdmin.Browser; self.preferences = browser.get_preferences_for_module('debugger'); self.toolbarView.preferences = self.preferences; diff --git a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js index 37d15a9c..3f082b77 100644 --- a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js +++ b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js @@ -38,6 +38,7 @@ define('tools.querytool', [ 'sources/sqleditor/query_tool_preferences', 'sources/csrf', 'tools/datagrid/static/js/datagrid_panel_title', + 'sources/window', 'sources/../bundle/slickgrid', 'pgadmin.file_manager', 'backgrid.sizeable.columns', @@ -52,7 +53,8 @@ define('tools.querytool', [ XCellSelectionModel, setStagedRows, SqlEditorUtils, ExecuteQuery, httpErrorHandler, FilterHandler, GeometryViewer, historyColl, queryHist, querySources, keyboardShortcuts, queryToolActions, queryToolNotifications, Datagrid, - modifyAnimation, calculateQueryRunTime, callRenderAfterPoll, queryToolPref, csrfToken, panelTitleFunc) { + modifyAnimation, calculateQueryRunTime, callRenderAfterPoll, queryToolPref, csrfToken, panelTitleFunc, + pgWindow) { /* Return back, this has been called more than once */ if (pgAdmin.SqlEditor) return pgAdmin.SqlEditor; @@ -77,8 +79,7 @@ define('tools.querytool', [ this.$el = opts.el; this.handler = opts.handler; this.handler['col_size'] = {}; - let browser = window.opener ? - window.opener.pgAdmin.Browser : window.top.pgAdmin.Browser; + let browser = pgWindow.default.pgAdmin.Browser; this.preferences = browser.get_preferences_for_module('sqleditor'); this.handler.preferences = this.preferences; this.connIntervalId = null; @@ -142,10 +143,9 @@ define('tools.querytool', [ reflectPreferences: function() { let self = this, - browser = window.opener ? - window.opener.pgAdmin.Browser : window.top.pgAdmin.Browser; + browser = pgWindow.default.pgAdmin.Browser; - /* pgBrowser is different obj from window.top.pgAdmin.Browser + /* pgBrowser is different obj from pgWindow.default.pgAdmin.Browser * Make sure to get only the latest update. Older versions will be discarded * if function is called by older events. * This works for new tab sql editor also as it polls if latest version available @@ -405,7 +405,7 @@ define('tools.querytool', [ if (!self.preferences.new_browser_tab) { // Listen on the panel closed event and notify user to save modifications. - _.each(window.top.pgAdmin.Browser.docker.findPanels('frm_datagrid'), function(p) { + _.each(pgWindow.default.pgAdmin.Browser.docker.findPanels('frm_datagrid'), function(p) { if (p.isVisible()) { p.on(wcDocker.EVENT.CLOSING, function() { return self.handler.check_needed_confirmations_before_closing_panel(true); @@ -635,7 +635,7 @@ define('tools.querytool', [ * to reload the shorcuts. As sqleditor is in iFrame of wcDocker * window parent is referred */ - pgBrowser.onPreferencesChange('sqleditor', function() { + pgWindow.default.pgAdmin.Browser.onPreferencesChange('sqleditor', function() { self.reflectPreferences(); }); @@ -645,7 +645,7 @@ define('tools.querytool', [ if(self.preferences.new_browser_tab) { pgBrowser.bind_beforeunload(); setInterval(()=>{ - if(window.opener.pgAdmin) { + if(pgWindow.default.pgAdmin) { self.reflectPreferences(); } }, 1000); @@ -3270,7 +3270,7 @@ define('tools.querytool', [ if (self.preferences.new_browser_tab) { window.document.title = title; } else { - _.each(window.top.pgAdmin.Browser.docker.findPanels('frm_datagrid'), function(p) { + _.each(pgWindow.default.pgAdmin.Browser.docker.findPanels('frm_datagrid'), function(p) { if (p.isVisible()) { panelTitleFunc.setQueryToolDockerTitle(p, self.is_query_tool, title, is_file); } @@ -3431,7 +3431,7 @@ define('tools.querytool', [ title = window.document.title + ' *'; } else { // Find the title of the visible panel - _.each(window.top.pgAdmin.Browser.docker.findPanels('frm_datagrid'), function(p) { + _.each(pgWindow.default.pgAdmin.Browser.docker.findPanels('frm_datagrid'), function(p) { if (p.isVisible()) { self.gridView.panel_title = $(p._title).text(); } @@ -3993,8 +3993,7 @@ define('tools.querytool', [ }, call_cache_preferences: function() { - let browser = window.opener ? - window.opener.pgAdmin.Browser : window.top.pgAdmin.Browser; + let browser = pgWindow.default.pgAdmin.Browser; browser.cache_preferences('sqleditor'); /* This will make sure to get latest updates only and not older events */ @@ -4312,7 +4311,7 @@ define('tools.querytool', [ var self = this; pgBrowser.Events.off('pgadmin:user:logged-in', this.initTransaction); - _.each(window.top.pgAdmin.Browser.docker.findPanels('frm_datagrid'), function(panel) { + _.each(pgWindow.default.pgAdmin.Browser.docker.findPanels('frm_datagrid'), function(panel) { if (panel.isVisible()) { window.onbeforeunload = null; panel.off(wcDocker.EVENT.CLOSING); @@ -4320,7 +4319,7 @@ define('tools.querytool', [ if (!_.isUndefined(self.col_size)) { delete self.col_size; } - window.top.pgAdmin.Browser.docker.removePanel(panel); + pgWindow.default.pgAdmin.Browser.docker.removePanel(panel); } }); },