FIX: Fix registration dialog popup for 'full screen' social logins

approved

#1

FIX: Fix registration dialog popup for ‘full screen’ social logins

Regression following the ember3 upgrade. In addition to fixing, this commit consolidates our social registration logic into one place, and adds tests for the behaviour.

diff --git a/app/assets/javascripts/authentication-complete.js.no-module.es6 b/app/assets/javascripts/authentication-complete.js.no-module.es6
deleted file mode 100644
index be55e6d..0000000
--- a/app/assets/javascripts/authentication-complete.js.no-module.es6
+++ /dev/null
@@ -1,17 +0,0 @@
-(function() {
-  const authenticationData = JSON.parse(
-    document.getElementById("data-authentication").dataset.authenticationData
-  );
-
-  Discourse.showingSignup = true;
-  require("discourse/routes/application").default.reopen({
-    actions: {
-      didTransition: function() {
-        Ember.run.next(function() {
-          Discourse.authenticationComplete(authenticationData);
-        });
-        return this._super();
-      }
-    }
-  });
-})();
diff --git a/app/assets/javascripts/discourse/initializers/auth-complete.js.es6 b/app/assets/javascripts/discourse/initializers/auth-complete.js.es6
index 3e9d88d..cecf831 100644
--- a/app/assets/javascripts/discourse/initializers/auth-complete.js.es6
+++ b/app/assets/javascripts/discourse/initializers/auth-complete.js.es6
@@ -1,15 +1,26 @@
 export default {
   name: "auth-complete",
   after: "inject-objects",
-  initialize() {
+  initialize(container) {
+    let lastAuthResult;
+
     if (window.location.search.indexOf("authComplete=true") !== -1) {
-      const lastAuthResult = localStorage.getItem("lastAuthResult");
+      // Happens when a popup social login loses connection to the parent window
+      lastAuthResult = localStorage.getItem("lastAuthResult");
       localStorage.removeItem("lastAuthResult");
-      if (lastAuthResult) {
+    } else if (document.getElementById("data-authentication")) {
+      // Happens for full screen logins
+      lastAuthResult = document.getElementById("data-authentication").dataset
+        .authenticationData;
+    }
+
+    if (lastAuthResult) {
+      const router = container.lookup("router:main");
+      router.one("didTransition", () => {
         Ember.run.next(() =>
           Discourse.authenticationComplete(JSON.parse(lastAuthResult))
         );
-      }
+      });
     }
   }
 };
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb
index e650265..fc109a7 100644
--- a/app/views/layouts/application.html.erb
+++ b/app/views/layouts/application.html.erb
@@ -57,7 +57,6 @@
 
     <%- if !current_user && cookies[:authentication_data] %>
       <meta id="data-authentication" data-authentication-data="<%= cookies.delete(:authentication_data) %>">
-      <%= preload_script "authentication-complete" %>
     <%- end %>
   </head>
 
diff --git a/config/application.rb b/config/application.rb
index 89c161b..65233ef 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -122,7 +122,6 @@ module Discourse
       google-tag-manager.js
       google-universal-analytics.js
       preload-application-data.js
-      authentication-complete.js
       print-page.js
       omniauth-complete.js
       activate-account.js
diff --git a/test/javascripts/acceptance/auth-complete-test.js.es6 b/test/javascripts/acceptance/auth-complete-test.js.es6
new file mode 100644
index 0000000..58a717b
--- /dev/null
+++ b/test/javascripts/acceptance/auth-complete-test.js.es6
@@ -0,0 +1,40 @@
+import { acceptance } from "helpers/qunit-helpers";
+acceptance("Auth Complete", {
+  beforeEach() {
+    const node = document.createElement("meta");
+    node.dataset.authenticationData = JSON.stringify({
+      auth_provider: "test",
+      email: "blah@example.com"
+    });
+    node.id = "data-authentication";
+    document.querySelector("head").appendChild(node);
+  },
+  afterEach() {
+    document
+      .querySelector("head")
+      .removeChild(document.getElementById("data-authentication"));
+  }
+});
+
+QUnit.test("when login not required", async assert => {
+  await visit("/");
+
+  assert.equal(currentPath(), "discovery.latest", "it stays on the homepage");
+
+  assert.ok(
+    exists("#discourse-modal div.create-account"),
+    "it shows the registration modal"
+  );
+});
+
+QUnit.test("when login required", async assert => {
+  Discourse.SiteSettings.login_required = true;
+  await visit("/");
+
+  assert.equal(currentPath(), "login", "it redirects to the login page");
+
+  assert.ok(
+    exists("#discourse-modal div.create-account"),
+    "it shows the registration modal"
+  );
+});

GitHub sha: 49593d1a


#2

This commit has been mentioned on Discourse Meta. There might be relevant details there:


#3