Non-working dynamic loading system and new message API.

This commit is contained in:
Alexey Skobkin 2015-01-07 06:36:06 +04:00
parent cb2ca9766b
commit 180d58b464
2 changed files with 226 additions and 125 deletions

View file

@ -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 // Message listener
chrome.extension.onMessage.addListener(function(message, sender) { chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
console.log('Received message: %O', message); // @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) { if (message) {
switch (message.type) { switch (message.type) {
case 'showPageAction': case 'showPageAction':
var tab = sender.tab; chrome.pageAction.show(sender.tab.id);
chrome.pageAction.show(tab.id); sendResponse(true);
console.log('Showed pageAction for tab #%s', sender.tab.id);
break; break;
case 'showNotification': case 'showNotification':
@ -28,11 +60,13 @@ chrome.extension.onMessage.addListener(function(message, sender) {
message: message.text, message: message.text,
priority: 0, priority: 0,
isClickable: true isClickable: true
}, }, function(notificationId) {
function() { /* Error checking goes here */} console.info('Notification "%s" created', notificationId);
sendResponse(true);
}
); );
console.log('Showing notification %s', message.notificationId);
break; break;
case 'listenNotificationClicks': case 'listenNotificationClicks':
@ -52,27 +86,69 @@ chrome.extension.onMessage.addListener(function(message, sender) {
}); });
} }
}); });
sendResponse(true);
break; break;
/**
* @deprecated since 1.19.1
*/
case 'injectJSFile': case 'injectJSFile':
console.log('Injecting JS: %s', message.file); console.log('Executing JS: %s', message.file);
chrome.tabs.executeScript(null, { chrome.tabs.executeScript(sender.tab.id ? sender.tab.id : null, {
file: message.file file: message.file,
//,runAt: 'document_end' runAt: message.runAt || 'document_start'
}, function() {
sendResponse(true);
console.info('JS file executed: "%s"', message.file);
}); });
break; 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': case 'injectCSSFile':
console.log('Injecting CSS: %s', message.file); console.log('Injecting CSS: "%s"', message.file);
chrome.tabs.insertCSS(null, { chrome.tabs.insertCSS(sender.tab.id ? sender.tab.id : null, {
file: message.file file: message.file
}, function() {
sendResponse(true);
console.info('CSS file "%s" injected', message.file);
}); });
break; break;
case 'injectCSSCode': case 'injectCSSCode':
if (message.code !== undefined) { if (message.code !== undefined) {
chrome.tabs.insertCSS(null, { chrome.tabs.insertCSS(sender.tab.id ? sender.tab.id : null, {
code: message.code code: message.code
}, function() {
sendResponse(true);
console.info('CSS code injected: \n%s', message.file);
}); });
} }

View file

@ -1,6 +1,8 @@
// Showing page action // Showing page action
chrome.extension.sendMessage({ chrome.runtime.sendMessage({
type: 'showPageAction' type: 'showPageAction'
}, null, function(response) {
console.debug('showPageAction response: %O', response);
}); });
/** /**
@ -68,7 +70,7 @@ $(document).ready(function() {
// Options debug // Options debug
try { try {
console.debug('Options loaded: %O', options.getOptions()); console.debug('Options loaded: %O', options.getOptions());
}catch(e){} } catch(e){}
create_tag_system(); create_tag_system();
// Embedding // Embedding
@ -94,38 +96,44 @@ $(document).ready(function() {
// Soundcloud // Soundcloud
if (options.is('option_embedding_soundcloud')) { if (options.is('option_embedding_soundcloud')) {
// Injecting JS API // Executing Soundcloud player JS API
chrome.extension.sendMessage({ chrome.runtime.sendMessage({
type: 'injectJSFile', type: 'executeJSFiles',
file: 'vendor/soundcloud/soundcloud.player.api.js' 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 // @todo: вынести в отдельный шаблон
$('.post .post-content a[href*="\\:\\/\\/soundcloud\\.com\\/"]').each(function(index) { $player = $('<div class="pp-soundcloud">\
console.log($(this)); <object height="81" width="100%" id="pp-soundcloud-' + index + '" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000">\
<param name="movie" value="//player.soundcloud.com/player.swf?url=' + encodeURIComponent($(this).prop('href'))
+ '&enable_api=true&object_id=pp-soundcloud-' + index + '">\
<param name="allowscriptaccess" value="always">\
<embed allowscriptaccess="always" height="81" src="//player.soundcloud.com/player.swf?url='
+ encodeURIComponent($(this).prop('href')) + '&enable_api=true&object_id=pp-soundcloud-' + index
+ '" type="application/x-shockwave-flash" width="100%" name="pp-soundcloud-' + index + '"></embed>\
</object>\
</div>');
// @todo: вынести в отдельный шаблон // Replace or prepend
$player = $('<div class="pp-soundcloud">\ if (options.is('option_embedding_soundcloud_orig_link')) {
<object height="81" width="100%" id="pp-soundcloud-' + index + '" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000">\ // Before
<param name="movie" value="//player.soundcloud.com/player.swf?url=' + encodeURIComponent($(this).prop('href')) $(this).before($player);
+ '&enable_api=true&object_id=pp-soundcloud-' + index + '">\ } else {
<param name="allowscriptaccess" value="always">\ // Replace
<embed allowscriptaccess="always" height="81" src="//player.soundcloud.com/player.swf?url=' $(this).replaceWith($player);
+ encodeURIComponent($(this).prop('href')) + '&enable_api=true&object_id=pp-soundcloud-' + index }
+ '" type="application/x-shockwave-flash" width="100%" name="pp-soundcloud-' + index + '"></embed>\ });
</object>\
</div>');
// 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 // Parse pleer.com links and create audio instead
@ -142,66 +150,77 @@ $(document).ready(function() {
// Fancybox // Fancybox
if (options.is('option_fancybox')) { if (options.is('option_fancybox')) {
// Injecting Fancybox to the page // Injecting Fancybox to the page
chrome.extension.sendMessage({ // CSS
type: 'injectJSFile', chrome.runtime.sendMessage({
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({
type: 'injectCSSFile', type: 'injectCSSFile',
file: 'vendor/fancybox/source/jquery.fancybox.css' file: 'vendor/fancybox/source/jquery.fancybox.css'
}); });
// 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')) { if (options.is('option_fancybox_bind_images_to_one_flow')) {
// Linking images in posts to the galleries // Linking images in posts to the galleries
$('.post-content .text').each(function() { $('.post-content .text').each(function() {
$(this).find('a.postimg:not(.youtube)').attr('data-fancybox-group', 'one_flow_gallery'); $(this).find('a.postimg:not(.youtube)').attr('data-fancybox-group', 'one_flow_gallery');
}); });
} else { } else {
$('.post-content .text').each(function(idxPost) { $('.post-content .text').each(function(idxPost) {
$(this).find('a.postimg:not(.youtube)').attr('data-fancybox-group', 'post' + idxPost); $(this).find('a.postimg:not(.youtube)').attr('data-fancybox-group', 'post' + idxPost);
}); });
} }
// Images // Images
if (options.is('option_fancybox_images')) { if (options.is('option_fancybox_images')) {
// Init fancybox // Init fancybox
$('.postimg:not(.youtube)').fancybox({ $('.postimg:not(.youtube)').fancybox({
type: 'image' type: 'image'
}); });
} }
// Правим хинты у фансибокса // Правим хинты у фансибокса
if (options.is('option_fancybox_smart_hints')) { if (options.is('option_fancybox_smart_hints')) {
fancybox_set_smart_hints(); fancybox_set_smart_hints();
} else { } else {
$('.post .postimg').attr('data-fancybox-title', ' '); $('.post .postimg').attr('data-fancybox-title', ' ');
} }
// Videos // Videos
if (options.is('option_fancybox_videos')) { if (options.is('option_fancybox_videos')) {
$('.postimg.youtube').addClass('fancybox-media').fancybox({ $('.postimg.youtube').addClass('fancybox-media').fancybox({
helpers: { helpers: {
media: { media: {
youtube: { youtube: {
params: { params: {
autoplay: 1 autoplay: 1
}
}
} }
} }
} });
} }
}); // Posts
} if (options.is('option_fancybox_posts')) {
// Posts // Excluding some sort of piece-of-shit makeup
if (options.is('option_fancybox_posts')) { $('.post-id a').not('#comments .post-id a, #top-post .post-id a').attr('data-fancybox-type', 'iframe').fancybox({
// Excluding some sort of piece-of-shit makeup maxWidth: 780
$('.post-id a').not('#comments .post-id a, #top-post .post-id a').attr('data-fancybox-type', 'iframe').fancybox({ });
maxWidth: 780 }
}); }
} });
} }
// NSFW Filtering // NSFW Filtering
@ -282,41 +301,47 @@ $(document).ready(function() {
} }
// Visual editor // Visual editor
if (options.is('option_visual_editor_post')) { if (options.is('option_visual_editor_post')) {
// Injecting editor JS // Add classes
chrome.extension.sendMessage({ $('#new-post-form #text-input, .post-content #text-input').addClass('markitup').css('height', '20em');
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'
});
// CSS // CSS
chrome.extension.sendMessage({ chrome.runtime.sendMessage({
type: 'injectCSSFile', type: 'injectCSSFile',
file: 'vendor/markitup/markitup/skins/markitup/style.css' file: 'vendor/markitup/markitup/skins/markitup/style.css'
}); });
chrome.extension.sendMessage({ chrome.runtime.sendMessage({
type: 'injectCSSFile', type: 'injectCSSFile',
file: 'css/markitup/sets/markdown/style.css' file: 'css/markitup/sets/markdown/style.css'
}); });
// 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);
// Add classes // Send by CTRL+Enter
$('#new-post-form #text-input, .post-content #text-input').addClass('markitup').css('height', '20em'); if (options.is('option_ctrl_enter')) {
// Init // New post
$('.markitup').markItUp(mySettings); $('#new-post-form #text-input, .post-content #text-input').on('keydown.point_plus', function(e) {
if (e.ctrlKey && (e.keyCode == 10 || e.keyCode == 13)) {
// Send by CTRL+Enter e.preventDefault();
if (options.is('option_ctrl_enter')) { $(this).parents('#new-post-form,#post-edit-form').submit();
// 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 // Google search
if (options.is('option_search_with_google')) { if (options.is('option_search_with_google')) {
@ -335,7 +360,7 @@ $(document).ready(function() {
// @todo: унести в опцию // @todo: унести в опцию
// Adding event listener for notification click // Adding event listener for notification click
chrome.extension.sendMessage({ chrome.runtime.sendMessage({
type: 'listenNotificationClicks', type: 'listenNotificationClicks',
protocol: getProtocol() protocol: getProtocol()
}); });
@ -491,7 +516,7 @@ $(document).ready(function() {
// Desktop notifications // Desktop notifications
if (options.is('option_ws_comments_notifications')) { if (options.is('option_ws_comments_notifications')) {
console.log('Showing desktop notification'); console.log('Showing desktop notification');
chrome.extension.sendMessage({ chrome.runtime.sendMessage({
type: 'showNotification', type: 'showNotification',
notificationId: 'comment_' + wsMessage.post_id + '#' + wsMessage.comment_id, notificationId: 'comment_' + wsMessage.post_id + '#' + wsMessage.comment_id,
avatarUrl: getProtocol() + userAvatar + '/80', avatarUrl: getProtocol() + userAvatar + '/80',
@ -550,7 +575,7 @@ $(document).ready(function() {
} }
// @ before username // @ before username
if (options.is('option_at_before_username')) { if (options.is('option_at_before_username')) {
chrome.extension.sendMessage({ chrome.runtime.sendMessage({
type: 'injectCSSFile', type: 'injectCSSFile',
file: 'css/modules/at_before_username.css' file: 'css/modules/at_before_username.css'
}); });