griffincss-ui 0.28.0 → 0.28.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -40,11 +40,22 @@
40
40
  var VIDEO = /\.(mp4|webm|ogv|mov)(\?|#|$)/i;
41
41
  var SCHEMES = /^(https?|data|blob):$/;
42
42
  // Набор — по замеру настоящих плееров: allow-presentation им не нужен,
43
- // а WebKit на него пишет ошибку в консоль.
44
- var SANDBOX = 'allow-scripts allow-popups allow-popups-to-escape-sandbox';
43
+ // а WebKit на него пишет ошибку в консоль. Выход окон из песочницы —
44
+ // только хостам списка, вместе с allow-same-origin: ссылка плеера
45
+ // «смотреть на сайте» открывается обычной вкладкой. Окно своего кадра
46
+ // остаётся в его песочнице — с выходом оно жило бы в origin сайта,
47
+ // правило бы страницу через opener и уводило бы вкладку.
48
+ var SANDBOX = 'allow-scripts allow-popups';
49
+ var HOST = ' allow-popups-to-escape-sandbox allow-same-origin';
45
50
  var config = G.config;
46
51
 
47
- if (!config.frames) config.frames = ['self', 'youtube.com', 'youtu.be', 'vimeo.com', 'rutube.ru', 'vkvideo.ru', 'vk.com/video'];
52
+ // Записи — пути встраивания плееров, а не хосты: страница ролика
53
+ // и короткая ссылка youtu.be отвечают X-Frame-Options и фреймом
54
+ // не встают никогда — вне списка они остаются ссылкой.
55
+ if (!config.frames) {
56
+ config.frames = ['self', 'youtube.com/embed/', 'youtube-nocookie.com/embed/', 'player.vimeo.com/video/', 'vimeo.com/showcase/', 'vimeo.com/event/',
57
+ 'rutube.ru/play/embed/', 'vk.com/video_ext.php', 'vk.ru/video_ext.php', 'vkvideo.ru/video_ext.php'];
58
+ }
48
59
 
49
60
  var dialog = null;
50
61
  var track = null;
@@ -145,7 +156,7 @@
145
156
  }
146
157
 
147
158
  if (item.type === 'iframe') {
148
- return element('iframe', null, { sandbox: SANDBOX + (item.same ? ' allow-same-origin' : ''), src: item.src, allow: 'autoplay; fullscreen; picture-in-picture', allowfullscreen: '', title: item.caption || item.alt || 'Видео' });
159
+ return element('iframe', null, { sandbox: SANDBOX + (item.same ? HOST : ''), src: item.src, allow: 'autoplay; fullscreen; picture-in-picture', allowfullscreen: '', title: item.caption || item.alt || 'Видео' });
149
160
  }
150
161
 
151
162
  return element('img', null, { src: item.src, alt: item.alt });
@@ -161,17 +172,18 @@
161
172
 
162
173
  // Кадр с отвергнутым адресом выпадает из группы; отвергнут
163
174
  // открываемый — окна нет. Новый номер — число принятых до него.
164
- // Адрес приводится к строке один раз: она проверяется, она же
165
- // встаёт в кадр — в копию описания, объект вызывающего не меняется.
175
+ // Адрес и тип приводятся к строке один раз: они проверяются, они же
176
+ // встают в кадр — в копию описания, объект вызывающего не меняется.
166
177
  // Фрейм — только по списку кадров.
167
178
  index = 0;
168
179
 
169
180
  for (var k = 0; k < items.length; k++) {
170
181
  var src = String(items[k].src);
182
+ var type = String(items[k].type || '');
171
183
  var url = parse(src);
172
184
  // Схема — http(s), data:, blob: или та же, что у страницы: с диска
173
185
  // свои файлы — file:, относительный адрес иначе не открылся бы.
174
- var kind = url && (SCHEMES.test(url.protocol) || url.protocol === location.protocol) && (items[k].type === 'iframe' ? listed(url) : 'any');
186
+ var kind = url && (SCHEMES.test(url.protocol) || url.protocol === location.protocol) && (type === 'iframe' ? listed(url) : 'any');
175
187
 
176
188
  if (!kind) {
177
189
  G.warn('lightbox: frame address refused: ' + src + ' (iframe: GriffinJS.config.frames)');
@@ -181,7 +193,7 @@
181
193
  }
182
194
 
183
195
  if (k < at) index++;
184
- list.push(Object.assign({}, items[k], { src: src, same: kind === 'host' }));
196
+ list.push(Object.assign({}, items[k], { src: src, type: type, same: kind === 'host' }));
185
197
  }
186
198
 
187
199
  if (!list.length) return null;
@@ -588,6 +588,26 @@
588
588
 
589
589
  for (var i = 0; i < items.length; i++) setup(items[i]);
590
590
 
591
+ // Пункт, открытый разметкой: toggle от open браузеры шлют в разное
592
+ // время — при разборе, на interactive или после load, — и обработчик
593
+ // ловил его не всегда. Решается здесь, один раз: открыт первый пункт
594
+ // с open, его панель грузится; остальные закрываются сразу, без closing —
595
+ // на подъёме смотреть нечему. Поздний toggle безвреден: load не грузит
596
+ // дважды, закрытые закрывать нечего.
597
+ var first = null;
598
+
599
+ for (i = 0; i < items.length; i++) {
600
+ if (!items[i].el.open) continue;
601
+ if (first) {
602
+ items[i].el.open = false;
603
+ setAttr(items[i].summary, 'aria-expanded', 'false');
604
+ } else {
605
+ first = items[i];
606
+ }
607
+ }
608
+
609
+ if (first) load(first);
610
+
591
611
  unmedia = G.media.on(o.bp, onMedia);
592
612
 
593
613
  listen(el, 'pointerover', onPointerOver);