FIX: puts focus-event at application level (#7568)
Also attempts to use simpler and newer APIs
This commit is contained in:
parent
b788948985
commit
bc8c77723e
|
@ -0,0 +1,36 @@
|
||||||
|
function gotFocus() {
|
||||||
|
if (!Discourse.get("hasFocus")) {
|
||||||
|
Discourse.setProperties({ hasFocus: true, notify: false });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function lostFocus() {
|
||||||
|
if (Discourse.get("hasFocus")) {
|
||||||
|
Discourse.set("hasFocus", false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let onchange;
|
||||||
|
|
||||||
|
export default Ember.Mixin.create({
|
||||||
|
ready() {
|
||||||
|
this._super(...arguments);
|
||||||
|
|
||||||
|
onchange = () => {
|
||||||
|
document.visibilityState === "hidden" ? lostFocus() : gotFocus();
|
||||||
|
};
|
||||||
|
|
||||||
|
// Default to true
|
||||||
|
Discourse.set("hasFocus", true);
|
||||||
|
|
||||||
|
document.addEventListener("visibilitychange", onchange);
|
||||||
|
},
|
||||||
|
|
||||||
|
reset() {
|
||||||
|
this._super(...arguments);
|
||||||
|
|
||||||
|
document.removeEventListener("visibilitychange", onchange);
|
||||||
|
|
||||||
|
onchange = undefined;
|
||||||
|
}
|
||||||
|
});
|
|
@ -4,10 +4,11 @@ import {
|
||||||
default as computed,
|
default as computed,
|
||||||
observes
|
observes
|
||||||
} from "ember-addons/ember-computed-decorators";
|
} from "ember-addons/ember-computed-decorators";
|
||||||
|
import FocusEvent from "discourse-common/mixins/focus-event";
|
||||||
|
|
||||||
const _pluginCallbacks = [];
|
const _pluginCallbacks = [];
|
||||||
|
|
||||||
const Discourse = Ember.Application.extend({
|
const Discourse = Ember.Application.extend(FocusEvent, {
|
||||||
rootElement: "#main",
|
rootElement: "#main",
|
||||||
_docTitle: document.title,
|
_docTitle: document.title,
|
||||||
RAW_TEMPLATES: {},
|
RAW_TEMPLATES: {},
|
||||||
|
|
|
@ -1,68 +0,0 @@
|
||||||
/**
|
|
||||||
Keep track of when the browser is in focus.
|
|
||||||
**/
|
|
||||||
export default {
|
|
||||||
name: "focus-event",
|
|
||||||
|
|
||||||
initialize: function() {
|
|
||||||
var hidden = "hidden";
|
|
||||||
|
|
||||||
// Default to true
|
|
||||||
Discourse.set("hasFocus", true);
|
|
||||||
|
|
||||||
var gotFocus = function() {
|
|
||||||
if (!Discourse.get("hasFocus")) {
|
|
||||||
Discourse.setProperties({ hasFocus: true, notify: false });
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
var lostFocus = function() {
|
|
||||||
if (Discourse.get("hasFocus")) {
|
|
||||||
Discourse.set("hasFocus", false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
var onchange = function(evt) {
|
|
||||||
var v = "visible",
|
|
||||||
h = "hidden",
|
|
||||||
evtMap = {
|
|
||||||
focus: v,
|
|
||||||
focusin: v,
|
|
||||||
pageshow: v,
|
|
||||||
blur: h,
|
|
||||||
focusout: h,
|
|
||||||
pagehide: h
|
|
||||||
};
|
|
||||||
|
|
||||||
evt = evt || window.event;
|
|
||||||
if (evt.type in evtMap) {
|
|
||||||
if (evtMap[evt.type] === "hidden") {
|
|
||||||
lostFocus();
|
|
||||||
} else {
|
|
||||||
gotFocus();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (this[hidden]) {
|
|
||||||
lostFocus();
|
|
||||||
} else {
|
|
||||||
gotFocus();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// from StackOverflow http://stackoverflow.com/a/1060034/17174
|
|
||||||
if (hidden in document) {
|
|
||||||
document.addEventListener("visibilitychange", onchange);
|
|
||||||
} else if ((hidden = "mozHidden") in document) {
|
|
||||||
document.addEventListener("mozvisibilitychange", onchange);
|
|
||||||
} else if ((hidden = "webkitHidden") in document) {
|
|
||||||
document.addEventListener("webkitvisibilitychange", onchange);
|
|
||||||
} else if ((hidden = "msHidden") in document) {
|
|
||||||
document.addEventListener("msvisibilitychange", onchange);
|
|
||||||
}
|
|
||||||
// All others (including iPad which is a bit weird and gives onpageshow / hide
|
|
||||||
else {
|
|
||||||
window.onpageshow = window.onpagehide = window.onfocus = window.onblur = onchange;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
Loading…
Reference in New Issue