bookmark-audio-fragment/app/create-bookmarks/ contentscript.js
77 lines
2.1 KiB

  1. import delay from 'delay';
  2. import { makeRemotelyCallable, remoteFunction } from 'webextension-rpc';
  3. function describeSelection() {
  4. const playlist = self.playlist;
  5. if (!playlist) {
  6. throw new Error('Player has not been initialised.');
  7. }
  8. let { start, end } = playlist.getTimeSelection();
  9. // Waveform Playlist tells us end=start when the selection is just a single line.
  10. if (end === start) end = undefined;
  11. // Round the numbers to two decimals.
  12. if (start !== undefined) start = Math.round(start * 100) / 100;
  13. if (end !== undefined) end = Math.round(end * 100) / 100;
  14. const fragmentIdentifier = `t=${start || ''}` + (end ? `,${end}` : '');
  15. const selector = {
  16. type: 'FragmentSelector',
  17. conformsTo: 'http://www.w3.org/TR/media-frags/',
  18. value: fragmentIdentifier,
  19. };
  20. return selector;
  21. }
  22. makeRemotelyCallable({
  23. describeSelection,
  24. });
  25. async function init() {
  26. let menuEl;
  27. function cleanupMenu() {
  28. if (!menuEl) return;
  29. menuEl.parentNode.removeChild(menuEl);
  30. menuEl = undefined;
  31. }
  32. function onContextMenu(event) {
  33. event.preventDefault();
  34. const left = event.pageX;
  35. const top = event.pageY;
  36. const playlist = self.playlist;
  37. if (!playlist) {
  38. throw new Error('Player has not been initialised.');
  39. }
  40. let { start, end } = playlist.getTimeSelection();
  41. const fragmentIsSelected = start !== end;
  42. cleanupMenu();
  43. menuEl = document.createElement('ul');
  44. const liEl = document.createElement('li');
  45. menuEl.appendChild(liEl);
  46. menuEl.setAttribute('style', `list-style: none; margin: 0; padding: 0; position: absolute; top: ${top}; left: ${left}; z-index: 9999999; background: #eee; border: 1px solid black;`);
  47. const buttonEl = document.createElement('button');
  48. buttonEl.innerText = browser.i18n.getMessage(fragmentIsSelected
  49. ? 'bookmarkSelectionContextMenuItemForFragment'
  50. : 'bookmarkSelectionContextMenuItemForSingleMoment'
  51. );
  52. buttonEl.addEventListener('click', remoteFunction('createBookmark'));
  53. liEl.appendChild(buttonEl);
  54. document.body.appendChild(menuEl);
  55. }
  56. document.addEventListener('contextmenu', onContextMenu, false);
  57. document.addEventListener('click', event => {
  58. cleanupMenu();
  59. })
  60. }
  61. init();