blob: 62768bdb28fc95fb1d175ce54217796463facd6a [file] [log] [blame]
avm99963cbea3142019-03-28 00:48:15 +01001var mutationObserver, intersectionObserver, options;
2
avm99963af7860e2019-06-04 03:33:26 +02003function parseUrl(url) {
4 var forum_a = url.match(/forum\/([0-9]+)/i);
5 var thread_a = url.match(/thread\/([0-9]+)/i);
6
7 if (forum_a === null || thread_a === null) {
8 return false;
9 }
10
11 return {
avm99963b69eb3d2020-08-20 02:03:44 +020012 'forum': forum_a[1],
13 'thread': thread_a[1],
avm99963af7860e2019-06-04 03:33:26 +020014 };
15}
16
avm99963847ee632019-03-27 00:57:44 +010017function mutationCallback(mutationList, observer) {
18 mutationList.forEach((mutation) => {
avm99963b69eb3d2020-08-20 02:03:44 +020019 if (mutation.type == 'childList') {
20 mutation.addedNodes.forEach(function(node) {
21 if (typeof node.classList !== 'undefined') {
22 if (options.thread && node.classList.contains('load-more-bar')) {
23 intersectionObserver.observe(
24 node.querySelector('.load-more-button'));
avm99963d0757252019-03-30 20:13:00 +010025 }
26
avm99963b69eb3d2020-08-20 02:03:44 +020027 if (options.threadall && node.classList.contains('load-more-bar')) {
28 intersectionObserver.observe(
29 node.querySelector('.load-all-button'));
avm999636d9c5fe2019-06-04 00:35:53 +020030 }
31
avm99963b69eb3d2020-08-20 02:03:44 +020032 if (options.history && ('parentNode' in node) &&
33 node.parentNode !== null && ('tagName' in node.parentNode) &&
34 node.parentNode.tagName == 'EC-USER') {
35 var nameElement = node.querySelector('.name span');
avm99963d0757252019-03-30 20:13:00 +010036 if (nameElement !== null) {
avm9996318d043a2020-05-29 12:20:47 +020037 var name = nameElement.innerHTML;
avm99963b69eb3d2020-08-20 02:03:44 +020038 var query = encodeURIComponent(
39 '(creator:"' + name + '" | replier:"' + name + '") -forum:0');
40 var urlpart = encodeURIComponent('query=' + query);
41 var link = document.createElement('a');
42 link.setAttribute(
43 'href',
44 'https://support.google.com/s/community/search/' + urlpart);
45 link.innerText = chrome.i18n.getMessage('inject_previousposts');
46 node.querySelector('.main-card-content')
47 .appendChild(document.createElement('br'));
48 node.querySelector('.main-card-content').appendChild(link);
avm99963d0757252019-03-30 20:13:00 +010049 }
50 }
51 }
avm99963847ee632019-03-27 00:57:44 +010052 });
53 }
54 });
55}
56
avm99963adf90862020-04-12 13:27:45 +020057function intersectionCallback(entries, observer) {
avm99963847ee632019-03-27 00:57:44 +010058 entries.forEach(entry => {
59 if (entry.isIntersecting) {
60 entry.target.click();
61 }
62 });
63};
64
avm99963129fb502020-08-28 05:18:53 +020065function injectStylesheet(stylesheetName) {
avm99963ae6a26d2020-04-12 14:03:51 +020066 var link = document.createElement('link');
avm99963b69eb3d2020-08-20 02:03:44 +020067 link.setAttribute('rel', 'stylesheet');
avm99963129fb502020-08-28 05:18:53 +020068 link.setAttribute('href', stylesheetName);
avm99963ae6a26d2020-04-12 14:03:51 +020069 document.head.appendChild(link);
70}
71
avm99963129fb502020-08-28 05:18:53 +020072function injectStyles(css) {
73 injectStylesheet('data:text/css;charset=UTF-8,' + encodeURIComponent(css));
74}
75
76function injectScript(scriptName) {
77 var script = document.createElement('script');
78 script.src = scriptName;
79 document.head.appendChild(script);
80}
81
avm99963847ee632019-03-27 00:57:44 +010082var observerOptions = {
83 childList: true,
84 attributes: true,
avm99963b69eb3d2020-08-20 02:03:44 +020085 subtree: true,
avm99963847ee632019-03-27 00:57:44 +010086}
87
avm99963129fb502020-08-28 05:18:53 +020088var intersectionOptions = {
89 root: document.querySelector('.scrollable-content'),
90 rootMargin: '0px',
91 threshold: 1.0,
92};
avm99963847ee632019-03-27 00:57:44 +010093
avm99963129fb502020-08-28 05:18:53 +020094chrome.storage.sync.get(null, function(items) {
95 options = items;
avm99963cbea3142019-03-28 00:48:15 +010096
avm99963129fb502020-08-28 05:18:53 +020097 mutationObserver = new MutationObserver(mutationCallback);
98 mutationObserver.observe(
99 document.querySelector('.scrollable-content'), observerOptions);
avm99963cbea3142019-03-28 00:48:15 +0100100
avm99963129fb502020-08-28 05:18:53 +0200101 intersectionObserver =
102 new IntersectionObserver(intersectionCallback, intersectionOptions);
avm99963122dc9b2019-03-30 18:44:18 +0100103
avm99963129fb502020-08-28 05:18:53 +0200104 if (options.fixedtoolbar) {
105 injectStyles(
106 'ec-bulk-actions{position: sticky; top: 0; background: white; z-index: 96;}');
107 }
avm99963ae6a26d2020-04-12 14:03:51 +0200108
avm99963129fb502020-08-28 05:18:53 +0200109 if (options.increasecontrast) {
110 injectStyles('.thread-summary.read{background: #ecedee!important;}');
111 }
avm999630f9503f2020-07-27 13:56:52 +0200112
avm99963129fb502020-08-28 05:18:53 +0200113 if (options.stickysidebarheaders) {
114 injectStyles(
115 'material-drawer .main-header{background: #fff; position: sticky; top: 0; z-index: 1;}');
116 }
117
118 if (options.profileindicator) {
avm99963a560aba2020-08-31 13:32:29 +0200119 injectScript(
120 chrome.runtime.getURL('injections/console_profileindicator_inject.js'));
121 injectStylesheet(chrome.runtime.getURL(
122 'injections/console_profileindicator_inject.css'));
avm99963129fb502020-08-28 05:18:53 +0200123
124 // In order to pass i18n strings to the injected script, which doesn't have
125 // access to the chrome.i18n API.
126 window.addEventListener('geti18nString', evt => {
127 var request = evt.detail;
128 var response = {
129 string: chrome.i18n.getMessage(request.msg),
130 requestId: request.id
131 };
avm99963a560aba2020-08-31 13:32:29 +0200132 window.dispatchEvent(
133 new CustomEvent('sendi18nString', {detail: response}));
avm99963b69eb3d2020-08-20 02:03:44 +0200134 });
avm99963129fb502020-08-28 05:18:53 +0200135 }
136});