diff --git a/chrome_point_plus/js/background.js b/chrome_point_plus/js/background.js index 6acddc7..34c6306 100644 --- a/chrome_point_plus/js/background.js +++ b/chrome_point_plus/js/background.js @@ -8,15 +8,47 @@ chrome.storage.sync.get('options_version', function(data) { } }); +// Crutches and bikes +/** + * Inject several JS files + * @param {number} tabId Unique ID of tab which requested injection + * @param {Object[]} files Array of objects of files to inject + * @callback onAllInjected Callback function running when injection ends + */ +function injectJS(tabId, files, onAllInjected) { + var item = files.shift(); + if (item) { + console.log('Injecting JS "%s" to the tab #%s', item.file, tabId); + + if ('file' in item) { + chrome.tabs.executeScript(tabId ? tabId : null, { + file: item.file, + runAt: item.runAt || 'document_start' + }, function(result) { + console.info('"%s" injected to the tab #%s', item.file, tabId); + + injectJS(tabId, files, onAllInjected); + }); + } + } else { + onAllInjected(); + } +} + +// @todo Implement injectCSS (because JS execution working always after CSS injection) + // Message listener -chrome.extension.onMessage.addListener(function(message, sender) { - console.log('Received message: %O', message); +chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) { + // @todo Check if sender.tab may be undefined in some cases + console.log('Received message from tab #%i: %O', sender.tab.id, message); if (message) { switch (message.type) { case 'showPageAction': - var tab = sender.tab; - chrome.pageAction.show(tab.id); + chrome.pageAction.show(sender.tab.id); + sendResponse(true); + + console.log('Showed pageAction for tab #%s', sender.tab.id); break; case 'showNotification': @@ -28,11 +60,13 @@ chrome.extension.onMessage.addListener(function(message, sender) { message: message.text, priority: 0, isClickable: true - }, - function() { /* Error checking goes here */} + }, function(notificationId) { + console.info('Notification "%s" created', notificationId); + + sendResponse(true); + } ); - console.log('Showing notification %s', message.notificationId); break; case 'listenNotificationClicks': @@ -52,27 +86,69 @@ chrome.extension.onMessage.addListener(function(message, sender) { }); } }); - break; + sendResponse(true); + break; + + /** + * @deprecated since 1.19.1 + */ case 'injectJSFile': - console.log('Injecting JS: %s', message.file); - chrome.tabs.executeScript(null, { - file: message.file - //,runAt: 'document_end' + console.log('Executing JS: %s', message.file); + chrome.tabs.executeScript(sender.tab.id ? sender.tab.id : null, { + file: message.file, + runAt: message.runAt || 'document_start' + }, function() { + sendResponse(true); + + console.info('JS file executed: "%s"', message.file); }); break; + // Inject several files + case 'executeJSFiles': + //console.debug('Received JS file list: %O', message.files); + + if (message.files.length) { + injectJS(sender.tab.id ? sender.tab.id : null, message.files, function() { + // @fixme does not sending response now! + sendResponse(true); + + console.info('All scripts executed'); + }); + } else { + /* + * May be not? + * But I don't want to block some shit-code execution + */ + sendResponse(false); + + console.warn('No scripts executed (empty script array)'); + } + break; + + /** + * @deprecated since 1.19.1 + */ case 'injectCSSFile': - console.log('Injecting CSS: %s', message.file); - chrome.tabs.insertCSS(null, { + console.log('Injecting CSS: "%s"', message.file); + chrome.tabs.insertCSS(sender.tab.id ? sender.tab.id : null, { file: message.file + }, function() { + sendResponse(true); + + console.info('CSS file "%s" injected', message.file); }); break; case 'injectCSSCode': if (message.code !== undefined) { - chrome.tabs.insertCSS(null, { + chrome.tabs.insertCSS(sender.tab.id ? sender.tab.id : null, { code: message.code + }, function() { + sendResponse(true); + + console.info('CSS code injected: \n%s', message.file); }); } diff --git a/chrome_point_plus/js/point-plus.js b/chrome_point_plus/js/point-plus.js index 1250eb7..f13a0b0 100644 --- a/chrome_point_plus/js/point-plus.js +++ b/chrome_point_plus/js/point-plus.js @@ -1,6 +1,8 @@ // Showing page action -chrome.extension.sendMessage({ +chrome.runtime.sendMessage({ type: 'showPageAction' +}, null, function(response) { + console.debug('showPageAction response: %O', response); }); /** @@ -68,7 +70,7 @@ $(document).ready(function() { // Options debug try { console.debug('Options loaded: %O', options.getOptions()); - }catch(e){} + } catch(e){} create_tag_system(); // Embedding @@ -94,38 +96,44 @@ $(document).ready(function() { // Soundcloud if (options.is('option_embedding_soundcloud')) { - // Injecting JS API - chrome.extension.sendMessage({ - type: 'injectJSFile', - file: 'vendor/soundcloud/soundcloud.player.api.js' - }); + // Executing Soundcloud player JS API + chrome.runtime.sendMessage({ + type: 'executeJSFiles', + files: [{ + file: 'vendor/soundcloud/soundcloud.player.api.js', + runAt: 'document_end' + }] + }, null, function(response) { + console.debug('Soundcloud injection response: %O', response); + // If scripts are executed + if (response) { + // Processing links + $('.post .post-content a[href*="\\:\\/\\/soundcloud\\.com\\/"]').each(function(index) { + console.log($(this)); - // Processing links - $('.post .post-content a[href*="\\:\\/\\/soundcloud\\.com\\/"]').each(function(index) { - console.log($(this)); + // @todo: вынести в отдельный шаблон + $player = $('
\ + \ + \ + \ + \ + \ +
'); - // @todo: вынести в отдельный шаблон - $player = $('
\ - \ - \ - \ - \ - \ -
'); - - // Replace or prepend - if (options.is('option_embedding_soundcloud_orig_link')) { - // Before - $(this).before($player); - } else { - // Replace - $(this).replaceWith($player); + // Replace or prepend + if (options.is('option_embedding_soundcloud_orig_link')) { + // Before + $(this).before($player); + } else { + // Replace + $(this).replaceWith($player); + } + }); } }); - } // Parse pleer.com links and create audio instead @@ -142,66 +150,77 @@ $(document).ready(function() { // Fancybox if (options.is('option_fancybox')) { // Injecting Fancybox to the page - chrome.extension.sendMessage({ - type: 'injectJSFile', - file: 'vendor/fancybox/source/jquery.fancybox.pack.js' - }); - chrome.extension.sendMessage({ - type: 'injectJSFile', - file: 'vendor/fancybox/source/helpers/jquery.fancybox-media.js' - }); - chrome.extension.sendMessage({ + // CSS + chrome.runtime.sendMessage({ type: 'injectCSSFile', file: 'vendor/fancybox/source/jquery.fancybox.css' }); - - if (options.is('option_fancybox_bind_images_to_one_flow')) { - // Linking images in posts to the galleries - $('.post-content .text').each(function() { - $(this).find('a.postimg:not(.youtube)').attr('data-fancybox-group', 'one_flow_gallery'); - }); - } else { - $('.post-content .text').each(function(idxPost) { - $(this).find('a.postimg:not(.youtube)').attr('data-fancybox-group', 'post' + idxPost); - }); - } + // JS + chrome.runtime.sendMessage(null, { + type: 'executeJSFiles', + files: [{ + file: 'vendor/fancybox/source/jquery.fancybox.pack.js', + runAt: 'document_end' + }, { + // @todo Move to the option_fancybox_videos section + file: 'vendor/fancybox/source/helpers/jquery.fancybox-media.js', + runAt: 'document_end' + }] + }, null, function(response) { + // If all JS are executed + console.debug('Fancybox injection response: %O', response); + if (response) { + console.log('Fancybox executed. Processing...') + + if (options.is('option_fancybox_bind_images_to_one_flow')) { + // Linking images in posts to the galleries + $('.post-content .text').each(function() { + $(this).find('a.postimg:not(.youtube)').attr('data-fancybox-group', 'one_flow_gallery'); + }); + } else { + $('.post-content .text').each(function(idxPost) { + $(this).find('a.postimg:not(.youtube)').attr('data-fancybox-group', 'post' + idxPost); + }); + } - // Images - if (options.is('option_fancybox_images')) { - // Init fancybox - $('.postimg:not(.youtube)').fancybox({ - type: 'image' - }); - } + // Images + if (options.is('option_fancybox_images')) { + // Init fancybox + $('.postimg:not(.youtube)').fancybox({ + type: 'image' + }); + } - // Правим хинты у фансибокса - if (options.is('option_fancybox_smart_hints')) { - fancybox_set_smart_hints(); - } else { - $('.post .postimg').attr('data-fancybox-title', ' '); - } + // Правим хинты у фансибокса + if (options.is('option_fancybox_smart_hints')) { + fancybox_set_smart_hints(); + } else { + $('.post .postimg').attr('data-fancybox-title', ' '); + } - // Videos - if (options.is('option_fancybox_videos')) { - $('.postimg.youtube').addClass('fancybox-media').fancybox({ - helpers: { - media: { - youtube: { - params: { - autoplay: 1 + // Videos + if (options.is('option_fancybox_videos')) { + $('.postimg.youtube').addClass('fancybox-media').fancybox({ + helpers: { + media: { + youtube: { + params: { + autoplay: 1 + } + } } } - } + }); } - }); - } - // Posts - if (options.is('option_fancybox_posts')) { - // Excluding some sort of piece-of-shit makeup - $('.post-id a').not('#comments .post-id a, #top-post .post-id a').attr('data-fancybox-type', 'iframe').fancybox({ - maxWidth: 780 - }); - } + // Posts + if (options.is('option_fancybox_posts')) { + // Excluding some sort of piece-of-shit makeup + $('.post-id a').not('#comments .post-id a, #top-post .post-id a').attr('data-fancybox-type', 'iframe').fancybox({ + maxWidth: 780 + }); + } + } + }); } // NSFW Filtering @@ -282,41 +301,47 @@ $(document).ready(function() { } // Visual editor if (options.is('option_visual_editor_post')) { - // Injecting editor JS - chrome.extension.sendMessage({ - type: 'injectJSFile', - file: 'vendor/markitup/markitup/jquery.markitup.js' - }); - // Getting mySettings from set.js - chrome.extension.sendMessage({ - type: 'injectJSFile', - file: 'js/markitup/sets/markdown/set.js' - }); + // Add classes + $('#new-post-form #text-input, .post-content #text-input').addClass('markitup').css('height', '20em'); + // CSS - chrome.extension.sendMessage({ + chrome.runtime.sendMessage({ type: 'injectCSSFile', file: 'vendor/markitup/markitup/skins/markitup/style.css' }); - chrome.extension.sendMessage({ + chrome.runtime.sendMessage({ type: 'injectCSSFile', file: 'css/markitup/sets/markdown/style.css' }); - - // Add classes - $('#new-post-form #text-input, .post-content #text-input').addClass('markitup').css('height', '20em'); - // Init - $('.markitup').markItUp(mySettings); + // JS + chrome.runtime.sendMessage({ + type: 'executeJSFiles', + files: [{ + file: 'vendor/markitup/markitup/jquery.markitup.js', + runAt: 'document_end' + }, { + file: 'js/markitup/sets/markdown/set.js', + runAt: 'document_end' + }] + }, null, function(response) { + console.debug('MarkItUp injection response: %O', response); + // If scripts are executed + if (response) { + // Init MarkItUp + $('.markitup').markItUp(mySettings); - // Send by CTRL+Enter - if (options.is('option_ctrl_enter')) { - // New post - $('#new-post-form #text-input, .post-content #text-input').on('keydown.point_plus', function(e) { - if (e.ctrlKey && (e.keyCode == 10 || e.keyCode == 13)) { - e.preventDefault(); - $(this).parents('#new-post-form,#post-edit-form').submit(); + // Send by CTRL+Enter + if (options.is('option_ctrl_enter')) { + // New post + $('#new-post-form #text-input, .post-content #text-input').on('keydown.point_plus', function(e) { + if (e.ctrlKey && (e.keyCode == 10 || e.keyCode == 13)) { + e.preventDefault(); + $(this).parents('#new-post-form,#post-edit-form').submit(); + } + }); } - }); - } + } + }); } // Google search if (options.is('option_search_with_google')) { @@ -335,7 +360,7 @@ $(document).ready(function() { // @todo: унести в опцию // Adding event listener for notification click - chrome.extension.sendMessage({ + chrome.runtime.sendMessage({ type: 'listenNotificationClicks', protocol: getProtocol() }); @@ -491,7 +516,7 @@ $(document).ready(function() { // Desktop notifications if (options.is('option_ws_comments_notifications')) { console.log('Showing desktop notification'); - chrome.extension.sendMessage({ + chrome.runtime.sendMessage({ type: 'showNotification', notificationId: 'comment_' + wsMessage.post_id + '#' + wsMessage.comment_id, avatarUrl: getProtocol() + userAvatar + '/80', @@ -550,7 +575,7 @@ $(document).ready(function() { } // @ before username if (options.is('option_at_before_username')) { - chrome.extension.sendMessage({ + chrome.runtime.sendMessage({ type: 'injectCSSFile', file: 'css/modules/at_before_username.css' });