@inboxsdk/core 0.2.28-alpha.3 → 0.2.28-alpha.5

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.
Files changed (398) hide show
  1. package/inboxsdk.js +1 -1
  2. package/inboxsdk.js.map +1 -1
  3. package/package.json +5 -1
  4. package/src/build/exec.js +26 -0
  5. package/src/build/spawn.js +17 -0
  6. package/src/common/ajax.js +90 -0
  7. package/src/common/cachebust-url.js +10 -0
  8. package/src/common/censorHTMLstring.js +37 -0
  9. package/src/common/censorHTMLtree.js +28 -0
  10. package/src/common/censorJSONTree.js +15 -0
  11. package/src/common/connectivity-test.js +21 -0
  12. package/src/common/defer.js +11 -0
  13. package/src/common/find-parent.js +10 -0
  14. package/src/common/get-extension-id.js +7 -0
  15. package/src/common/get-or-fail.js +8 -0
  16. package/src/common/get-session-id.js +14 -0
  17. package/src/common/get-stack-trace.js +6 -0
  18. package/src/common/html-to-text.js +7 -0
  19. package/src/common/isElementVisible.js +6 -0
  20. package/src/common/load-script.js +127 -0
  21. package/src/common/log-error.js +191 -0
  22. package/src/common/quoted-split.js +18 -0
  23. package/src/common/rate-limit-queuer.js +57 -0
  24. package/src/common/rate-limit.js +14 -0
  25. package/src/common/version.js +6 -0
  26. package/src/inboxsdk-js/check-requirements.js +7 -3
  27. package/src/inboxsdk-js/header.js +1 -0
  28. package/src/inboxsdk-js/inboxsdk-NONREMOTE-INTEGRATED-PAGEWORLD.js +5 -6
  29. package/src/inboxsdk-js/inboxsdk-NONREMOTE.js +4 -3
  30. package/src/inboxsdk-js/inboxsdk-REMOTE.js +3 -1
  31. package/src/inboxsdk-js/inboxsdk-TEST.js +4 -3
  32. package/src/inboxsdk-js/inboxsdk.js +33 -39
  33. package/src/inboxsdk-js/loading/load-platform-implementation-DEV.js +15 -18
  34. package/src/inboxsdk-js/loading/platform-implementation-loader.js +27 -0
  35. package/src/injected-js/gmail/constants.js +2 -0
  36. package/src/injected-js/gmail/modify-suggestions.js +106 -0
  37. package/src/injected-js/gmail/modify-suggestions.test.js +8 -9
  38. package/src/injected-js/gmail/setup-gmail-interceptor.js +340 -579
  39. package/src/injected-js/gmail/setup-gmonkey-handler.js +49 -0
  40. package/src/injected-js/gmail/sync-compose-processor-20220909.js +298 -0
  41. package/src/injected-js/gmail/sync-compose-processor.js +55 -0
  42. package/src/injected-js/gmail/sync-compose-request-processor.js +110 -0
  43. package/src/injected-js/gmail/sync-compose-request-processor.test.js +39 -49
  44. package/src/injected-js/gmail/thread-identifier/click-and-get-popup-url.js +20 -33
  45. package/src/injected-js/gmail/thread-identifier/index.js +57 -93
  46. package/src/injected-js/gmail/thread-identifier/thread-row-parser.js +22 -31
  47. package/src/injected-js/gmail/thread-identifier/thread-row-parser.test.js +12 -28
  48. package/src/injected-js/inbox/setupAjaxInterceptor.js +64 -121
  49. package/src/injected-js/inbox/setupClickAndGetNewIframeSrc.js +53 -66
  50. package/src/injected-js/inbox/setupComposeViewDraftIDFinder.js +20 -36
  51. package/src/injected-js/inbox/setupInboxFakeWindowResizeListener.js +13 -13
  52. package/src/injected-js/injected-logger.js +50 -0
  53. package/src/injected-js/main.js +11 -24
  54. package/src/injected-js/message-metadata-holder.js +52 -82
  55. package/src/injected-js/setup-data-exposer.js +89 -148
  56. package/src/injected-js/setup-error-silencer.js +21 -21
  57. package/src/injected-js/setup-event-reemitter.js +30 -22
  58. package/src/injected-js/setupCustomViewEventAssassin.js +90 -0
  59. package/src/injected-js/setupInboxCustomViewLinkFixer.js +24 -29
  60. package/src/injected-js/setupPushStateListener.js +18 -11
  61. package/src/injected-js/xhr-helper.js +62 -65
  62. package/src/injected-js/xhr-proxy-factory.js +195 -445
  63. package/src/injected-js/xhr-proxy-factory.test.js +824 -991
  64. package/src/platform-implementation-js/constants/nav-item-types.js +19 -0
  65. package/src/platform-implementation-js/constants/router.js +14 -9
  66. package/src/platform-implementation-js/constants/toolbars.js +8 -3
  67. package/src/platform-implementation-js/dom-driver/gmail/custom-style.js +13 -13
  68. package/src/platform-implementation-js/dom-driver/gmail/gmail-butter-bar-driver.js +115 -136
  69. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/add-app-menu-item.js +21 -0
  70. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/add-collapsible-panel.js +28 -0
  71. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/add-nav-item.js +98 -0
  72. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/add-support-item.js +4 -0
  73. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/add-toolbar-button-for-app.js +13 -14
  74. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/create-link.js +27 -48
  75. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/encodeDraftUrlId.js +8 -0
  76. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/get-draft-id-for-message-id.js +31 -42
  77. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/get-native-nav-item.js +30 -40
  78. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/get-rfc-message-id-for-gmail-message-id.js +12 -0
  79. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/get-rfc-message-id-for-gmail-thread-id.js +33 -0
  80. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/get-url-object.js +10 -18
  81. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/getSyncThreadForOldGmailThreadId.js +21 -28
  82. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/getSyncThreadFromSyncThreadId.js +33 -45
  83. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/gmail-load-event.js +31 -49
  84. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/goto-view.js +58 -65
  85. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/isIntegratedViewGmail.js +4 -0
  86. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/keyboard-shortcut-help-modifier.js +40 -124
  87. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/open-compose-window.js +17 -22
  88. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/open-draft-by-message-id.js +44 -0
  89. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/open-draft-by-message-id.test.js +10 -11
  90. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/override-gmail-back-button.js +44 -80
  91. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/register-search-query-rewriter.js +19 -26
  92. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/register-search-suggestions-provider.js +71 -147
  93. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/setup-compose-view-driver-stream.js +91 -148
  94. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/setup-route-view-driver-stream.js +150 -166
  95. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/setup-route-view-driver-stream.test.js +70 -120
  96. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/show-app-id-warning.js +15 -15
  97. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/show-custom-route-view.js +44 -67
  98. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/show-custom-thread-list.js +230 -379
  99. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/show-custom-thread-list.test.js +121 -307
  100. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/show-native-route-view.js +17 -24
  101. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/suppressAddon.js +41 -49
  102. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/temporary-track-download-url-validity.js +30 -40
  103. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/thread-row-identifier.js +28 -60
  104. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/track-events.js +61 -133
  105. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/track-gmail-styles.js +95 -0
  106. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/user-info.js +30 -42
  107. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver/user-info.test.js +52 -46
  108. package/src/platform-implementation-js/dom-driver/gmail/gmail-driver.js +354 -694
  109. package/src/platform-implementation-js/dom-driver/gmail/gmail-element-getter/get-main-content-element-changed-stream.js +38 -0
  110. package/src/platform-implementation-js/dom-driver/gmail/gmail-element-getter/wait-for-gmail-mode-to-settle.js +12 -0
  111. package/src/platform-implementation-js/dom-driver/gmail/gmail-element-getter.js +253 -0
  112. package/src/platform-implementation-js/dom-driver/gmail/gmail-page-communicator.js +200 -0
  113. package/src/platform-implementation-js/dom-driver/gmail/gmail-response-processor.js +533 -0
  114. package/src/platform-implementation-js/dom-driver/gmail/gmail-sync-response-processor.js +289 -0
  115. package/src/platform-implementation-js/dom-driver/gmail/is-compose-titlebar-light-color.js +21 -0
  116. package/src/platform-implementation-js/dom-driver/gmail/make-xhr-interceptor.js +77 -93
  117. package/src/platform-implementation-js/dom-driver/gmail/makePageParserTree.js +28 -0
  118. package/src/platform-implementation-js/dom-driver/gmail/pageParserOptions.js +19 -0
  119. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-menu-item-view.js +126 -0
  120. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-sidebar-view/index.js +35 -82
  121. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-sidebar-view/index.test.js +44 -94
  122. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-sidebar-view/primary/add-companion-global-icon-area.js +12 -19
  123. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-sidebar-view/primary/add-companion-thread-icon-area.js +17 -29
  124. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-sidebar-view/primary/add-to-icon-area.js +26 -26
  125. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-sidebar-view/primary/index.js +391 -797
  126. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-toolbar-button-view/monitor-top-banner-size-and-react.js +7 -9
  127. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-app-toolbar-button-view.js +60 -109
  128. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-attachment-area-view.js +95 -135
  129. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-attachment-card-view.js +103 -211
  130. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-attachment-card-view.test.js +61 -61
  131. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-backdrop.js +17 -17
  132. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-collapsible-section-view.js +188 -541
  133. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-button.js +67 -135
  134. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-compose-notice.js +27 -49
  135. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-inner-sidebar.js +7 -13
  136. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-outer-sidebar.js +9 -22
  137. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-recipient-row.js +36 -63
  138. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-status-bar.js +101 -0
  139. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/add-tooltip-to-button.js +38 -113
  140. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/detectClassicRecipientsArea.js +38 -0
  141. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/ensure-app-button-toolbars-are-closed.js +11 -16
  142. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/ensure-grouping-is-open.js +11 -17
  143. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/focus.js +8 -11
  144. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/from-manager.js +27 -47
  145. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-additional-action-toolbar.js +11 -24
  146. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-address-changes-stream.js +59 -111
  147. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-address-information-extractor.js +28 -0
  148. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-body-changes-stream.js +15 -14
  149. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-formatting-area-offset-left.js +11 -17
  150. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-minimized-stream.js +18 -24
  151. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-recipients.js +22 -0
  152. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/get-response-type-changes-stream.js +19 -23
  153. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/gmail-compose-button-view.js +233 -0
  154. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/insert-link-into-body.js +11 -19
  155. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/manage-button-grouping.js +141 -376
  156. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/monitor-selection-range.js +17 -28
  157. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/override-edit-subject.js +34 -70
  158. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/page-parser.js +223 -0
  159. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/position-formatting-toolbar.js +10 -17
  160. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/set-recipients.js +157 -0
  161. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/setupLinkPopovers.js +109 -0
  162. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/size-fixer.js +83 -137
  163. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view/update-insert-more-area-left.js +10 -19
  164. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-compose-view.js +632 -1190
  165. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-message-view/attachment-icon.js +5 -0
  166. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-message-view/get-updated-contact.js +29 -38
  167. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-message-view.js +327 -617
  168. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-nav-item-view.js +759 -0
  169. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-route-view/gmail-route-processor.js +26 -49
  170. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-route-view/gmail-route-view.js +188 -380
  171. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-row-list-view.js +104 -194
  172. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-support-item-view.js +84 -0
  173. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-thread-row-view.js +382 -811
  174. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-thread-sidebar-view/add-icon-area.js +34 -58
  175. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-thread-sidebar-view.js +330 -581
  176. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-thread-sidebar-view.test.js +123 -277
  177. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-thread-view/width-manager.js +15 -35
  178. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-thread-view.js +216 -571
  179. package/src/platform-implementation-js/dom-driver/gmail/views/gmail-toolbar-view.js +152 -336
  180. package/src/platform-implementation-js/dom-driver/gmail/views/native-gmail-nav-item-view.js +87 -211
  181. package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/button-color-classes.js +33 -0
  182. package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/button-view.js +325 -0
  183. package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/create-accessory-button-view.js +58 -0
  184. package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/create-parent-accessory-button-view.js +55 -0
  185. package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/inbox-dropdown-button-view.js +10 -11
  186. package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/modal-button-view.js +96 -0
  187. package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/more-dropdown-button-view.js +30 -0
  188. package/src/platform-implementation-js/dom-driver/gmail/widgets/buttons/more-parent-accessory-button-view.js +10 -0
  189. package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-action-button-view.js +20 -29
  190. package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-dropdown-view.js +22 -0
  191. package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-label-view.js +41 -76
  192. package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-modal-view-driver.js +45 -99
  193. package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-mole-view-driver.js +76 -128
  194. package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-tooltip-view.js +128 -319
  195. package/src/platform-implementation-js/dom-driver/gmail/widgets/gmail-top-message-bar-driver.js +45 -78
  196. package/src/platform-implementation-js/dom-driver/inbox/__mocks__/getSidebarClassnames.js +8 -4
  197. package/src/platform-implementation-js/dom-driver/inbox/addNavItem.js +36 -54
  198. package/src/platform-implementation-js/dom-driver/inbox/addRecipientRow.js +35 -53
  199. package/src/platform-implementation-js/dom-driver/inbox/createLink.js +13 -15
  200. package/src/platform-implementation-js/dom-driver/inbox/createLink.test.js +15 -18
  201. package/src/platform-implementation-js/dom-driver/inbox/custom-style.js +14 -13
  202. package/src/platform-implementation-js/dom-driver/inbox/detection/appToolbarLocation/parser.js +14 -20
  203. package/src/platform-implementation-js/dom-driver/inbox/detection/attachmentCard/parser.js +14 -13
  204. package/src/platform-implementation-js/dom-driver/inbox/detection/attachmentOverlay/parser.js +35 -67
  205. package/src/platform-implementation-js/dom-driver/inbox/detection/chatSidebar/parser.js +16 -18
  206. package/src/platform-implementation-js/dom-driver/inbox/detection/compose/parser.js +68 -185
  207. package/src/platform-implementation-js/dom-driver/inbox/detection/message/parser.js +28 -56
  208. package/src/platform-implementation-js/dom-driver/inbox/detection/nativeDrawer/parser.js +12 -10
  209. package/src/platform-implementation-js/dom-driver/inbox/detection/searchBar/parser.js +16 -16
  210. package/src/platform-implementation-js/dom-driver/inbox/detection/thread/parser.js +24 -35
  211. package/src/platform-implementation-js/dom-driver/inbox/detection/thread-row/parser.js +37 -89
  212. package/src/platform-implementation-js/dom-driver/inbox/getComposeViewDriverLiveSet.js +56 -78
  213. package/src/platform-implementation-js/dom-driver/inbox/getInboxMessageIdForInboxThreadId.js +26 -32
  214. package/src/platform-implementation-js/dom-driver/inbox/getSidebarClassnames.js +52 -109
  215. package/src/platform-implementation-js/dom-driver/inbox/getSidebarClassnames.test.js +7 -8
  216. package/src/platform-implementation-js/dom-driver/inbox/gotoView.js +16 -20
  217. package/src/platform-implementation-js/dom-driver/inbox/gotoView.test.js +15 -16
  218. package/src/platform-implementation-js/dom-driver/inbox/inbox-butter-bar-driver.js +75 -83
  219. package/src/platform-implementation-js/dom-driver/inbox/inbox-driver.js +530 -822
  220. package/src/platform-implementation-js/dom-driver/inbox/inbox-page-communicator.js +48 -61
  221. package/src/platform-implementation-js/dom-driver/inbox/inboxResponseProcessor.js +9 -12
  222. package/src/platform-implementation-js/dom-driver/inbox/inboxResponseProcessor.test.js +12 -19
  223. package/src/platform-implementation-js/dom-driver/inbox/makePageParserTree.js +24 -33
  224. package/src/platform-implementation-js/dom-driver/inbox/pageParserOptions.js +201 -388
  225. package/src/platform-implementation-js/dom-driver/inbox/registerSearchSuggestionsProvider.js +249 -265
  226. package/src/platform-implementation-js/dom-driver/inbox/setupCustomAutocompleteSelectionHandling.js +84 -152
  227. package/src/platform-implementation-js/dom-driver/inbox/setupRouteViewDriverStream.js +55 -67
  228. package/src/platform-implementation-js/dom-driver/inbox/setupRouteViewDriverStream.test.js +43 -65
  229. package/src/platform-implementation-js/dom-driver/inbox/views/InboxLabelView.js +31 -56
  230. package/src/platform-implementation-js/dom-driver/inbox/views/InboxMoleViewDriver.js +191 -294
  231. package/src/platform-implementation-js/dom-driver/inbox/views/InboxToolbarButtonView.js +32 -45
  232. package/src/platform-implementation-js/dom-driver/inbox/views/InboxToolbarView.js +21 -39
  233. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-app-sidebar-view.js +153 -240
  234. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-app-toolbar-button-view.js +75 -150
  235. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-app-toolbar-tooltip-view.js +20 -37
  236. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-attachment-card-view.js +60 -114
  237. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-attachment-overlay-view.js +47 -65
  238. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-backdrop.js +41 -52
  239. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-chat-sidebar-view.js +27 -36
  240. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-compose-button-view.js +52 -80
  241. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-compose-view.js +465 -649
  242. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-custom-route-view.js +37 -58
  243. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-custom-route-view.test.js +14 -26
  244. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-drawer-view.js +118 -235
  245. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-dropdown-view.js +10 -11
  246. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-dummy-route-view.js +28 -46
  247. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-message-view.js +131 -202
  248. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-modal-view.js +40 -80
  249. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-route-view.js +35 -61
  250. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-thread-row-view.js +124 -221
  251. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-thread-view.js +125 -213
  252. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-thread-view.test.js +104 -126
  253. package/src/platform-implementation-js/dom-driver/inbox/views/inbox-tooltip-view.js +36 -51
  254. package/src/platform-implementation-js/dom-driver/inbox/views/inboxNavItemView.js +158 -297
  255. package/src/platform-implementation-js/dom-driver/inbox/waitForAnimationClickBlockerGone.js +21 -35
  256. package/src/platform-implementation-js/driver-common/compose/getDiscardStream.js +24 -43
  257. package/src/platform-implementation-js/driver-common/compose/getPresendingStream.js +39 -68
  258. package/src/platform-implementation-js/driver-common/getAccountUrlPart.js +17 -0
  259. package/src/platform-implementation-js/driver-common/getGmailMessageIdForSyncMessageId.js +14 -19
  260. package/src/platform-implementation-js/driver-common/getGmailThreadIdForRfcMessageId.js +27 -35
  261. package/src/platform-implementation-js/driver-common/getOriginalMessagePage.js +33 -0
  262. package/src/platform-implementation-js/driver-common/getRfcMessageIdForSyncMessageId.js +16 -22
  263. package/src/platform-implementation-js/driver-common/getSyncThreadsForSearch.js +49 -0
  264. package/src/platform-implementation-js/driver-common/getThreadIdFromMessageId.js +14 -14
  265. package/src/platform-implementation-js/driver-common/gmailAjax.js +65 -0
  266. package/src/platform-implementation-js/driver-common/inboxAjax.js +12 -7
  267. package/src/platform-implementation-js/driver-common/render-custom-icon.js +16 -0
  268. package/src/platform-implementation-js/driver-common/requestGmailThread.js +19 -20
  269. package/src/platform-implementation-js/driver-common/sidebar/AppSidebar.js +197 -306
  270. package/src/platform-implementation-js/driver-common/sidebar/ContentPanelViewDriver.js +113 -161
  271. package/src/platform-implementation-js/driver-common/update-icon.js +90 -0
  272. package/src/platform-implementation-js/driver-interfaces/compose-view-driver.js +1 -114
  273. package/src/platform-implementation-js/driver-interfaces/driver.js +1 -131
  274. package/src/platform-implementation-js/driver-interfaces/message-view-driver.js +4 -48
  275. package/src/platform-implementation-js/driver-interfaces/mole-view-driver.js +1 -29
  276. package/src/platform-implementation-js/driver-interfaces/route-view-driver.js +1 -32
  277. package/src/platform-implementation-js/driver-interfaces/thread-row-view-driver.js +1 -11
  278. package/src/platform-implementation-js/lib/ErrorCollector.js +47 -0
  279. package/src/platform-implementation-js/lib/Membrane.js +22 -0
  280. package/src/platform-implementation-js/lib/ScrollableContainByScreen.js +30 -0
  281. package/src/platform-implementation-js/lib/array-to-lifetimes.js +43 -41
  282. package/src/platform-implementation-js/lib/array-to-lifetimes.test.js +139 -155
  283. package/src/platform-implementation-js/lib/attemptWithRetries.js +16 -0
  284. package/src/platform-implementation-js/lib/common-page-communicator.js +137 -0
  285. package/src/platform-implementation-js/lib/copyAndValidateAutocompleteResults.js +19 -38
  286. package/src/platform-implementation-js/lib/css-selector-escape.js +7 -3
  287. package/src/platform-implementation-js/lib/delay-asap.js +12 -0
  288. package/src/platform-implementation-js/lib/delay-idle.js +16 -0
  289. package/src/platform-implementation-js/lib/dom/block-and-reemit-keyboard-events.js +36 -0
  290. package/src/platform-implementation-js/lib/dom/element-view-mapper.js +8 -11
  291. package/src/platform-implementation-js/lib/dom/generic-button-view.js +39 -0
  292. package/src/platform-implementation-js/lib/dom/get-insert-before-element.js +39 -0
  293. package/src/platform-implementation-js/lib/dom/get-selection.js +23 -52
  294. package/src/platform-implementation-js/lib/dom/insert-element-in-order.js +38 -0
  295. package/src/platform-implementation-js/lib/dom/insert-html-at-cursor.js +69 -101
  296. package/src/platform-implementation-js/lib/dom/is-node-in-range.js +8 -10
  297. package/src/platform-implementation-js/lib/dom/keyboard-shortcut-stream.js +12 -0
  298. package/src/platform-implementation-js/lib/dom/make-element-child-stream.js +79 -0
  299. package/src/platform-implementation-js/lib/dom/make-element-stream-merger.js +28 -0
  300. package/src/platform-implementation-js/lib/dom/make-element-view-stream.js +15 -0
  301. package/src/platform-implementation-js/lib/dom/make-mutation-observer-chunked-stream.js +15 -0
  302. package/src/platform-implementation-js/lib/dom/make-mutation-observer-stream.js +5 -0
  303. package/src/platform-implementation-js/lib/dom/on-mouse-down-and-up.js +15 -17
  304. package/src/platform-implementation-js/lib/dom/outsideClicksAndEscape.js +39 -0
  305. package/src/platform-implementation-js/lib/dom/parentNodes.js +8 -0
  306. package/src/platform-implementation-js/lib/dom/querySelectorOne.js +8 -11
  307. package/src/platform-implementation-js/lib/dom/querySelectorOrFail.js +6 -0
  308. package/src/platform-implementation-js/lib/dom/reemitClickEventForReact.js +22 -0
  309. package/src/platform-implementation-js/lib/dom/set-css.js +7 -3
  310. package/src/platform-implementation-js/lib/dom/set-value-and-dispatch-event.js +9 -11
  311. package/src/platform-implementation-js/lib/dom/simulate-drag-and-drop.js +32 -33
  312. package/src/platform-implementation-js/lib/dom/simulate-key.js +46 -0
  313. package/src/platform-implementation-js/lib/dom/simulate-mouse-event.js +16 -0
  314. package/src/platform-implementation-js/lib/dom/trigger-relay-event.js +7 -0
  315. package/src/platform-implementation-js/lib/extract-contact-from-email-contact-string.js +25 -0
  316. package/src/platform-implementation-js/lib/extract-contact-from-email-contact-string.test.js +23 -26
  317. package/src/platform-implementation-js/lib/fake-window-resize.js +5 -0
  318. package/src/platform-implementation-js/lib/from-event-target-capture.js +12 -0
  319. package/src/platform-implementation-js/lib/fromEventsWithOptions.js +10 -0
  320. package/src/platform-implementation-js/lib/handle-compose-link-chips.js +86 -149
  321. package/src/platform-implementation-js/lib/handler-registry.js +67 -0
  322. package/src/platform-implementation-js/lib/idMap.js +45 -0
  323. package/src/platform-implementation-js/lib/imageRequest.js +8 -0
  324. package/src/platform-implementation-js/lib/incrementName.js +7 -0
  325. package/src/platform-implementation-js/lib/inject-script-EMBEDDED.js +14 -0
  326. package/src/platform-implementation-js/lib/inject-script.js +33 -0
  327. package/src/platform-implementation-js/lib/insert-link-chip-into-body.js +42 -57
  328. package/src/platform-implementation-js/lib/is-valid-app-id.js +27 -0
  329. package/src/platform-implementation-js/lib/is-valid-email.js +14 -0
  330. package/src/platform-implementation-js/lib/isNotNil.js +5 -0
  331. package/src/platform-implementation-js/lib/isStreakAppId.js +11 -0
  332. package/src/platform-implementation-js/lib/logger.js +441 -0
  333. package/src/platform-implementation-js/lib/make-revocable-function.js +19 -21
  334. package/src/platform-implementation-js/lib/make-revocable-function.test.js +20 -22
  335. package/src/platform-implementation-js/lib/parseParamsFromRouteID.js +15 -17
  336. package/src/platform-implementation-js/lib/parseParamsFromRouteID.test.js +9 -18
  337. package/src/platform-implementation-js/lib/persistent-queue.js +107 -0
  338. package/src/platform-implementation-js/lib/populateRouteID.js +8 -9
  339. package/src/platform-implementation-js/lib/populateRouteID.test.js +20 -19
  340. package/src/platform-implementation-js/lib/react/ElementContainer.js +23 -20
  341. package/src/platform-implementation-js/lib/rewriteCssWithIdMap.js +10 -9
  342. package/src/platform-implementation-js/lib/rewriteCssWithIdMap.test.js +13 -20
  343. package/src/platform-implementation-js/lib/routeIDmatchesHash.js +13 -18
  344. package/src/platform-implementation-js/lib/routeIDmatchesHash.test.js +11 -17
  345. package/src/platform-implementation-js/lib/safe-event-emitter.js +17 -0
  346. package/src/platform-implementation-js/lib/shared-style.js +14 -13
  347. package/src/platform-implementation-js/lib/stopper-pool.js +41 -0
  348. package/src/platform-implementation-js/lib/stream-wait-for.js +30 -0
  349. package/src/platform-implementation-js/lib/toItemWithLifetimeStream.js +18 -17
  350. package/src/platform-implementation-js/lib/toLiveSet.js +17 -15
  351. package/src/platform-implementation-js/lib/wait-for.js +28 -0
  352. package/src/platform-implementation-js/lib/waitForAsync.js +19 -0
  353. package/src/platform-implementation-js/main-INTEGRATED-PAGEWORLD.js +6 -5
  354. package/src/platform-implementation-js/main.js +9 -24
  355. package/src/platform-implementation-js/namespaces/app-menu.d.ts.map +1 -1
  356. package/src/platform-implementation-js/namespaces/app-menu.js +31 -0
  357. package/src/platform-implementation-js/namespaces/butter-bar.js +163 -0
  358. package/src/platform-implementation-js/namespaces/compose.js +37 -60
  359. package/src/platform-implementation-js/namespaces/conversations.js +52 -124
  360. package/src/platform-implementation-js/namespaces/global.js +27 -39
  361. package/src/platform-implementation-js/namespaces/keyboard.js +29 -33
  362. package/src/platform-implementation-js/namespaces/lists.js +25 -31
  363. package/src/platform-implementation-js/namespaces/modal.js +34 -28
  364. package/src/platform-implementation-js/namespaces/nav-menu.js +30 -45
  365. package/src/platform-implementation-js/namespaces/router.js +70 -137
  366. package/src/platform-implementation-js/namespaces/search.js +19 -17
  367. package/src/platform-implementation-js/namespaces/toolbars.js +71 -117
  368. package/src/platform-implementation-js/namespaces/user.js +36 -37
  369. package/src/platform-implementation-js/namespaces/widgets.js +54 -61
  370. package/src/platform-implementation-js/platform-implementation.js +98 -229
  371. package/src/platform-implementation-js/views/SimpleElementView.js +16 -0
  372. package/src/platform-implementation-js/views/app-menu-item-view.js +257 -0
  373. package/src/platform-implementation-js/views/app-toolbar-button-view.js +26 -47
  374. package/src/platform-implementation-js/views/collapsible-panel-view.js +222 -0
  375. package/src/platform-implementation-js/views/collapsible-section-view.js +66 -63
  376. package/src/platform-implementation-js/views/compose-button-view.js +45 -0
  377. package/src/platform-implementation-js/views/compose-view.js +312 -0
  378. package/src/platform-implementation-js/views/content-panel-view.js +28 -30
  379. package/src/platform-implementation-js/views/conversations/attachment-card-view.js +21 -44
  380. package/src/platform-implementation-js/views/conversations/custom-message-view.js +44 -104
  381. package/src/platform-implementation-js/views/conversations/message-view.js +131 -202
  382. package/src/platform-implementation-js/views/conversations/thread-view.js +75 -127
  383. package/src/platform-implementation-js/views/keyboard-shortcut-handle.js +14 -0
  384. package/src/platform-implementation-js/views/native-nav-item-view.js +32 -65
  385. package/src/platform-implementation-js/views/nav-item-view.js +51 -115
  386. package/src/platform-implementation-js/views/route-view/custom-route-view.js +25 -20
  387. package/src/platform-implementation-js/views/route-view/dummy-route-view-driver.js +18 -18
  388. package/src/platform-implementation-js/views/route-view/list-route-view.js +30 -52
  389. package/src/platform-implementation-js/views/route-view/route-view.js +24 -35
  390. package/src/platform-implementation-js/views/section-view.js +60 -52
  391. package/src/platform-implementation-js/views/thread-row-view.js +49 -74
  392. package/src/platform-implementation-js/widgets/buttons/basic-button-view-controller.js +39 -0
  393. package/src/platform-implementation-js/widgets/buttons/dropdown-button-view-controller.js +98 -0
  394. package/src/platform-implementation-js/widgets/buttons/dropdown-view.js +122 -0
  395. package/src/platform-implementation-js/widgets/drawer-view.js +29 -36
  396. package/src/platform-implementation-js/widgets/modal-view.js +39 -68
  397. package/src/platform-implementation-js/widgets/mole-view.js +22 -22
  398. package/src/platform-implementation-js/widgets/top-message-bar-view.js +13 -10
@@ -0,0 +1,38 @@
1
+ import last from 'lodash/last';
2
+ import * as Kefir from 'kefir';
3
+ import streamWaitFor from '../../../lib/stream-wait-for';
4
+ import makeMutationObserverChunkedStream from '../../../lib/dom/make-mutation-observer-chunked-stream';
5
+ import makeElementChildStream from '../../../lib/dom/make-element-child-stream';
6
+ export default function getMainContentElementChangedStream(GmailElementGetter) {
7
+ const s = waitForMainContentContainer(GmailElementGetter)
8
+ .flatMap((mainContentContainer) => makeElementChildStream(mainContentContainer)
9
+ .filter(({ el }) => el.classList.contains('nH'))
10
+ .flatMap(({ el, removalStream }) => makeMutationObserverChunkedStream(el, {
11
+ attributes: true,
12
+ attributeFilter: ['style'],
13
+ })
14
+ .map((x) => last(x))
15
+ .toProperty(() => {
16
+ return { target: el };
17
+ })
18
+ .filter(_isNowVisible)
19
+ .map((e) => e.target)
20
+ .takeUntilBy(removalStream)))
21
+ .toProperty();
22
+ // Make sure we always have a subscriber. The function breaks if it loses all
23
+ // subscribers and then re-gains some.
24
+ s.onValue(() => {
25
+ // ignore, just activate
26
+ });
27
+ return s;
28
+ }
29
+ function waitForMainContentContainer(GmailElementGetter) {
30
+ if (GmailElementGetter.isStandaloneComposeWindow()) {
31
+ return Kefir.never();
32
+ }
33
+ return streamWaitFor(() => GmailElementGetter.getMainContentContainer());
34
+ }
35
+ function _isNowVisible(mutation) {
36
+ const el = mutation.target;
37
+ return el.style.display !== 'none';
38
+ }
@@ -0,0 +1,12 @@
1
+ import once from 'lodash/once';
2
+ import makeMutationObserverChunkedStream from '../../../lib/dom/make-mutation-observer-chunked-stream';
3
+ const waitForGmailModeToSettle = once(() => makeMutationObserverChunkedStream(document.body, {
4
+ attributes: true,
5
+ attributeFilter: ['class'],
6
+ })
7
+ .toProperty(() => undefined)
8
+ .filter(() => document.body.classList.length > 0)
9
+ .map(() => undefined)
10
+ .take(1)
11
+ .toProperty());
12
+ export default waitForGmailModeToSettle;
@@ -0,0 +1,253 @@
1
+ import once from 'lodash/once';
2
+ import * as Kefir from 'kefir';
3
+ import makeElementChildStream from '../../lib/dom/make-element-child-stream';
4
+ import querySelector from '../../lib/dom/querySelectorOrFail';
5
+ import waitForGmailModeToSettle from './gmail-element-getter/wait-for-gmail-mode-to-settle';
6
+ import getMainContentElementChangedStream from './gmail-element-getter/get-main-content-element-changed-stream';
7
+ import isIntegratedViewGmail from './gmail-driver/isIntegratedViewGmail';
8
+ import Logger from '../../lib/logger';
9
+ import waitFor from '../../lib/wait-for';
10
+ // TODO Figure out if these functions can and should be able to return null
11
+ const GmailElementGetter = {
12
+ getActiveMoreMenu() {
13
+ const elements = document.querySelectorAll('.J-M.aX0.aYO.jQjAxd');
14
+ for (let ii = 0; ii < elements.length; ii++) {
15
+ if (elements[ii].style.display !== 'none') {
16
+ return elements[ii];
17
+ }
18
+ }
19
+ return null;
20
+ },
21
+ getAddonSidebarContainerElement() {
22
+ // only for Gmailv1 + Gmailv2-before-2018-07-30?
23
+ return document.querySelector('.no > .nn.bnl');
24
+ },
25
+ getCompanionSidebarContentContainerElement() {
26
+ return document.querySelector('.brC-brG');
27
+ },
28
+ // <div class="brC-aT5-aOt-Jw" role="navigation" aria-label="Side panel">
29
+ getCompanionSidebarIconContainerElement() {
30
+ return document.querySelector('.brC-aT5-aOt-Jw');
31
+ },
32
+ getComposeButton() {
33
+ if (isIntegratedViewGmail()) {
34
+ return document.querySelector('.aIH .aic div[role=button].L3');
35
+ }
36
+ return document.querySelector('[gh=cm]');
37
+ },
38
+ getComposeWindowContainer() {
39
+ return document.querySelector('.dw .nH > .nH > .no');
40
+ },
41
+ getContentSectionElement() {
42
+ // New method for finding the content section element that also supports
43
+ // Gmail integrated view. Use it if we're in Gmail integrated view.
44
+ // Otherwise, use the old method, but log a warning if the old method
45
+ // finds something different than the old method, so that way we can
46
+ // figure out if it's okay to swap over.
47
+ const el = document.querySelector('div.nH.bkK > .nH');
48
+ if (isIntegratedViewGmail()) {
49
+ return el;
50
+ }
51
+ else {
52
+ const leftNavContainer = GmailElementGetter.getLeftNavContainerElement();
53
+ const oldMethodEl = leftNavContainer
54
+ ? leftNavContainer.nextElementSibling.children[0]
55
+ : null;
56
+ if (el !== oldMethodEl) {
57
+ Logger.error(new Error('getContentSectionElement old and new method inconsistency'), {
58
+ elClassName: el?.className,
59
+ oldMethodClassName: oldMethodEl?.className,
60
+ });
61
+ }
62
+ return oldMethodEl;
63
+ }
64
+ },
65
+ getFullscreenComposeWindowContainer() {
66
+ return document.querySelector('.aSs .aSt');
67
+ },
68
+ getFullscreenComposeWindowContainerStream() {
69
+ if (!document.body)
70
+ throw new Error();
71
+ return (makeElementChildStream(document.body)
72
+ .filter(({ el }) => el.classList.contains('aSs'))
73
+ .flatMap(({ el, removalStream }) => makeElementChildStream(el).takeUntilBy(removalStream))
74
+ .filter(({ el }) => el.classList.contains('aSt'))
75
+ // Assume that only one element will come through and will never be removed from the page.
76
+ .take(1)
77
+ .map(({ el }) => ({ el, removalStream: Kefir.never() }))
78
+ .toProperty());
79
+ },
80
+ getGtalkButtons() {
81
+ return document.querySelector('.aeN .aj5.J-KU-Jg');
82
+ },
83
+ getLeftNavContainerElement() {
84
+ if (isIntegratedViewGmail()) {
85
+ return document.querySelector('div[role=navigation] + div.aqn');
86
+ }
87
+ return document.querySelector('.aeN');
88
+ },
89
+ getLeftNavHeightElement() {
90
+ return document.querySelector('.aeN');
91
+ },
92
+ getMainContentBodyContainerElement() {
93
+ return document.querySelector('.no > .nn.bkK');
94
+ },
95
+ getMainContentContainer() {
96
+ // This method used to just look for the div[role=main] element and then
97
+ // return its parent, but it turns out the Contacts page does not set
98
+ // role=main.
99
+ return document.querySelector('div.aeF > div.nH');
100
+ },
101
+ getMainContentElementChangedStream: once(function () {
102
+ return getMainContentElementChangedStream(this);
103
+ }),
104
+ getMoleParent() {
105
+ return document.body.querySelector('.dw .nH > .nH > .no');
106
+ },
107
+ // This function checks whether we should use the old InboxSDK style of adding nav items
108
+ // inline among Gmail's nav items (as opposed to the newer style where we put our nav items
109
+ // in their own sections at the bottom of the leftnav).
110
+ shouldAddNavItemsInline() {
111
+ // There's three cases this function should return true:
112
+ // - The user is in a pre-Google-Chat Hangouts-only version of Gmail (the Gmail Settings ->
113
+ // Chat and Meet -> Chat menu only has the options "Hangouts On" and "Hangouts Off").
114
+ // - The user has "Classic Hangouts" picked in Gmail Settings -> Chat and Meet -> Chat.
115
+ // - Integrated view gmail.
116
+ if (isIntegratedViewGmail()) {
117
+ return true;
118
+ }
119
+ const leftNavElement = document.querySelector('.aeN[role=navigation], .aeN [role=navigation]');
120
+ if (!leftNavElement) {
121
+ throw new Error('shouldAddNavItemsInline failed to find leftNavElement');
122
+ }
123
+ // leftNavElement classnames depending on gmail chat & meet settings:
124
+ // Old Hangouts-only Gmail
125
+ // div.aeN.WR.nH.oy8Mbf.nn
126
+ // (looks identical to current Gmail's chat-off-meet-off setup, but there are important
127
+ // CSS differences inside the element!)
128
+ // ===================
129
+ // No classname difference between open/collapsed
130
+ // div.ajl.aib.aZ6 (classic hangouts on left or right, google meet on/off)
131
+ // ===================
132
+ // Collapsed gets .bhZ class added
133
+ // div.aeN.WR.nH.oy8Mbf.nn (chat off, google meet off)
134
+ // div.aeN.WR.BaIAZe.anZ.nH.oy8Mbf.nn (chat off, google meet on)
135
+ // div.aeN.WR.anZ.nH.oy8Mbf.nn (google chat on left, google meet on/off)
136
+ // div.aeN.WR.ahu.nH.oy8Mbf.nn (google chat on right, google meet on/off)
137
+ if (leftNavElement.classList.contains('aZ6')) {
138
+ return true;
139
+ }
140
+ else {
141
+ return false;
142
+ }
143
+ },
144
+ getAppMenuAsync: once(async () => {
145
+ if (!GmailElementGetter.isStandalone()) {
146
+ await GmailElementGetter.waitForGmailModeToSettle();
147
+ /**
148
+ * The selector for the new app menu https://support.google.com/mail/answer/11555490 -- FEB 2023
149
+ */
150
+ const APP_MENU = '.aeN.WR.a6o.anZ.nH.oy8Mbf[role=navigation]';
151
+ /**
152
+ * If the APP_MENU selector is not found, NAV_MENU _might_ be present.
153
+ */
154
+ const NAV_MENU = '.aeN.WR.nH.oy8Mbf[role=navigation]';
155
+ try {
156
+ const element = await waitFor(() => document.querySelector(`${APP_MENU}, ${NAV_MENU}`));
157
+ if (!document.querySelector(APP_MENU)) {
158
+ return;
159
+ }
160
+ return element;
161
+ }
162
+ catch (e) {
163
+ Logger.error(e);
164
+ }
165
+ }
166
+ }),
167
+ getAppMenuContainer() {
168
+ return document.querySelector('.aqk.aql.bkL');
169
+ },
170
+ // TODO figure out if we use it
171
+ // getNavMenu() {
172
+ // return document.querySelector('.aeN.WR.nH.oy8Mbf[role=navigation]');
173
+ // },
174
+ getSeparateSectionNavItemMenuInjectionContainer() {
175
+ return document.querySelector('.aeN');
176
+ },
177
+ getSameSectionNavItemMenuInjectionContainer() {
178
+ if (isIntegratedViewGmail()) {
179
+ return document.querySelector('.yJ .wT > .n3');
180
+ }
181
+ else {
182
+ return document.querySelector('.aeN .n3');
183
+ }
184
+ },
185
+ getRowListElements() {
186
+ return Array.from(document.querySelectorAll('[gh=tl]'));
187
+ },
188
+ getScrollContainer() {
189
+ return document.querySelector('div.Tm.aeJ');
190
+ },
191
+ getSearchInput() {
192
+ return document.querySelector('form[role=search] input');
193
+ },
194
+ getSearchSuggestionsBoxParent() {
195
+ return document.querySelector('table.gstl_50 > tbody > tr > td.gssb_e');
196
+ },
197
+ getSidebarContainerElement() {
198
+ return document.querySelector('[role=main] table.Bs > tr .y3');
199
+ },
200
+ getThreadBackButton() {
201
+ let toolbarElement;
202
+ try {
203
+ toolbarElement = GmailElementGetter.getToolbarElement();
204
+ }
205
+ catch (err) {
206
+ return null;
207
+ }
208
+ return toolbarElement.querySelector('.lS');
209
+ },
210
+ getThreadContainerElement() {
211
+ return document.querySelector('[role=main] .g.id table.Bs > tr');
212
+ },
213
+ getToolbarElement() {
214
+ return querySelector(document, '[gh=tm]');
215
+ },
216
+ getTopAccountContainer() {
217
+ return document.querySelector('header[role="banner"] > div:nth-child(2) > div:nth-child(2)');
218
+ },
219
+ isGplusEnabled() {
220
+ const topAccountContainer = GmailElementGetter.getTopAccountContainer();
221
+ if (!topAccountContainer) {
222
+ return false;
223
+ }
224
+ return (topAccountContainer.querySelectorAll('a[href*="https://plus"][href*="upgrade"]').length === 0);
225
+ },
226
+ isDarkTheme() {
227
+ return document.body.classList.contains('inboxsdk__gmail_dark_theme');
228
+ },
229
+ isPreviewPane() {
230
+ return !!document.querySelector('.aia');
231
+ },
232
+ isStandalone() {
233
+ return this.isStandaloneComposeWindow() || this.isStandaloneThreadWindow();
234
+ },
235
+ isStandaloneComposeWindow() {
236
+ return (document.body.classList.contains('xE') &&
237
+ document.body.classList.contains('xp'));
238
+ },
239
+ isStandaloneThreadWindow() {
240
+ return (document.body.classList.contains('aAU') &&
241
+ document.body.classList.contains('xE') &&
242
+ document.body.classList.contains('Su'));
243
+ },
244
+ StandaloneCompose: {
245
+ getComposeWindowContainer() {
246
+ return document.querySelector('[role=main]');
247
+ },
248
+ },
249
+ waitForGmailModeToSettle() {
250
+ return waitForGmailModeToSettle().toPromise();
251
+ },
252
+ };
253
+ export default GmailElementGetter;
@@ -0,0 +1,200 @@
1
+ import CommonPageCommunicator from '../../lib/common-page-communicator';
2
+ import makeMutationObserverChunkedStream from '../../lib/dom/make-mutation-observer-chunked-stream';
3
+ import Kefir from 'kefir';
4
+ // This is intended to be instantiated from makeXhrInterceptor, since it depends
5
+ // on the injected script, and if it's not instantiated elsewhere, you know that
6
+ // if you have an instance of this, then the injected script is present and this
7
+ // will work.
8
+ export default class GmailPageCommunicator extends CommonPageCommunicator {
9
+ async getMessageDate(threadId, message) {
10
+ return this._getMessageData(threadId, message, 'data-inboxsdk-sortdate', 'inboxSDKtellMeThisMessageDate');
11
+ }
12
+ async getMessageRecipients(threadId, message) {
13
+ return this._getMessageData(threadId, message, 'data-inboxsdk-recipients', 'inboxSDKtellMeThisMessageRecipients');
14
+ }
15
+ async _getMessageData(threadId, message, attribute, eventName) {
16
+ let data = message.getAttribute(attribute);
17
+ if (!data) {
18
+ const [btaiHeader, xsrfToken] = this.isUsingSyncAPI()
19
+ ? await Promise.all([this.getBtaiHeader(), this.getXsrfToken()])
20
+ : [null, null];
21
+ message.dispatchEvent(new CustomEvent(eventName, {
22
+ bubbles: true,
23
+ cancelable: false,
24
+ detail: {
25
+ threadId,
26
+ ikValue: this.getIkValue(),
27
+ btaiHeader,
28
+ xsrfToken,
29
+ },
30
+ }));
31
+ data = message.getAttribute(attribute);
32
+ if (!data) {
33
+ await makeMutationObserverChunkedStream(message, {
34
+ attributes: true,
35
+ attributeFilter: [attribute],
36
+ })
37
+ .take(1)
38
+ .toPromise();
39
+ data = message.getAttribute(attribute);
40
+ }
41
+ }
42
+ if (data && data !== 'error')
43
+ return JSON.parse(data);
44
+ else
45
+ return null;
46
+ }
47
+ getThreadIdForThreadRowByDatabase(threadRow) {
48
+ let threadid = threadRow.getAttribute('data-inboxsdk-threadid');
49
+ if (!threadid) {
50
+ threadRow.dispatchEvent(new CustomEvent('inboxSDKtellMeThisThreadIdByDatabase', {
51
+ bubbles: true,
52
+ cancelable: false,
53
+ detail: null,
54
+ }));
55
+ threadid = threadRow.getAttribute('data-inboxsdk-threadid');
56
+ }
57
+ return threadid;
58
+ }
59
+ getThreadIdForThreadRowByClick(threadRow) {
60
+ let threadid = threadRow.getAttribute('data-inboxsdk-threadid');
61
+ if (!threadid) {
62
+ threadRow.dispatchEvent(new CustomEvent('inboxSDKtellMeThisThreadIdByClick', {
63
+ bubbles: true,
64
+ cancelable: false,
65
+ detail: null,
66
+ }));
67
+ threadid = threadRow.getAttribute('data-inboxsdk-threadid');
68
+ }
69
+ return threadid;
70
+ }
71
+ getCurrentThreadID(threadContainerElement, isPreviewedThread = false) {
72
+ threadContainerElement.dispatchEvent(new CustomEvent('inboxSDKtellMeCurrentThreadId', {
73
+ bubbles: true,
74
+ cancelable: false,
75
+ detail: { isPreviewedThread },
76
+ }));
77
+ const s = threadContainerElement.getAttribute('data-inboxsdk-currentthreadid');
78
+ if (s == null)
79
+ throw new Error('Failed to read value');
80
+ return s;
81
+ }
82
+ getUserOriginalPreviewPaneMode() {
83
+ return document.head.getAttribute('data-inboxsdk-user-preview-pane-mode');
84
+ }
85
+ getActionTokenValue() {
86
+ const s = document.head.getAttribute('data-inboxsdk-action-token-value');
87
+ if (s == null)
88
+ throw new Error('Failed to read value');
89
+ return s;
90
+ }
91
+ isUsingSyncAPI() {
92
+ const s = document.head.getAttribute('data-inboxsdk-using-sync-api');
93
+ if (s == null)
94
+ throw new Error('Failed to read value');
95
+ return s === 'true';
96
+ }
97
+ isConversationViewDisabled() {
98
+ return new Promise((resolve) => {
99
+ Kefir.fromEvents(document, 'inboxSDKgmonkeyResponse')
100
+ .take(1)
101
+ .onValue((event) => {
102
+ resolve(event.detail);
103
+ });
104
+ document.dispatchEvent(new CustomEvent('inboxSDKtellMeIsConversationViewDisabled', {
105
+ bubbles: false,
106
+ cancelable: false,
107
+ detail: null,
108
+ }));
109
+ });
110
+ }
111
+ registerSuggestionsModifier(providerID) {
112
+ document.dispatchEvent(new CustomEvent('inboxSDKregisterSuggestionsModifier', {
113
+ bubbles: false,
114
+ cancelable: false,
115
+ detail: { providerID },
116
+ }));
117
+ }
118
+ provideAutocompleteSuggestions(providerID, query, suggestions) {
119
+ document.dispatchEvent(new CustomEvent('inboxSDKprovideSuggestions', {
120
+ bubbles: false,
121
+ cancelable: false,
122
+ detail: {
123
+ providerID,
124
+ query,
125
+ // Filter out non-JSONifiable things
126
+ suggestions: JSON.parse(JSON.stringify(suggestions)),
127
+ },
128
+ }));
129
+ }
130
+ setupCustomListResultsQuery(query) {
131
+ document.dispatchEvent(new CustomEvent('inboxSDKcustomListRegisterQuery', {
132
+ bubbles: false,
133
+ cancelable: false,
134
+ detail: { query },
135
+ }));
136
+ }
137
+ setCustomListNewQuery(detail) {
138
+ document.dispatchEvent(new CustomEvent('inboxSDKcustomListNewQuery', {
139
+ bubbles: false,
140
+ cancelable: false,
141
+ detail,
142
+ }));
143
+ }
144
+ setCustomListResults(query, newResults) {
145
+ document.dispatchEvent(new CustomEvent('inboxSDKcustomListResults', {
146
+ bubbles: false,
147
+ cancelable: false,
148
+ detail: { query, newResults },
149
+ }));
150
+ }
151
+ createCustomSearchTerm(term) {
152
+ document.dispatchEvent(new CustomEvent('inboxSDKcreateCustomSearchTerm', {
153
+ bubbles: false,
154
+ cancelable: false,
155
+ detail: { term },
156
+ }));
157
+ }
158
+ setSearchQueryReplacement(query, newQuery) {
159
+ document.dispatchEvent(new CustomEvent('inboxSDKsearchReplacementReady', {
160
+ bubbles: false,
161
+ cancelable: false,
162
+ detail: { query, newQuery },
163
+ }));
164
+ }
165
+ registerComposeRequestModifier(keyId, appId) {
166
+ const modifierId = new Date().getTime() + '_' + appId + '_' + Math.random();
167
+ const detail = { modifierId };
168
+ if (this.isUsingSyncAPI()) {
169
+ detail.draftID = keyId;
170
+ }
171
+ else {
172
+ detail.composeid = keyId;
173
+ }
174
+ document.dispatchEvent(new CustomEvent('inboxSDKregisterComposeRequestModifier', {
175
+ detail,
176
+ bubbles: false,
177
+ cancelable: false,
178
+ }));
179
+ return modifierId;
180
+ }
181
+ unregisterComposeRequestModifier(keyId, modifierId) {
182
+ document.dispatchEvent(new CustomEvent('inboxSDKunregisterComposeRequestModifier', {
183
+ detail: { keyId, modifierId },
184
+ bubbles: false,
185
+ cancelable: false,
186
+ }));
187
+ }
188
+ modifyComposeRequest(keyId, modifierId, composeParams) {
189
+ const detail = { modifierId, composeParams };
190
+ if (this.isUsingSyncAPI())
191
+ detail.draftID = keyId;
192
+ else
193
+ detail.composeid = keyId;
194
+ document.dispatchEvent(new CustomEvent('inboxSDKcomposeRequestModified', {
195
+ detail,
196
+ bubbles: false,
197
+ cancelable: false,
198
+ }));
199
+ }
200
+ }