|
26 | 26 | var serializer = {};
|
27 | 27 | // object with user events as keys and values arrays of callback functions
|
28 | 28 | var callbacks = {};
|
| 29 | + var has_primary; |
29 | 30 | var iframes = [];
|
30 | 31 | var index = 0;
|
31 | 32 | var channel;
|
|
46 | 47 | close: [],
|
47 | 48 | open: [],
|
48 | 49 | secondary: [],
|
49 |
| - message: [] |
| 50 | + message: [], |
| 51 | + visbility: [] |
50 | 52 | };
|
51 |
| - |
52 | 53 | var events = Object.keys(handlers);
|
53 | 54 | // -------------------------------------------------------------------------
|
54 | 55 | var serialize = make_process(serializer, 'to');
|
|
358 | 359 | }
|
359 | 360 | }
|
360 | 361 | // -------------------------------------------------------------------------
|
| 362 | + function init_visiblity() { |
| 363 | + // ref: https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API |
| 364 | + var hidden, visibilityChange; |
| 365 | + if (typeof document.hidden !== "undefined") { // Opera 12.10 and Firefox 18 and later support |
| 366 | + hidden = "hidden"; |
| 367 | + visibilityChange = "visibilitychange"; |
| 368 | + } else if (typeof document.msHidden !== "undefined") { |
| 369 | + hidden = "msHidden"; |
| 370 | + visibilityChange = "msvisibilitychange"; |
| 371 | + } else if (typeof document.webkitHidden !== "undefined") { |
| 372 | + hidden = "webkitHidden"; |
| 373 | + visibilityChange = "webkitvisibilitychange"; |
| 374 | + } |
| 375 | + if (typeof document.addEventListener === 'function' && hidden) { |
| 376 | + document.addEventListener(visibilityChange, function() { |
| 377 | + trigger(handlers.visbility, !document[hidden]); |
| 378 | + }, false); |
| 379 | + } |
| 380 | + } |
| 381 | + // ------------------------------------------------------------------------- |
361 | 382 | function init() {
|
362 | 383 | if (typeof window.BroadcastChannel === 'function') {
|
363 | 384 | channel = new window.BroadcastChannel(uniq_prefix);
|
|
416 | 437 | }
|
417 | 438 | });
|
418 | 439 | } else {
|
| 440 | + init_visiblity(); |
| 441 | + |
| 442 | + sysend.track('visbility', function(visible) { |
| 443 | + if (visible && !has_primary) { |
| 444 | + primary = true; |
| 445 | + trigger(handlers.primary); |
| 446 | + sysend.emit('__primary__'); |
| 447 | + } |
| 448 | + }); |
| 449 | + |
| 450 | + sysend.on('__primary__', function() { |
| 451 | + has_primary = true; |
| 452 | + }); |
419 | 453 |
|
420 | 454 | sysend.on('__open__', function(data) {
|
421 | 455 | var id = data.id;
|
|
438 | 472 |
|
439 | 473 | sysend.on('__close__', function(data) {
|
440 | 474 | --target_count;
|
441 |
| - if (target_count === 1) { |
| 475 | + var last = target_count === 1; |
| 476 | + if (data.wasPrimary && !primary) { |
| 477 | + has_primary = false; |
| 478 | + } |
| 479 | + if (last) { |
442 | 480 | primary = true;
|
| 481 | + has_primary = true; |
443 | 482 | }
|
444 | 483 | var payload = {
|
445 | 484 | id: data.id,
|
446 | 485 | count: target_count,
|
| 486 | + wasPrimary: data.wasPrimary, |
447 | 487 | primary: primary,
|
448 | 488 | self: data.id === target_id
|
449 | 489 | };
|
|
468 | 508 | });
|
469 | 509 |
|
470 | 510 | addEventListener('beforeunload', function() {
|
471 |
| - sysend.emit('__close__', { id: target_id }); |
| 511 | + sysend.emit('__close__', { id: target_id, wasPrimary: primary }); |
472 | 512 | }, { capture: true });
|
473 | 513 |
|
474 | 514 | onLoad().then(function() {
|
475 | 515 | sysend.list().then(function(list) {
|
476 | 516 | target_count = list.length;
|
477 | 517 | primary = list.length === 0;
|
478 |
| - console.log([...list]); |
479 |
| - console.log(primary); |
| 518 | + var found = list.find(function(item) { |
| 519 | + return item.primary; |
| 520 | + }); |
| 521 | + if (found || primary) { |
| 522 | + has_primary = true; |
| 523 | + } |
480 | 524 | sysend.emit('__open__', {
|
481 | 525 | id: target_id,
|
482 | 526 | primary: primary
|
|
0 commit comments