From 5ef8911af931c588864a7cdcc0bdfed1de5fe493 Mon Sep 17 00:00:00 2001
From: Dries Buytaert <dries@buytaert.net>
Date: Thu, 8 Jul 2010 12:20:23 +0000
Subject: [PATCH] =?UTF-8?q?-=20Patch=20#655722=20by=20ksenzee,=20casey,=20?=
 =?UTF-8?q?G=C3=A1bor=20Hojtsy,=20bleen18,=20David=5FRothstein:=20changes?=
 =?UTF-8?q?=20made=20in=20an=20overlay=20session=20are=20not=20reflected?=
 =?UTF-8?q?=20when=20the=20user=20closes=20the=20overlay.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 modules/overlay/overlay-child.js  | 10 +++++++--
 modules/overlay/overlay-parent.js | 20 ++++++++++++++++--
 modules/overlay/overlay.module    | 34 +++++++++++++++++++++++--------
 3 files changed, 52 insertions(+), 12 deletions(-)

diff --git a/modules/overlay/overlay-child.js b/modules/overlay/overlay-child.js
index f89645b97025..d0e4b8df8685 100644
--- a/modules/overlay/overlay-child.js
+++ b/modules/overlay/overlay-child.js
@@ -20,8 +20,14 @@ Drupal.behaviors.overlayChild = {
 
     var settings = settings.overlayChild || {};
 
+    // If the entire parent window should be refreshed when the overlay is
+    // closed, pass that information to the parent window.
+    if (settings.refreshPage) {
+      parent.Drupal.overlay.refreshPage = true;
+    }
+
     // If a form has been submitted successfully, then the server side script
-    // may have decided to tell us the parent window to close the popup dialog.
+    // may have decided to tell the parent window to close the popup dialog.
     if (settings.closeOverlay) {
       parent.Drupal.overlay.bindChild(window, true);
       // Use setTimeout to close the child window from a separate thread,
@@ -38,7 +44,7 @@ Drupal.behaviors.overlayChild = {
     }
 
     // If one of the regions displaying outside the overlay needs to be
-    // reloaded, let the parent window know.
+    // reloaded immediately, let the parent window know.
     if (settings.refreshRegions) {
       parent.Drupal.overlay.refreshRegions(settings.refreshRegions);
     }
diff --git a/modules/overlay/overlay-parent.js b/modules/overlay/overlay-parent.js
index 3007fe088585..b0cd7be748dc 100644
--- a/modules/overlay/overlay-parent.js
+++ b/modules/overlay/overlay-parent.js
@@ -116,6 +116,7 @@ Drupal.overlay.create = function () {
     .bind('drupalOverlayLoad' + eventClass, $.proxy(this, 'eventhandlerOuterResize'))
     .bind('drupalOverlayReady' + eventClass +
           ' drupalOverlayClose' + eventClass, $.proxy(this, 'eventhandlerSyncURLFragment'))
+    .bind('drupalOverlayClose' + eventClass, $.proxy(this, 'eventhandlerRefreshPage'))
     .bind('drupalOverlayBeforeClose' + eventClass +
           ' drupalOverlayBeforeLoad' + eventClass +
           ' drupalOverlayResize' + eventClass, $.proxy(this, 'eventhandlerDispatchEvent'))
@@ -458,7 +459,7 @@ Drupal.overlay.eventhandlerOverrideLink = function (event) {
   // Close the overlay when the link contains the overlay-close class.
   if ($target.hasClass('overlay-close')) {
     // Clearing the overlay URL fragment will close the overlay.
-    $.bbq.pushState();
+    $.bbq.removeState('overlay');
     return;
   }
 
@@ -587,7 +588,22 @@ Drupal.overlay.eventhandlerSyncURLFragment = function (event) {
     }
   }
   else {
-    $.bbq.pushState();
+    $.bbq.removeState('overlay');
+  }
+};
+
+/**
+ * Event handler: if the child window suggested that the parent refresh on
+ * close, force a page refresh.
+ *
+ * @param event
+ *   Event being triggered, with the following restrictions:
+ *   - event.type: drupalOverlayClose
+ *   - event.currentTarget: document
+ */
+Drupal.overlay.eventhandlerRefreshPage = function (event) {
+  if (Drupal.overlay.refreshPage) {
+    window.location.reload(true);
   }
 };
 
diff --git a/modules/overlay/overlay.module b/modules/overlay/overlay.module
index fa5e76af08e1..2650e81688bf 100644
--- a/modules/overlay/overlay.module
+++ b/modules/overlay/overlay.module
@@ -551,18 +551,21 @@ function overlay_overlay_parent_initialize() {
 function overlay_overlay_child_initialize() {
   // Check if the parent window needs to refresh any page regions on this page
   // request.
-  overlay_trigger_regions_to_refresh();
+  overlay_trigger_refresh();
   // If this is a POST request, or a GET request with a token parameter, we
   // have an indication that something in the supplemental regions of the
   // overlay might change during the current page request. We therefore store
   // the initial rendered content of those regions here, so that we can compare
   // it to the same content rendered in overlay_exit(), at the end of the page
   // request. This allows us to check if anything actually did change, and, if
-  // so, trigger an AJAX refresh of the parent window.
+  // so, trigger an immediate AJAX refresh of the parent window.
   if (!empty($_POST) || isset($_GET['token'])) {
     foreach (overlay_supplemental_regions() as $region) {
       overlay_store_rendered_content($region, overlay_render_region($region));
     }
+    // In addition, notify the parent window that when the overlay closes,
+    // the entire parent window should be refreshed.
+    overlay_request_page_refresh();
   }
   // Indicate that when the main page rendering occurs later in the page
   // request, only the regions that appear within the overlay should be
@@ -797,7 +800,7 @@ function overlay_store_rendered_content($id = NULL, $content = NULL) {
  *   The name of the page region to refresh. The parent window will trigger a
  *   refresh of this region on the next page load.
  *
- * @see overlay_trigger_regions_to_refresh()
+ * @see overlay_trigger_refresh()
  * @see Drupal.overlay.refreshRegions()
  */
 function overlay_request_refresh($region) {
@@ -806,16 +809,27 @@ function overlay_request_refresh($region) {
 }
 
 /**
- * Check if the parent window needs to refresh any regions on this page load.
+ * Request that the entire parent window be reloaded when the overlay closes.
  *
- * If the previous page load requested that any page regions be refreshed, pass
- * that request via JavaScript to the child window, so it can in turn pass the
- * request to the parent window.
+ * @see overlay_trigger_refresh()
+ */
+function overlay_request_page_refresh() {
+  $_SESSION['overlay_refresh_parent'] = TRUE;
+}
+
+/**
+ * Check if the parent window needs to be refreshed on this page load.
+ *
+ * If the previous page load requested that any page regions be refreshed, or
+ * if it requested that the entire page be refreshed when the overlay closes,
+ * pass that request via JavaScript to the child window, so it can in turn pass
+ * the request to the parent window.
  *
  * @see overlay_request_refresh()
+ * @see overlay_request_page_refresh()
  * @see Drupal.overlay.refreshRegions()
  */
-function overlay_trigger_regions_to_refresh() {
+function overlay_trigger_refresh() {
   if (!empty($_SESSION['overlay_regions_to_refresh'])) {
     $settings = array(
       'overlayChild' => array(
@@ -825,6 +839,10 @@ function overlay_trigger_regions_to_refresh() {
     drupal_add_js($settings, array('type' => 'setting'));
     unset($_SESSION['overlay_regions_to_refresh']);
   }
+  if (!empty($_SESSION['overlay_refresh_parent'])) {
+    drupal_add_js(array('overlayChild' => array('refreshPage' => TRUE)), array('type' => 'setting'));
+    unset($_SESSION['overlay_refresh_parent']);
+  }
 }
 
 /**
-- 
GitLab