@inboxsdk/core 2.2.26 → 2.2.27

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.
package/inboxsdk.js CHANGED
@@ -18054,7 +18054,7 @@ options.insert = htmlElement => {
18054
18054
  htmlElement.setAttribute('data-inboxsdk-version',
18055
18055
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- this is injected by webpack
18056
18056
  ///@ts-ignore
18057
- "2.2.26-1789683530517-1719c06893255687");
18057
+ "2.2.27-1790289405402-94d8cee7e8e37c39");
18058
18058
  document.head.append(htmlElement);
18059
18059
  };
18060
18060
  options.domAPI = (styleDomAPI_default());
@@ -25779,7 +25779,7 @@ module.exports = assocIndexOf;
25779
25779
 
25780
25780
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- SDK_VERSION is injected by webpack
25781
25781
  ///@ts-ignore
25782
- const BUILD_VERSION = "2.2.26-1789683530517-1719c06893255687";
25782
+ const BUILD_VERSION = "2.2.27-1790289405402-94d8cee7e8e37c39";
25783
25783
  if (false) {}
25784
25784
 
25785
25785
  /***/ }),
@@ -27571,7 +27571,7 @@ options.insert = htmlElement => {
27571
27571
  htmlElement.setAttribute('data-inboxsdk-version',
27572
27572
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- this is injected by webpack
27573
27573
  ///@ts-ignore
27574
- "2.2.26-1789683530517-1719c06893255687");
27574
+ "2.2.27-1790289405402-94d8cee7e8e37c39");
27575
27575
  document.head.append(htmlElement);
27576
27576
  };
27577
27577
  options.domAPI = (styleDomAPI_default());
@@ -45927,7 +45927,6 @@ function reemitClickEvent(event) {
45927
45927
 
45928
45928
 
45929
45929
 
45930
-
45931
45930
  let hasSeenOldElement = false;
45932
45931
  const MORE_MENU_WAIT_TIMEOUT = 5 * 1000;
45933
45932
  const MORE_MENU_WAIT_STEP = 16;
@@ -45970,7 +45969,7 @@ class GmailMessageView {
45970
45969
  // client side, so the new message added (from your reply) shows up in the UI right away and has a data-message-id but
45971
45970
  // because it hasn't been synced to the server it does not have a data-legacy-messag-id
45972
45971
  // so we wait until the message has been synced to the server before saying this is ready
45973
- const messageIdElement = this.#element.querySelector('[data-message-id]');
45972
+ const messageIdElement = this.#driver.selectors.querySelectorByKey(this.#element, 'messageView.syncIdElement');
45974
45973
  if (messageIdElement) {
45975
45974
  const syncMessageId = messageIdElement.getAttribute('data-message-id');
45976
45975
  if (!syncMessageId) throw new Error('data-message-id attribute has no value');
@@ -46054,7 +46053,7 @@ class GmailMessageView {
46054
46053
  getRecipients() {
46055
46054
  let recipients = this.#recipients;
46056
46055
  if (recipients) return recipients;
46057
- const receipientSpans = Array.from(this.#element.querySelectorAll('.hb span[email]'));
46056
+ const receipientSpans = this.#driver.selectors.querySelectorAllByKey(this.#element, 'messageView.recipientSpans');
46058
46057
  recipients = this.#recipients = receipientSpans.map(span => {
46059
46058
  return this.#getUpdatedContact({
46060
46059
  name: span.getAttribute('name'),
@@ -46066,7 +46065,7 @@ class GmailMessageView {
46066
46065
  getRecipientEmailAddresses() {
46067
46066
  let recipients = this.#recipientEmailAddresses;
46068
46067
  if (recipients) return recipients;
46069
- const receipientSpans = Array.from(this.#element.querySelectorAll('.hb span[email]'));
46068
+ const receipientSpans = this.#driver.selectors.querySelectorAllByKey(this.#element, 'messageView.recipientSpans');
46070
46069
  recipients = this.#recipientEmailAddresses = receipientSpans.map(span => span.getAttribute('email') || '');
46071
46070
  return recipients;
46072
46071
  }
@@ -46207,7 +46206,7 @@ class GmailMessageView {
46207
46206
  if (!ignoreLoadStatus && !this.#messageLoaded) {
46208
46207
  throw new Error('tried to get message id before message is loaded');
46209
46208
  }
46210
- const messageIdElement = this.#element.querySelector('[data-legacy-message-id]');
46209
+ const messageIdElement = this.#driver.selectors.querySelectorByKey(this.#element, 'messageView.legacyIdElement');
46211
46210
  if (messageIdElement) {
46212
46211
  const messageId = messageIdElement.getAttribute('data-legacy-message-id');
46213
46212
  if (!messageId) throw new Error('message id attribute with no value, wtf?');
@@ -46294,9 +46293,9 @@ class GmailMessageView {
46294
46293
  } else {
46295
46294
  let attachmentDiv;
46296
46295
  if (this.getViewState() === 'COLLAPSED') {
46297
- attachmentDiv = (0,querySelectorOrFail/* default */.A)(this.#element, '.adf.ads td.gH span');
46296
+ attachmentDiv = this.#driver.selectors.querySelectorByKeyOrFail(this.#element, 'messageView.attachmentIconSlotCollapsed');
46298
46297
  } else {
46299
- attachmentDiv = (0,querySelectorOrFail/* default */.A)(this.#element, 'td.gH div.gK span');
46298
+ attachmentDiv = this.#driver.selectors.querySelectorByKeyOrFail(this.#element, 'messageView.attachmentIconSlot');
46300
46299
  }
46301
46300
  const img = opts.iconHtml != null ? getCustomIconWrapper() : getImgElement();
46302
46301
  const onClick = opts.onClick;
@@ -46457,7 +46456,7 @@ class GmailMessageView {
46457
46456
  this.#setupReplyStream();
46458
46457
  }
46459
46458
  #setupReplyStream() {
46460
- const replyContainer = this.#element.querySelector('.ip');
46459
+ const replyContainer = this.#driver.selectors.querySelectorByKey(this.#element, 'messageView.replyContainer');
46461
46460
  if (!replyContainer) {
46462
46461
  return;
46463
46462
  }
@@ -46510,7 +46509,7 @@ class GmailMessageView {
46510
46509
  if (!self.#element.classList.contains('h7')) {
46511
46510
  contactType = 'sender';
46512
46511
  } else {
46513
- if (self.#element.querySelector('h3.iw').contains(element)) {
46512
+ if (self.#driver.selectors.querySelectorByKeyOrFail(self.#element, 'messageView.senderHeading').contains(element)) {
46514
46513
  contactType = 'sender';
46515
46514
  } else {
46516
46515
  contactType = 'recipient';
@@ -46527,14 +46526,15 @@ class GmailMessageView {
46527
46526
  }));
46528
46527
  }
46529
46528
  #getAttachmentArea() {
46530
- if (this.#element.querySelector('.hq')) {
46531
- return new gmail_attachment_area_view(this.#element.querySelector('.hq'), this.#driver, this);
46529
+ const attachmentArea = this.#driver.selectors.querySelectorByKey(this.#element, 'messageView.attachmentArea');
46530
+ if (attachmentArea) {
46531
+ return new gmail_attachment_area_view(attachmentArea, this.#driver, this);
46532
46532
  }
46533
46533
  return null;
46534
46534
  }
46535
46535
  #createAttachmentArea() {
46536
46536
  const gmailAttachmentAreaView = new gmail_attachment_area_view(null, this.#driver, this);
46537
- const beforeElement = (0,querySelectorOrFail/* default */.A)(this.#element, '.hi');
46537
+ const beforeElement = this.#driver.selectors.querySelectorByKeyOrFail(this.#element, 'messageView.attachmentAreaAnchor');
46538
46538
  const parentNode = beforeElement.parentNode;
46539
46539
  if (!parentNode) throw new Error('parentNode not found');
46540
46540
  parentNode.insertBefore(gmailAttachmentAreaView.getElement(), beforeElement);
@@ -47410,39 +47410,19 @@ class GmailThreadView {
47410
47410
  const sidebar = this.#driver.getGlobalSidebar();
47411
47411
  return sidebar.addThreadSidebarContentPanel(descriptor, this);
47412
47412
  }
47413
- #subjectContainerSelectors = {
47414
- '2022_10_21': '.a98.iY > .nH',
47415
- '2022_10_12': '.PeIF1d > .nH',
47416
- [2018]: '.if > .nH'
47417
- };
47418
- #subjectContainerSelectorsAfterNov162023 = {
47419
- '2023_11_16': '* > .nH'
47420
- };
47421
47413
  #subjectAISuggestionsContainerSelectors = {
47422
47414
  '2024_04_26': '.nH > .einvLd'
47423
47415
  };
47424
47416
  addNoticeBar() {
47425
47417
  const el = document.createElement('div');
47426
47418
  el.className = (0,idMap/* default */.A)('thread_noticeBar');
47427
- let version;
47428
- let subjectContainer;
47429
- let selectorsToTry = this.#subjectContainerSelectors;
47430
- if (this.#element.matches('.a98.iY')) {
47431
- // thread view gmail update Nov 16, 2023
47432
- selectorsToTry = this.#subjectContainerSelectorsAfterNov162023;
47433
- }
47434
- for (const [currentVersion, selector] of Object.entries(selectorsToTry)) {
47435
- const el = this.#element.querySelector(selector);
47436
- if (!el) {
47437
- continue;
47438
- }
47439
- version = currentVersion;
47440
- subjectContainer = el;
47441
- break;
47442
- }
47419
+
47420
+ // `.a98.iY` is the thread view gmail update Nov 16, 2023
47421
+ const subjectContainerKey = this.#element.matches('.a98.iY') ? 'threadView.subjectContainer' : 'threadView.subjectContainerLegacy';
47422
+ const subjectContainer = this.#driver.selectors.querySelectorByKey(this.#element, subjectContainerKey);
47443
47423
  if (!subjectContainer) throw new Error('Failed to find subject container');
47444
47424
  this.#driver.getLogger().eventSdkPassive('addNoticeBar subjectContainer', {
47445
- version
47425
+ version: subjectContainerKey
47446
47426
  });
47447
47427
 
47448
47428
  // AI suggestions container could be rendered after the subject container so
@@ -47473,7 +47453,7 @@ class GmailThreadView {
47473
47453
  if (!parentElement) throw new Error('missing parent element');
47474
47454
  const customMessageView = new CustomMessageView(descriptorStream, () => {
47475
47455
  this.#readyStream.onValue(async () => {
47476
- const messageContainer = this.#element.querySelector('[role=list]');
47456
+ const messageContainer = this.#driver.selectors.querySelectorByKey(this.#element, 'threadView.messageList');
47477
47457
  if (!messageContainer) return;
47478
47458
  let mostRecentDate = Number.MIN_SAFE_INTEGER;
47479
47459
  let insertBeforeMessage;
@@ -47523,7 +47503,7 @@ class GmailThreadView {
47523
47503
  customMessageView.getElement().classList.add('inboxsdk__custom_message_view_hidden');
47524
47504
 
47525
47505
  // get the message element that contains the hidden messages notice
47526
- let hiddenNoticeMessageElement = this.#element.querySelector('.adv');
47506
+ let hiddenNoticeMessageElement = this.#driver.selectors.querySelectorByKey(this.#element, 'threadView.hiddenNoticeMessage');
47527
47507
  let nativeHiddenNoticePresent = true;
47528
47508
  if (!hiddenNoticeMessageElement) {
47529
47509
  nativeHiddenNoticePresent = false;
@@ -47562,7 +47542,7 @@ class GmailThreadView {
47562
47542
  const numberCustomHiddenMessages = this.#hiddenCustomMessageViews.size;
47563
47543
  let numberNativeHiddenMessages = null;
47564
47544
  if (nativeHiddenNoticePresent) {
47565
- const nativeHiddenNoticeCountSpan = (0,querySelectorOrFail/* default */.A)(hiddenNoticeMessageElement, '.adx span');
47545
+ const nativeHiddenNoticeCountSpan = this.#driver.selectors.querySelectorByKeyOrFail(hiddenNoticeMessageElement, 'threadView.hiddenNoticeCount');
47566
47546
  numberNativeHiddenMessages = Number(nativeHiddenNoticeCountSpan.innerHTML);
47567
47547
  if (isNaN(numberNativeHiddenMessages)) {
47568
47548
  throw new Error("Couldn't find number of native hidden messages in dom structure");
@@ -47578,7 +47558,7 @@ class GmailThreadView {
47578
47558
  if (!nativeHiddenNoticePresent) {
47579
47559
  const fakeAppNoticeElement = document.createElement('span');
47580
47560
  fakeAppNoticeElement.classList.add('adx');
47581
- const insertionPoint = (0,querySelectorOrFail/* default */.A)(hiddenNoticeMessageElement, '.G3');
47561
+ const insertionPoint = this.#driver.selectors.querySelectorByKeyOrFail(hiddenNoticeMessageElement, 'threadView.hiddenNoticeSlot');
47582
47562
  insertionPoint.appendChild(fakeAppNoticeElement);
47583
47563
  }
47584
47564
  const hiddenNoticeElement = (0,querySelectorOrFail/* default */.A)(hiddenNoticeMessageElement, '.adx');
@@ -47661,7 +47641,7 @@ class GmailThreadView {
47661
47641
  if (this.#threadID) return this.#threadID;else throw new Error('Failed to get id for thread');
47662
47642
  }
47663
47643
  addLabel() {
47664
- const labelContainer = this.#element.querySelector('.ha .J-J5-Ji');
47644
+ const labelContainer = this.#driver.selectors.querySelectorByKey(this.#element, 'threadView.labelContainer');
47665
47645
  if (!labelContainer) {
47666
47646
  throw new Error('Thread view label container not found');
47667
47647
  }
@@ -47685,9 +47665,9 @@ class GmailThreadView {
47685
47665
  return view;
47686
47666
  }
47687
47667
  addSubjectButton(button) {
47688
- const subjectParent = this.#element.querySelector('.V8djrc.byY');
47668
+ const subjectParent = this.#driver.selectors.querySelectorByKey(this.#element, 'threadView.subjectParent');
47689
47669
  if (!subjectParent) {
47690
- throw new querySelectorOrFail/* SelectorError */.a('.V8djrc.byY', {
47670
+ throw new querySelectorOrFail/* SelectorError */.a('threadView.subjectParent', {
47691
47671
  cause: 'Subject wrapper element not found'
47692
47672
  });
47693
47673
  }
@@ -47724,13 +47704,12 @@ class GmailThreadView {
47724
47704
  return new basic_button_view_controller/* default */.A(buttonOptions);
47725
47705
  }
47726
47706
  addFooterButton(button) {
47727
- const messagesSelector = 'div.nH .aHU';
47728
- const messagesContainer = this.#element.querySelector(messagesSelector);
47707
+ const messagesContainer = this.#driver.selectors.querySelectorByKey(this.#element, 'threadView.messagesContainer');
47729
47708
  if (!messagesContainer) {
47730
47709
  this.#driver.getLogger().eventSdkPassive('Footer button selector fail', {
47731
47710
  html: (0,censorHTMLtree/* default */.A)(this.#element)
47732
47711
  });
47733
- throw new querySelectorOrFail/* SelectorError */.a(messagesSelector, {
47712
+ throw new querySelectorOrFail/* SelectorError */.a('threadView.messagesContainer', {
47734
47713
  cause: 'Last message footer element not found'
47735
47714
  });
47736
47715
  }
@@ -47806,8 +47785,7 @@ class GmailThreadView {
47806
47785
  return null;
47807
47786
  }
47808
47787
  #findSubjectToolbarElement() {
47809
- var toolbarContainerElement = this.#element.querySelector('.bHJ');
47810
- return toolbarContainerElement;
47788
+ return this.#driver.selectors.querySelectorByKey(this.#element, 'threadView.subjectToolbar');
47811
47789
  }
47812
47790
  #findBottomReplyToolbarElement() {
47813
47791
  // Get all .amn elements (may exist in multiple locations due to A/B testing)
@@ -47849,7 +47827,7 @@ class GmailThreadView {
47849
47827
  return false;
47850
47828
  }
47851
47829
  #setupMessageViewStream() {
47852
- var openMessage = this.#element.querySelector('.h7');
47830
+ var openMessage = this.#driver.selectors.querySelectorByKey(this.#element, 'threadView.openMessage');
47853
47831
  if (!openMessage) {
47854
47832
  var self = this;
47855
47833
  setTimeout(function () {
@@ -47932,7 +47910,7 @@ class GmailThreadView {
47932
47910
  }
47933
47911
  #listenToExpandCollapseAll() {
47934
47912
  //expand all
47935
- const expandAllElementImg = this.#element.querySelector('img.gx');
47913
+ const expandAllElementImg = this.#driver.selectors.querySelectorByKey(this.#element, 'threadView.expandAllButton');
47936
47914
  if (expandAllElementImg) {
47937
47915
  const expandAllElement = findParent(expandAllElementImg, el => el.getAttribute('role') === 'button');
47938
47916
  if (expandAllElement) {
@@ -47946,7 +47924,7 @@ class GmailThreadView {
47946
47924
  }
47947
47925
 
47948
47926
  //collapse all
47949
- const collapseAllElementImg = this.#element.querySelector('img.gq');
47927
+ const collapseAllElementImg = this.#driver.selectors.querySelectorByKey(this.#element, 'threadView.collapseAllButton');
47950
47928
  if (collapseAllElementImg) {
47951
47929
  const collapseAllElement = findParent(collapseAllElementImg, el => el.getAttribute('role') === 'button');
47952
47930
  if (collapseAllElement) {
@@ -48274,7 +48252,7 @@ options.insert = htmlElement => {
48274
48252
  htmlElement.setAttribute('data-inboxsdk-version',
48275
48253
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- this is injected by webpack
48276
48254
  ///@ts-ignore
48277
- "2.2.26-1789683530517-1719c06893255687");
48255
+ "2.2.27-1790289405402-94d8cee7e8e37c39");
48278
48256
  document.head.append(htmlElement);
48279
48257
  };
48280
48258
  options.domAPI = (styleDomAPI_default());
@@ -53113,7 +53091,7 @@ mole_view_module_options.insert = htmlElement => {
53113
53091
  htmlElement.setAttribute('data-inboxsdk-version',
53114
53092
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- this is injected by webpack
53115
53093
  ///@ts-ignore
53116
- "2.2.26-1789683530517-1719c06893255687");
53094
+ "2.2.27-1790289405402-94d8cee7e8e37c39");
53117
53095
  document.head.append(htmlElement);
53118
53096
  };
53119
53097
  mole_view_module_options.domAPI = (styleDomAPI_default());
@@ -57544,12 +57522,140 @@ const GMAIL_SELECTORS = {
57544
57522
  * Root: message element.
57545
57523
  */
57546
57524
  'messageView.dateElement': ['.ads .gK .g3'],
57525
+ /**
57526
+ * The element carrying the message's sync id in `data-message-id`.
57527
+ * Root: message element.
57528
+ */
57529
+ 'messageView.syncIdElement': ['[data-message-id]'],
57530
+ /**
57531
+ * The element carrying `data-legacy-message-id`. The SDK also writes that
57532
+ * attribute onto `messageView.syncIdElement`, so a rung must match both.
57533
+ * Root: message element.
57534
+ */
57535
+ 'messageView.legacyIdElement': ['[data-legacy-message-id]'],
57536
+ /**
57537
+ * The header span attachment icons are added to, in an expanded message.
57538
+ * Root: message element.
57539
+ */
57540
+ 'messageView.attachmentIconSlot': ['td.gH div.gK span'],
57541
+ /**
57542
+ * The header span attachment icons are added to, in a collapsed message.
57543
+ * Root: message element.
57544
+ */
57545
+ 'messageView.attachmentIconSlotCollapsed': ['.adf.ads td.gH span'],
57546
+ /**
57547
+ * The container that holds an inline reply; watched for its class change.
57548
+ * Root: message element.
57549
+ */
57550
+ 'messageView.replyContainer': ['.ip'],
57551
+ /**
57552
+ * The sender heading of an expanded message; a hovered contact inside it is
57553
+ * the sender, and one outside it a recipient.
57554
+ * Root: message element.
57555
+ */
57556
+ 'messageView.senderHeading': ['h3.iw'],
57557
+ /**
57558
+ * Gmail's attachment area. The area the SDK builds carries the same class,
57559
+ * so this can also match that one.
57560
+ * Root: message element.
57561
+ */
57562
+ 'messageView.attachmentArea': ['.hq'],
57563
+ /**
57564
+ * The element the SDK's own attachment area is inserted before.
57565
+ * Root: message element.
57566
+ */
57567
+ 'messageView.attachmentAreaAnchor': ['.hi'],
57568
+ /**
57569
+ * The recipients' spans in a message header; each carries `email` and `name`.
57570
+ * Root: message element.
57571
+ */
57572
+ 'messageView.recipientSpans': ['.hb span[email]'],
57547
57573
  /**
57548
57574
  * The thread's subject heading. Read for its text, or walked child by child
57549
57575
  * when it contains emoji images.
57550
57576
  * Root: thread element.
57551
57577
  */
57552
57578
  'threadView.subject': ['.ha h2'],
57579
+ /**
57580
+ * The list holding the thread's messages, which custom messages are
57581
+ * inserted into.
57582
+ * Root: thread element.
57583
+ */
57584
+ 'threadView.messageList': ['[role=list]'],
57585
+ /**
57586
+ * The message element that contains the hidden messages notice.
57587
+ * Root: thread element.
57588
+ */
57589
+ 'threadView.hiddenNoticeMessage': ['.adv'],
57590
+ /**
57591
+ * The span holding the number of messages Gmail has hidden; read as a number.
57592
+ * Root: `threadView.hiddenNoticeMessage`.
57593
+ */
57594
+ 'threadView.hiddenNoticeCount': ['.adx span'],
57595
+ /**
57596
+ * Where a stand-in notice is inserted when Gmail renders no native one.
57597
+ * Root: `threadView.hiddenNoticeMessage`.
57598
+ */
57599
+ 'threadView.hiddenNoticeSlot': ['.G3'],
57600
+ /**
57601
+ * The container an app's thread label is appended to, and re-appended to
57602
+ * whenever Gmail removes it.
57603
+ * Root: thread element.
57604
+ */
57605
+ 'threadView.labelContainer': ['.ha .J-J5-Ji'],
57606
+ /**
57607
+ * The subject wrapper that subject buttons are added to.
57608
+ * Root: thread element.
57609
+ */
57610
+ 'threadView.subjectParent': ['.V8djrc.byY'],
57611
+ /**
57612
+ * The messages container, whose last message footer holds footer buttons.
57613
+ * Root: thread element.
57614
+ */
57615
+ 'threadView.messagesContainer': ['div.nH .aHU'],
57616
+ /**
57617
+ * The toolbar beside the thread subject, which subject buttons are put in.
57618
+ * Root: thread element.
57619
+ */
57620
+ 'threadView.subjectToolbar': ['.bHJ'],
57621
+ /**
57622
+ * An expanded message. Its PARENT is the container the message view stream
57623
+ * watches, so stay at this depth.
57624
+ * Root: thread element.
57625
+ */
57626
+ 'threadView.openMessage': ['.h7'],
57627
+ /**
57628
+ * The expand-all icon. The code walks up to its `role=button` ancestor, so
57629
+ * stay at the image.
57630
+ * Root: thread element.
57631
+ */
57632
+ 'threadView.expandAllButton': ['img.gx'],
57633
+ /**
57634
+ * The collapse-all icon. The code walks up to its `role=button` ancestor, so
57635
+ * stay at the image.
57636
+ * Root: thread element.
57637
+ */
57638
+ 'threadView.collapseAllButton': ['img.gq'],
57639
+ /**
57640
+ * The subject container the notice bar is inserted into, in the current
57641
+ * thread view.
57642
+ * Root: thread element.
57643
+ */
57644
+ 'threadView.subjectContainer': [
57645
+ // 2023-11-16 thread-view redesign
57646
+ '* > .nH'],
57647
+ /**
57648
+ * The subject container the notice bar is inserted into, in the thread
57649
+ * views that predate the redesign.
57650
+ * Root: thread element.
57651
+ */
57652
+ 'threadView.subjectContainerLegacy': [
57653
+ // 2018 layout
57654
+ '.if > .nH',
57655
+ // 2022-10-21 layout
57656
+ '.a98.iY > .nH',
57657
+ // 2022-10-12 layout
57658
+ '.PeIF1d > .nH'],
57553
57659
  /**
57554
57660
  * The element holding the list toolbar and the thread list.
57555
57661
  * Root: the row list element container.