Fix issue where pgAdmin does not load completely if loaded in an iframe. Fixes #4756

This commit is contained in:
Aditya Toshniwal
2019-09-23 12:55:02 +05:30
committed by Akshay Joshi
parent 82aa2d1819
commit 73dc130908
13 changed files with 83 additions and 68 deletions

View File

@@ -19,3 +19,4 @@ Bug fixes
| `Issue #4199 <https://redmine.postgresql.org/issues/4199>`_ - Ensure that 'ENTER' key in the data filter should not run the query.
| `Issue #4755 <https://redmine.postgresql.org/issues/4755>`_ - Ensure that pgAdmin should work behind reverse proxy if the inbuilt server is used as it is.
| `Issue #4756 <https://redmine.postgresql.org/issues/4756>`_ - Fix issue where pgAdmin does not load completely if loaded in an iframe.

View File

@@ -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');

View File

@@ -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'),

View File

@@ -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 {
$(pgWindow).on('prefchange:'+module, function(event) {
eventHandler(event);
}
});
},

View File

@@ -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;
}

View File

@@ -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');

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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;

View File

@@ -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

View File

@@ -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;

View File

@@ -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);
}
});
},