Advertisement
Capoeirista

s3trans

Mar 21st, 2025
250
0
18 hours
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var s3gt = {};
  2. s3gt.notification_list = {};
  3.  
  4. s3gt.context_menu_timer = null;
  5. s3gt.work_data = {};
  6. s3gt.protocol_google_translator = 'https://';
  7. s3gt.domain_google_translator = 'translate.google.com';
  8.  
  9. //------------------------------------------------------------------------------
  10. s3gt.init = function() {
  11.     s3gt.prefs.init(function(){
  12.         s3gt.work_data.current_id = s3gt.utils.random_string(8);
  13.         s3gt.work_data.tab_id_scp = {};
  14.         //-----------------------------------------------------------------
  15.         if (s3gt.utils.prefs_get('translate_box_restore_restart')) {
  16.             s3gt.work_data.tooltip = s3gt.utils.prefs_get("work_data_tooltip");
  17.             var tooltip_list_tmp = [];
  18.             for (var i=0; i<s3gt.work_data.tooltip.length; i++) {
  19.                 var tooltip = s3gt.work_data.tooltip[i];
  20.                 if (tooltip.translate_tooltip_pin == 'alltabs') {
  21.                     tooltip_list_tmp.push(tooltip);
  22.                 }
  23.             }
  24.             s3gt.work_data.tooltip = tooltip_list_tmp;
  25.         } else {
  26.             s3gt.work_data.tooltip = [];
  27.         }
  28.         s3gt.utils.prefs_set('work_data_tooltip', s3gt.work_data.tooltip);
  29.  
  30.         //-----------------------------------------------------------------
  31.         s3gt.work_data.url_extension = chrome.runtime.getURL('/').replace(/\/+$/, '');
  32.         s3gt.work_data.go_donate = 'https://www.s3blog.org/addon-contribute/s3-translator.html?donate';
  33.         //-----------------------------------------------------------------
  34.         if (s3gt.utils.prefs_get("is_first_run")) {
  35.             s3gt.utils.prefs_set("is_first_run", false);
  36.             chrome.runtime.openOptionsPage();
  37.         }
  38.         //-----------------------------------------------------------------
  39.         s3gt.init_domain_google_translator(function(){
  40.             chrome.contextMenus.create({
  41.                 id: 's3gt_browser_action_translate_page',
  42.                 type : 'normal',
  43.                 title : s3gt.utils.get_string('translate.page'),
  44.                 contexts: ["browser_action"],
  45.                 onclick: function(event){ s3gt.context_browser_action_click(event); }
  46.             });
  47.             chrome.contextMenus.create({
  48.                 id: 's3gt_browser_action_translate_learning',
  49.                 type : 'checkbox',
  50.                 title : s3gt.utils.get_string('preference.tab.learning'),
  51.                 contexts: ["browser_action"],
  52.                 onclick: function(event){ s3gt.context_browser_action_click(event); }
  53.             });
  54.             chrome.contextMenus.create({
  55.                 id: 's3gt_browser_action_translate_allpages_auto',
  56.                 type : 'checkbox',
  57.                 title : s3gt.utils.get_string('translate.allpages_auto').replace(/\n/g, ' ').replace(/\s+/g, ' '),
  58.                 contexts: ["browser_action"],
  59.                 onclick: function(event){ s3gt.context_browser_action_click(event); }
  60.             });
  61.             chrome.contextMenus.create({
  62.                 id: 's3gt_browser_action_go_google',
  63.                 type : 'normal',
  64.                 title : s3gt.utils.get_string('translate.go.google'),
  65.                 contexts: ["browser_action"],
  66.                 onclick: function(event){ s3gt.context_browser_action_click(event); }
  67.             });
  68.             chrome.contextMenus.create({
  69.                 id: 's3gt_browser_action_settings',
  70.                 type : 'normal',
  71.                 title : s3gt.utils.get_string('preference.label'),
  72.                 contexts: ["browser_action"],
  73.                 onclick: function(event){ chrome.runtime.openOptionsPage(); }
  74.             });
  75.         });
  76.     });
  77. }
  78. //------------------------------------------------------------------------------
  79. s3gt.init_main_data = function(changeInfo, tab_id) {
  80. //  if (changeInfo && (changeInfo.status === undefined)) { return; }
  81.     if (changeInfo && (changeInfo.status !== 'loading')) { return; }
  82. //  if (changeInfo && (changeInfo.status !== 'complete')) { return; }
  83.  
  84.     if (changeInfo && (changeInfo.source == 'webNavigation')) {
  85.         if (! changeInfo.frame_id) { return; }
  86.         s3gt.set_content_scripts(changeInfo.tab_id, changeInfo.frame_id, function(tab_id) {
  87.             chrome.tabs.sendMessage(tab_id, { 'action' : 'set_work_data', 'work_data' : s3gt.work_data, 'prefs_list' : s3gt.prefs.list, 'frame_id' : changeInfo.frame_id }, { 'frameId' : changeInfo.frame_id }, function(response) { if (chrome.runtime.lastError) {}; });
  88.         });
  89.         return;
  90.     }
  91.  
  92.     //------------------------------------------------------------------------
  93.     var init_main_data_sub = function(tab_list) {
  94.         if (tab_list && tab_list.length) {
  95.             for (var i in  tab_list) {
  96.                 if (tab_list[i].id && ((tab_id === undefined) || (tab_list[i].id == tab_id))) {
  97.                     s3gt.set_content_scripts(tab_list[i].id, 0, function(tab_id) {
  98.                         chrome.tabs.sendMessage(tab_id, { 'action' : 'set_work_data', 'work_data' : s3gt.work_data, 'prefs_list' : s3gt.prefs.list }, { 'frameId' : 0 }, function(response) { if (chrome.runtime.lastError) {}; });
  99.                         chrome.tabs.sendMessage(tab_id, { 'action' : 'set_prefs_list', 'prefs_list' : s3gt.prefs.list }, function(response) { if (chrome.runtime.lastError) {}; });
  100.                         //----------------------------------------
  101.                         chrome.webNavigation.getAllFrames({ 'tabId' : tab_id }, function(frame_list) {
  102.                             if (frame_list) {
  103.                                 for (var f=0; f<frame_list.length; f++) {
  104.                                     if (frame_list[f].frameId) {
  105.                                         s3gt.init_main_data({ 'status' : 'loading' , 'source' : 'webNavigation', 'tab_id' : tab_id, 'frame_id' : frame_list[f].frameId }, tab_id);
  106.                                     }
  107.                                 }
  108.                             }
  109.                         });
  110.                         //----------------------------------------
  111.                     });
  112.                 }
  113.             }
  114.         }
  115.     }
  116.     //------------------------------------------------------------------------
  117.     if (tab_id) {
  118.         chrome.tabs.get(tab_id, function(tab_list) { init_main_data_sub([tab_list]); });
  119.     } else {
  120.         chrome.tabs.query({  active: true }, function(tab_list) { init_main_data_sub(tab_list); });
  121.     }
  122.  
  123.     s3gt.context_menu_init_timer();
  124. }
  125. //------------------------------------------------------------------------------
  126. s3gt.set_content_scripts = function(tab_id, frame_id, callback, set_all_script) {
  127.     if (tab_id <= 0) { return; }
  128.     chrome.tabs.sendMessage(tab_id, { check_content: true }, { 'frameId' : frame_id }, function(response) {
  129.         if (chrome.runtime.lastError) {
  130.         } else if (response && response.success) {
  131.             if (callback) {
  132.                 callback(tab_id);
  133.             }
  134.             return;
  135.         }
  136.  
  137.         var js_list = (set_all_script) ?
  138.             [ "/content/s3gt_main.js", "/content/action.js", "/content/translate.js", "/content/learning.js", "/content/hotkeys.js", "/content/tooltip.js", "/content/thtml.js", "/content/i18n.js", "/content/sound.js", "/content/utils.js", "/content/prefs.js" ]
  139.             :
  140.             [ "/content/tab_loader.js" ];
  141.  
  142.         var executeScript = function(js_list) {
  143.             var js_file = js_list.shift();
  144.             var data = {};
  145.             data.file = js_file;
  146.             if (frame_id) {
  147.                 data.matchAboutBlank= true;
  148.                 data.frameId = frame_id;
  149.             }
  150.             if (set_all_script) {
  151.                 data.runAt = 'document_start';
  152.             }
  153.             chrome.tabs.executeScript(tab_id, data, function() {
  154.                 if (chrome.runtime.lastError) {}
  155.                 if (js_list.length > 0) {
  156.                     executeScript(js_list);
  157.                 } else if (callback) {
  158.                     callback(tab_id);
  159.                 }
  160.             });
  161.         }
  162.         executeScript(js_list);
  163.      });
  164. }
  165. //------------------------------------------------------------------------------
  166. s3gt.context_menu_init_timer = function() {
  167.     if (s3gt.context_menu_timer) {
  168.         clearTimeout(s3gt.context_menu_timer);
  169.     }
  170.     s3gt.context_menu_timer = setTimeout(function(){ s3gt.context_menu_init(); }, 500);
  171. }
  172. //------------------------------------------------------------------------------
  173. s3gt.context_menu_init = function() {
  174.     s3gt.context_menu_timer = null;
  175.     //------------------------------------------------------------------------
  176.     var menu_list = [
  177.         { 'type': 'normal', 'is_inactive' : true, 'pref' : 'context_menu_translate_page', 'id' : 'translate_page', 'title' : s3gt.utils.get_string('translate.page'),  },
  178.         { 'type': 'normal', 'is_inactive' : false, 'pref' : 'context_menu_translate_page_google', 'id' : 'translate_page_google', 'title' : s3gt.utils.get_string('translate.page.google'),  },
  179.         { 'type': 'checkbox', 'is_inactive' : true, 'pref' : 'context_menu_translate_auto', 'id' : 'translate_auto', 'title' : s3gt.utils.get_string('translate.auto') },
  180.         { 'type': 'normal', 'is_inactive' : true, 'pref' : 'context_menu_translate_forget', 'id' : 'translate_forget', 'title' : s3gt.utils.get_string('translate.forget') },
  181.  
  182.         { 'type': 'separator', 'pref' : 'context_menu_translate_allpages_auto_separator', 'id' : 'menu_allpages_auto_separator' },
  183.         { 'type': 'checkbox', 'is_inactive' : false, 'pref' : 'context_menu_translate_allpages_auto', 'id' : 'translate_allpages_auto', 'title' : s3gt.utils.get_string('translate.allpages_auto') },
  184.  
  185.         { 'type': 'separator', 'pref' : 'context_menu_translate_learning_separator', 'id' : 'menu_learning_separator' },
  186.         { 'type': 'checkbox', 'is_inactive' : false, 'pref' : 'context_menu_translate_learning', 'id' : 'translate_learning', 'title' : s3gt.utils.get_string('preference.tab.learning') },
  187.  
  188.         { 'type': 'separator', 'pref' : 'context_menu_translate_text_separator', 'id' : 'menu_text_separator' },
  189.         { 'type': 'normal', 'is_inactive' : true, 'pref' : 'context_menu_translate_clipboard', 'id' : 'translate_clipboard', 'title' : s3gt.utils.get_string('translate.clipboard') },
  190.         { 'type': 'normal', 'is_inactive' : true, 'pref' : 'context_menu_translate_custom', 'id' : 'translate_custom', 'title' : s3gt.utils.get_string('translate.custom') },
  191.         { 'type': 'normal', 'is_inactive' : false, 'pref' : 'context_menu_translate_selection', 'id' : 'translate_selection', 'title' : s3gt.utils.get_string('translate.selection') },
  192.         { 'type': 'normal', 'is_inactive' : true, 'pref' : 'context_menu_translate_selection_sound', 'id' : 'translate_selection_sound', 'title' : s3gt.utils.get_string('translate.button.sound.play') },
  193.  
  194.         { 'type': 'separator', 'pref' : 'context_menu_translate_go_google_separator', 'id' : 'menu_go_google_separator' },
  195.         { 'type': 'normal', 'is_inactive' : false, 'pref' : 'context_menu_translate_go_google', 'id' : 'translate_go_google', 'title' : s3gt.utils.get_string('translate.go.google') },
  196.  
  197.         { 'type': 'separator', 'pref' : 'context_menu_translate_settings_separator', 'id' : 'menu_settings_separator' },
  198.         { 'type': 'normal', 'is_inactive' : false, 'pref' : 'context_menu_translate_settings', 'id' : 's3gt_settings', 'title' : s3gt.utils.get_string('preference.label') }
  199.     ];
  200.     //------------------------------------------------------------------------
  201.     var menu_list_ary = [];
  202.     //------------------------------------------------------------------------
  203.     for (var i=0; i<menu_list.length; i++) {
  204.         menu_list_ary.push(menu_list[i].id);
  205.     }
  206.     //------------------------------------------------------------------------
  207.     s3gt.context_menu_remove(menu_list_ary, function(){ s3gt.context_menu_set(menu_list); });
  208. }
  209. //------------------------------------------------------------------------------
  210. s3gt.context_menu_remove = function(menu_list, callback) {
  211.     var menu_id = menu_list.shift();
  212.  
  213.     try {
  214.         chrome.contextMenus.remove(menu_id, function(){
  215.             if (chrome.runtime.lastError) {};
  216.             if (menu_list.length > 0) {
  217.                 s3gt.context_menu_remove(menu_list, callback);
  218.             } else if (callback) {
  219.                 callback();
  220.             }
  221.         });
  222.     } catch(e) {
  223.         if (menu_list.length > 0) {
  224.             s3gt.context_menu_remove(menu_list, callback);
  225.         } else if (callback) {
  226.             callback();
  227.         }
  228.     }
  229. }
  230. //------------------------------------------------------------------------------
  231. s3gt.context_menu_set = function(menu_list) {
  232.     //------------------------------------------------------------------------
  233.     chrome.contextMenus.update('s3gt_browser_action_translate_learning', { 'checked' : s3gt.utils.prefs_get('learning_enable') });
  234.     chrome.contextMenus.update('s3gt_browser_action_translate_allpages_auto', { 'checked' : s3gt.utils.prefs_get('autotranslate_allpages') });
  235.     //------------------------------------------------------------------------
  236.     chrome.tabs.query({  active: true, currentWindow: true }, function(tab_list) {
  237.         if (tab_list && tab_list.length && tab_list[0].id) {
  238.             var current_tab_domain = s3gt.utils.get_url_domain(tab_list[0].url);
  239.             var translate_hidden = (/^https?\:\/\/.*/.test(tab_list[0].url)) ? false : true;
  240.             var is_create_separator = false;
  241.             //-----------------------------------------------------------
  242.             chrome.tabs.executeScript(tab_list[0].id, { 'file' : '/content/tab_check.js', 'runAt' : 'document_start' }, function(callback) {
  243.                 var menu_is_active = ! translate_hidden;
  244.                 //-----------------------------------------------------
  245.                 if (chrome.runtime.lastError) {
  246.                     menu_is_active = false;
  247.                 }
  248.                 //-----------------------------------------------------
  249.                 for (var i=0; i<menu_list.length; i++) {
  250.                     var menu = menu_list[i];
  251.                     //-----------------------------------------------
  252.                     if (! s3gt.utils.prefs_get(menu.pref)) {
  253.                         continue;
  254.                     }
  255.                     //-----------------------------------------------
  256.                     var context_list = ['page', 'frame', 'image', 'video', 'audio' ];
  257.                     if ((menu.id == 'translate_selection') || (menu.id == 'translate_selection_sound')) {
  258.                         context_list = ['selection'];
  259.                     }
  260.                     //-----------------------------------------------
  261.                     if (menu.type == 'separator') {
  262.                         if (! is_create_separator) { continue; }
  263.                         //-----------------------------------------
  264.                         if (menu.id == 'menu_learning_separator') {
  265.                             if (s3gt.utils.prefs_get('learning_lang_to') == 'auto') {
  266.                                 continue;
  267.                             }
  268.                         }
  269.                         //-----------------------------------------
  270.                         chrome.contextMenus.create({
  271.                             id: menu.id,
  272.                             type : menu.type,
  273. //                          parentId: 's3gt_context_popup',
  274.                             contexts: context_list
  275.                         }, function(){ if (chrome.runtime.lastError) {}; });
  276.                         is_create_separator = false;
  277.                     }
  278.                     //-----------------------------------------------
  279.                     else {
  280.                         var menu_data = {
  281.                             id: menu.id,
  282.                             type : menu.type,
  283.                             title : menu.title.replace(/\n/g, ' ').replace(/\s+/g, ' '),
  284. //                          parentId: 's3gt_context_popup',
  285.                             contexts: context_list,
  286.                             enabled: (! menu_is_active && menu.is_inactive) ? false : true,
  287.                             onclick: function(event){ s3gt.context_menu_click(event, tab_list[0].id, current_tab_domain); }
  288.                         };
  289.                         //-----------------------------------------
  290.                         if (menu.id == 'translate_page') {
  291.                             menu_data.enabled = ! translate_hidden;
  292.                         }
  293.                         //-----------------------------------------
  294.                         else if (menu.id == 'translate_page_google') {
  295.                             menu_data.enabled = ! translate_hidden;
  296.                         }
  297.                         //-----------------------------------------
  298.                         else if (menu.id == 'translate_allpages_auto') {
  299.                             menu_data.checked = s3gt.utils.prefs_get('autotranslate_allpages');
  300.                         }
  301.                         //-----------------------------------------
  302.                         else if (menu.id == 'translate_auto') {
  303.                             if (menu_is_active) {
  304.                                 menu_data.checked = s3gt.utils.check_domain_translate(current_tab_domain, true);
  305.                             } else {
  306.                                 continue;
  307.                             }
  308.                             menu_data.title = s3gt.utils.get_string('message.auto.translate.domain') + ' ' + current_tab_domain;
  309.                         }
  310.                         //-----------------------------------------
  311.                         else if (menu.id == 'translate_forget') {
  312.                             if (menu_is_active) {
  313.                                 var domain_translate_list = s3gt.utils.prefs_get('domain_translate_list');
  314.                                 if (! domain_translate_list[current_tab_domain]) {
  315.                                     continue;
  316.                                 }
  317.                             } else {
  318.                                 continue;
  319.                             }
  320.                         }
  321.                         //-----------------------------------------
  322.                         else if (menu.id == 'translate_learning') {
  323.                             if (s3gt.utils.prefs_get('learning_lang_to') == 'auto') {
  324.                                 continue;
  325.                             } else {
  326.                                 menu_data.checked = s3gt.utils.prefs_get('learning_enable');
  327.                             }
  328.                         }
  329.                         //-----------------------------------------
  330.                         chrome.contextMenus.create(menu_data, function(){ if (chrome.runtime.lastError) {}; });
  331.                         is_create_separator = true;
  332.                     }
  333.                     //-----------------------------------------------
  334.                 }
  335.             });
  336.         }
  337.     });
  338. }
  339. //------------------------------------------------------------------------------
  340. s3gt.context_browser_action_click = function(event) {
  341.     //------------------------------------------------------------------------
  342.     chrome.tabs.query({  active: true, currentWindow: true }, function(tab_list) {
  343.         if (tab_list && tab_list.length && tab_list[0].id) {
  344.             var current_tab_domain = s3gt.utils.get_url_domain(tab_list[0].url);
  345.             var tab_id = tab_list[0].id;
  346.             var event_new = { 'checked' : event.checked };
  347.             //-----------------------------------------------------------
  348.             if (event.menuItemId == 's3gt_browser_action_translate_page') {
  349.                 event_new.menuItemId = 'translate_page';
  350.                 s3gt.context_menu_click(event_new, tab_id, current_tab_domain);
  351.             } else if (event.menuItemId == 's3gt_browser_action_translate_learning') {
  352.                 event_new.menuItemId = 'translate_learning';
  353.                 s3gt.context_menu_click(event_new, tab_id, current_tab_domain);
  354.             } else if (event.menuItemId == 's3gt_browser_action_translate_allpages_auto') {
  355.                 event_new.menuItemId = 'translate_allpages_auto';
  356.                 s3gt.context_menu_click(event_new, tab_id, current_tab_domain);
  357.             } else if (event.menuItemId == 's3gt_browser_action_go_google') {
  358.                 event_new.menuItemId = 'translate_go_google';
  359.                 s3gt.context_menu_click(event_new, tab_id, current_tab_domain);
  360.             }
  361.         }
  362.     });
  363. }
  364. //------------------------------------------------------------------------------
  365. s3gt.context_menu_click = function(event, tab_id, current_tab_domain) {
  366.     var action_id = event.menuItemId;
  367.  
  368.     //------------------------------------------------------------------------
  369.     if (action_id == 'translate_page_google') {
  370.         s3gt.translate.page_google(tab_id);
  371.     }
  372.     //------------------------------------------------------------------------
  373.     else if (action_id == 'translate_auto') {
  374.         var domain_translate_list = s3gt.utils.prefs_get('domain_translate_list');
  375.         //------------------------------------------------------------------
  376.         if (event.checked) {
  377.             if (! domain_translate_list[current_tab_domain]) { domain_translate_list[current_tab_domain] = {}; }
  378.             if ((s3gt.utils.prefs_get("autotranslate", 'check') != 'stop') && (s3gt.utils.prefs_get("autotranslate", 'check') != 'not-ask')) {
  379.                 domain_translate_list[current_tab_domain].always_domain_question = false;
  380.             }
  381.             domain_translate_list[current_tab_domain].always_domain_translate = true;
  382.             s3gt.utils.prefs_set('domain_translate_list', domain_translate_list);
  383.             s3gt.translate_action('translate_page', tab_id, event.selectionText);
  384.         } else {
  385.             if (domain_translate_list[current_tab_domain]) {
  386.                 domain_translate_list[current_tab_domain].always_domain_translate = false;
  387.             }
  388.             s3gt.utils.prefs_set('domain_translate_list', domain_translate_list);
  389.         }
  390.     }
  391.     //------------------------------------------------------------------------
  392.     else if (action_id == 'translate_forget') {
  393.         var domain_translate_list = s3gt.utils.prefs_get('domain_translate_list');
  394.         //------------------------------------------------------------------
  395.         if (domain_translate_list[current_tab_domain]) {
  396.             delete domain_translate_list[current_tab_domain];
  397.         }
  398.         //------------------------------------------------------------------
  399.         s3gt.utils.prefs_set('domain_translate_list', domain_translate_list)
  400.     }
  401.     //------------------------------------------------------------------------
  402.     else if (action_id == 'translate_allpages_auto') {
  403.         s3gt.utils.prefs_set('autotranslate_allpages', ! s3gt.utils.prefs_get('autotranslate_allpages'));
  404.     }
  405.     //------------------------------------------------------------------------
  406.     else if (action_id == 'translate_learning') {
  407.         s3gt.utils.prefs_set('learning_enable', ! s3gt.utils.prefs_get('learning_enable'));
  408.     }
  409.     //------------------------------------------------------------------------
  410.     else if (action_id == 'translate_go_google') {
  411.         s3gt.open_url(s3gt.work_data.url_google_site, tab_id, true);
  412.     }
  413.     //------------------------------------------------------------------------
  414.     else if (action_id == 's3gt_settings') {
  415.         chrome.runtime.openOptionsPage();
  416.     }
  417.     //------------------------------------------------------------------------
  418.     else {
  419.         s3gt.translate_action(action_id, tab_id, event.selectionText);
  420.     }
  421.     //------------------------------------------------------------------------
  422.     s3gt.context_menu_init();
  423. }
  424. //------------------------------------------------------------------------------
  425. s3gt.translate_action = function(action, tab_id, selection_text) {
  426.     chrome.tabs.sendMessage(tab_id, { 'action' : 'set_prefs_list', 'prefs_list' : s3gt.prefs.list }, function(response) {
  427.         if (chrome.runtime.lastError) {};
  428.  
  429.         chrome.tabs.sendMessage(tab_id, { 'action' : action, 'work_data' : s3gt.work_data, 'selection_text' : selection_text }, { 'frameId' : 0 }, function(response) {
  430.             if (chrome.runtime.lastError || (! response)) {
  431.                 if (action == 'translate_page') {
  432.                     s3gt.translate.page_google(tab_id);
  433.                 }
  434.                 //----------------------------------------------------------
  435.                 else if (action == 'translate_selection') {
  436.                     var url = (selection_text) ? s3gt.work_data.url_google_site_text : s3gt.work_data.url_google_site;
  437.                     url = url.replace("LANG_FROM", s3gt.prefs.get_lang_from());
  438.                     url = url.replace("LANG_TO", s3gt.prefs.get_lang_to());
  439.                     url += s3gt.utils.urlencode(selection_text);
  440.                     //-----------------------------------------------
  441.                     if (s3gt.utils.prefs_get('translate_selection_impossible_target') == 'notifycation') {
  442.                         var data = { 'text' : selection_text, 'lang_from' : s3gt.prefs.get_lang_from(), 'lang_to' : s3gt.prefs.get_lang_to(), 'is_check_lang_pair' : true };
  443.                         data.callback = function(d) {
  444.                             var result_text = (d.result.is_ok) ? d.result.text : d.result.response_error;
  445.                             s3gt.utils.notification_box(result_text, null, url, true);
  446.                         };
  447.                         s3gt.translate.google_request(data);
  448.                     }
  449.                     //-----------------------------------------------
  450.                     else {
  451.                         s3gt.open_url(url, tab_id, true);
  452.                     }
  453.                 }
  454.             }
  455.         });
  456.     });
  457. }
  458. //-----------------------------------------------------------------------------------
  459. //-- this fix-code for Chinese users
  460. //-----------------------------------------------------------------------------------
  461. // Because of the GFW (https://en.wikipedia.org/wiki/Great_Firewall), unable to access google.com in China.
  462. // But because of Google cooperating with Chinese companies, restored access google.cn in China
  463. // But GWF is blocking google.cn translate SSL site.
  464. // But google.cn non-SSL site is not stable.
  465. //
  466. // same for Italian and others country
  467. //-----------------------------------------------------------------------------------
  468. //-----------------------------------------------------------------------------------
  469. s3gt.init_domain_google_translator = function(callback) {
  470.     try {
  471.         var domain_google_translator = s3gt.utils.prefs_get('domain_google_translator');
  472.         if (! domain_google_translator) {
  473.             var domain_google_properties = s3gt.utils.get_string('domain_google_translator');
  474.             if (domain_google_properties == 'domain_google_translator') {
  475.                 domain_google_properties = '';
  476.             }
  477.             domain_google_translator = domain_google_properties || s3gt.domain_google_translator;
  478.             s3gt.utils.prefs_set('domain_google_translator', domain_google_translator);
  479.         }
  480.         //-----------------------------------------------------------------------
  481.         var tmp_domain_google_translator = s3gt.domain_google_translator;
  482.         s3gt.domain_google_translator = domain_google_translator;
  483.         s3gt.init_urls();
  484.         s3gt.domain_google_translator = tmp_domain_google_translator;
  485.         //-----------------------------------------------------------------------
  486.         if (domain_google_translator && (domain_google_translator != s3gt.domain_google_translator)) {
  487.             s3gt.protocol_google_translator = 'https://';
  488.  
  489.             s3gt.utils.check_google(
  490.                 'https://',
  491.                 domain_google_translator,
  492.                 function(status) {
  493.                     if (status) {
  494.                         s3gt.domain_google_translator = domain_google_translator;
  495.                     }
  496.                     s3gt.init_urls(callback, true);
  497.                 },
  498.                 function(status) {
  499.                     if (status) {
  500.                         s3gt.domain_google_translator = domain_google_translator;
  501.                         s3gt.protocol_google_translator = 'http://';
  502.                     }
  503.                     s3gt.init_urls(callback, true);
  504.                 }
  505.             );
  506.         }
  507.         //-----------------------------------------------------------------------
  508.         else {
  509.             s3gt.init_urls(callback, true);
  510.         }
  511.     } catch(e) {
  512.         s3gt.init_urls(callback, true);
  513.     }
  514. }
  515. //-----------------------------------------------------------------------------------
  516. s3gt.init_urls = function(callback, init_tk) {
  517.     s3gt.work_data.protocol_google_translator = s3gt.protocol_google_translator;
  518.     s3gt.work_data.domain_google_translator = s3gt.domain_google_translator;
  519.     s3gt.work_data.url_translate_text = s3gt.protocol_google_translator + s3gt.domain_google_translator + '/translate_a/single?client=gtx&sl=LANG_FROM&tl=LANG_TO&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&dt=at&ie=UTF-8&oe=UTF-8&otf=2&srcrom=1&ssel=0&tsel=0&kc=1&tk=GOOGLE_TK&q=';
  520.     s3gt.work_data.url_translate_text_short = s3gt.protocol_google_translator + s3gt.domain_google_translator + '/translate_a/t?client=mt&sl=LANG_FROM&tl=LANG_TO&v=1.0&source=baf&tk=GOOGLE_TK';
  521.     s3gt.work_data.url_google_site_off = s3gt.protocol_google_translator + s3gt.domain_google_translator + '/#LANG_FROM/LANG_TO/';
  522.     s3gt.work_data.url_google_site = s3gt.protocol_google_translator + s3gt.domain_google_translator + '/';
  523.     s3gt.work_data.url_google_site_text = s3gt.protocol_google_translator + s3gt.domain_google_translator + '/#LANG_FROM/LANG_TO/';
  524.     s3gt.work_data.url_sound_tts_google = s3gt.protocol_google_translator + s3gt.domain_google_translator + '/translate_tts?ie=UTF-8&q=TEXT_REQ&tl=LANG&total=1&idx=0&textlen=TEXT_LENGTH&tk=GOOGLE_TK&client=webapp&prev=input';
  525.     s3gt.work_data.url_translate_page = s3gt.domain_google_translator + '/translate_a/element.js?cb=googleTranslateElementInit&hl=LANG_TO';
  526.     s3gt.work_data.url_translate_page_google_site = s3gt.protocol_google_translator + s3gt.domain_google_translator + '/translate?sl=LANG_FROM&tl=LANG_TO&js=y&u=URL';
  527.  
  528.     s3gt.work_data.url_translate_text_batchexecute = s3gt.protocol_google_translator + s3gt.domain_google_translator + '/_/TranslateWebserverUi/data/batchexecute?rpcids=GOOGLE_KEY&hl=LANG_TO&rt=c';
  529.     s3gt.work_data.url_translate_text_batchexecute_short = s3gt.protocol_google_translator + s3gt.domain_google_translator + '/_/TranslateWebserverUi/data/batchexecute?rpcids=GOOGLE_KEY&hl=LANG_TO&rt=c';
  530.     s3gt.work_data.url_sound_tts_google_batchexecute = s3gt.protocol_google_translator + s3gt.domain_google_translator + '/_/TranslateWebserverUi/data/batchexecute?rpcids=GOOGLE_KEY&hl=LANG_TO&soc-app=1&soc-platform=1&soc-device=1&rt=c';
  531.  
  532.     s3gt.work_data.google_value_tk_newkey = 'MkEWBc';
  533.     s3gt.work_data.google_value_tk_newkey_short = 'QShL0';
  534.     s3gt.work_data.google_value_tk_newkey_sound = 'jQ1olc';
  535.  
  536.     if (init_tk) { s3gt.google_value_tk_init(); }
  537.     if (callback) { callback(); }
  538. }
  539. //-----------------------------------------------------------------------------------
  540. s3gt.google_value_tk_init = function() {
  541.     s3gt.work_data.google_value_tk = s3gt.utils.prefs_get('google_value_tk');
  542.     s3gt.google_value_tk_load();
  543. }
  544. //-----------------------------------------------------------------------------------
  545. s3gt.google_value_tk_load = function(callback) {
  546.     var req = new XMLHttpRequest();
  547.     var url = s3gt.protocol_google_translator + s3gt.domain_google_translator + "/";
  548.     var timeout_value = s3gt.utils.prefs_get('google_value_tk_timeout') || 2;
  549.     var timeout = setTimeout( function(){ req.abort(); }, timeout_value * 1000);
  550.     req.onreadystatechange = function () {
  551.         if (req.readyState == 4) {
  552.             clearTimeout(timeout);
  553.             if (req.status == 200) {
  554.                 s3gt.google_value_tk_parse(req.responseText, callback);
  555.             }
  556.         }
  557.     };
  558.     req.open("GET", url, true);
  559.     req.setRequestHeader("x-accept", 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');
  560.     req.setRequestHeader("x-secfetchdest", 'document');
  561.     req.setRequestHeader("x-secfetchsite", 'none');
  562.     req.send(null);
  563. }
  564. //-----------------------------------------------------------------------------------
  565. s3gt.google_value_tk_parse = function(responseText, callback) {
  566.     //-----------------------------------------------------------------------------
  567.     // verson 1
  568.     // TKK=eval('((function(){var a\x3d4264492758;var b\x3d-1857761911;return 406375+\x27.\x27+(a+b)})())');
  569.     //-----------------------------------------------------------------------------
  570.     // verson 2
  571.     // TKK='427233.3134777927';
  572.     //-----------------------------------------------------------------------------
  573.     var res = /;TKK=(.*?\'\));/i.exec(responseText);
  574.     var result = '';
  575.     //-----------------------------------------------------------------------------
  576.     if (res == null) {
  577.         //-----------------------------------------------------------------------
  578.         // version 3
  579.         //-----------------------------------------------------------------------
  580.         res = /\,tkk\:(\'.*?\')/i.exec(responseText);
  581.     }
  582.     //-----------------------------------------------------------------------------
  583.     if (res != null) {
  584.         //-----------------------------------------------------------------------
  585.         // verson 2
  586.         //-----------------------------------------------------------------------
  587.         if (/^\'\d+\.\d+/.test(res[1])) {
  588.             var res2 = /^\'(\d+\.\d+)/i.exec(res[1]);
  589.             if (res2 != null) {
  590.                 result = res2[1];
  591.             }
  592.         }
  593.         //-----------------------------------------------------------------------
  594.         // verson 1
  595.         //-----------------------------------------------------------------------
  596.         else {
  597.             var res2 = /var a=(.*?);.*?var b=(.*?);.*?return (\d+)/i.exec(res[1].replace(/\\x3d/g, '='));
  598.             if (res2 != null) {
  599.                 result = Number(res2[3]) + '.' + (Number(res2[1]) + Number(res2[2]));
  600.             }
  601.         }
  602.     }
  603.     //-----------------------------------------------------------------------------
  604.     // for batchexecute
  605.     //-----------------------------------------------------------------------------
  606.     else {
  607.         //-----------------------------------------------------------------------------
  608.         // version 3
  609.         //-----------------------------------------------------------------------------
  610.         res = /https\:\\\/\\\/myactivity\.google\.com\\\/product\\\/google_translate\?utm_source\\x3dtranslate_web\'\,\'.*?\'\,\'.*?\'\,\'([^\']+)/i.exec(responseText);
  611.         if (res != null) {
  612.             result = 'ZZZ|||' + res[1];
  613.         }
  614.         //-----------------------------------------------------------------------------
  615.         // version 2
  616.         //-----------------------------------------------------------------------------
  617.         if (res == null) {
  618.             res = /https\:\\\/\\\/myactivity\.google\.com\\\/product\\\/google_translate\?utm_source\\x3dtranslate_web\'\,\'([^\']+)/i.exec(responseText);
  619.             if (res != null) {
  620.                 result = 'ZZZ|||' + res[1];
  621.             }
  622.         }
  623.         //-----------------------------------------------------------------------------
  624.         // version 1
  625.         //-----------------------------------------------------------------------------
  626.         if (res == null) {
  627.             res = /https\:\\\/\\\/myactivity\.google\.com\\\/myactivity\?product\\x3d58\'\,\'([^\']+)/i.exec(responseText);
  628.             if (res != null) {
  629.                 result = 'ZZZ|||' + res[1];
  630.             } else {
  631.                 res = /https\:\\\/\\\/myactivity\.google\.com\\\/myactivity\?product\\x3d58\'\,\s*(null)/i.exec(responseText);
  632.                 if (res != null) {
  633.                     result = 'ZZZ|||';
  634.                 }
  635.             }
  636.         }
  637.     }
  638.     //-----------------------------------------------------------------------------
  639.     //-----------------------------------------------------------------------------
  640.     if (result) {
  641.         s3gt.utils.prefs_set('google_value_tk', result);
  642.         s3gt.work_data.google_value_tk = result;
  643.         if (callback) {
  644.             callback(s3gt.work_data.google_value_tk);
  645.         }
  646.     }
  647. }
  648. //-----------------------------------------------------------------------------------
  649. s3gt.open_url = function(url, tab_id, pos_after_active) {
  650.     if (pos_after_active && tab_id) {
  651.         chrome.tabs.get(tab_id, function(tab) {
  652.             chrome.tabs.create({ 'url' : url, 'active' : true, 'index' : tab.index+1 }, function(tab_new) { if (chrome.runtime.lastError) {} });
  653.         });
  654.     } else {
  655.         chrome.tabs.create({ 'url' : url, active: true }, function(tab) { if (chrome.runtime.lastError) {} });
  656.     }
  657. }
  658. //-----------------------------------------------------------------------------------
  659. s3gt.send_work_data = function(tab_id) {
  660.     s3gt.work_data.current_id = s3gt.utils.random_string(8);
  661.     chrome.tabs.sendMessage(tab_id, { 'action' : 'set_work_data', 'work_data' : s3gt.work_data, 're_init' : true }, { 'frameId' : 0 }, function(response) { if (chrome.runtime.lastError) {}; });
  662. }
  663. //------------------------------------------------------------------------------
  664. chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) { return s3gt.onMessage(request, sender, sendResponse); });
  665. //------------------------------------------------------------------------------
  666. s3gt.onMessage = function(request, sender, sendResponse) {
  667.     //------------------------------------------------------------------------
  668.     if (! request) { return; }
  669.     //------------------------------------------------------------------------
  670.     if (sender.tab) {
  671.         request.tab_id = sender.tab.id;
  672.     }
  673.     else if (request.tabId) {
  674.         request.tab_id = request.tabId;
  675.     }
  676.     //------------------------------------------------------------------------
  677.     if (request.action_prefs_set && request.pref_name) {
  678.         s3gt.utils.prefs_set(request.pref_name, request.pref_value);
  679.         if (request.pref_name == 'current_locale') {
  680.             s3gt.i18n.init(request.pref_value);
  681.             s3gt.context_menu_init_timer();
  682.             s3gt.send_work_data(request.tab_id);
  683.         }
  684.         else if (/^context_menu_/.test(request.pref_name)) {
  685.             s3gt.context_menu_init_timer();
  686.         }
  687.         else if (request.pref_name == 'autotranslate_allpages') {
  688.             s3gt.context_menu_init_timer();
  689.         }
  690.         else if (request.pref_name == 'learning_enable') {
  691.             s3gt.context_menu_init_timer();
  692.         }
  693.         else if (request.pref_name == 'domain_translate_list') {
  694.             s3gt.context_menu_init_timer();
  695.         }
  696.         else if (request.pref_name == 'list_disabled_lang_to') {
  697.             s3gt.send_work_data(request.tab_id);
  698.         }
  699.         else if (request.pref_name == 'default_lang_to') {
  700.             s3gt.prefs.init_lang_to();
  701.             s3gt.send_work_data(request.tab_id);
  702.         }
  703.         else if (request.pref_name == 'domain_google_translator') {
  704.             s3gt.init_domain_google_translator(function(){
  705.                 s3gt.send_work_data(request.tab_id);
  706.             });
  707.         }
  708.         else if ((request.pref_name == 'autotranslate_allpages') && (request.pref_value)) {
  709.             chrome.tabs.query({  active: true, currentWindow: true }, function(tab_list) {
  710.                 if (tab_list && tab_list.length && tab_list[0].id) {
  711.                     chrome.tabs.sendMessage(tab_list[0].id, { 'action' : 'translate_page_run', 'work_data' : s3gt.work_data }, function(response) { if (chrome.runtime.lastError) {} });
  712.                 }
  713.             });
  714.         }
  715.         sendResponse({ 'success' : true });
  716.     }
  717.     //------------------------------------------------------------------------
  718.     else if (request.action_prefs_get) {
  719.         sendResponse({ 'prefs_list' : s3gt.prefs.list });
  720.     }
  721.     //------------------------------------------------------------------------
  722.     else if (request.action_reset_defaults) {
  723.         s3gt.prefs.reset_defaults(function(){
  724.             s3gt.i18n.init();
  725.             s3gt.context_menu_init_timer();
  726.         });
  727.         sendResponse({ 'success' : true });
  728.     }
  729.     //------------------------------------------------------------------------
  730.     else if (request.save_settings) {
  731.         var result = [];
  732.         //------------------------------------------------------------------
  733.         var prefs_list = s3gt.utils.clone_object(s3gt.prefs.list);
  734.         var exclude_prefs = { 'current_version' : 1,    'not_open_contribute_page' : 1, 'is_first_run' : 1, 'show_page_timer' : 1, 'work_data_tooltip' : 1, 'google_value_tk' : 1, 'google_value_tk_timeout' : 1, '_end' : 1 };
  735.         //------------------------------------------------------------------
  736.         for (var pref_name in prefs_list) {
  737.             if (exclude_prefs[pref_name]) { continue; }
  738.             //------------------------------------------------------------
  739.             if (typeof(prefs_list[pref_name]) == 'object') {
  740.                 result.push(pref_name + '='  + JSON.stringify(prefs_list[pref_name]));
  741.             } else if (typeof(prefs_list[pref_name]) == 'array') {
  742.                 result.push(pref_name + '='  + JSON.stringify(prefs_list[pref_name]));
  743.             } else {
  744.                 result.push(pref_name + '='  + prefs_list[pref_name]);
  745.             }
  746.         }
  747.         //-------------------------------------------------------------------
  748.         var result_txt = result.join("\n") + "\n";
  749.         //-------------------------------------------------------------------
  750.         if (request.mode == "copy") {
  751.             s3gt.utils.copy_clipboard(result_txt, '', true);
  752.             s3gt.utils.notification_box(s3gt.utils.get_string('message.settings.copied'));
  753.         }
  754.         //-------------------------------------------------------------------
  755.         else if(request.mode == "save") {
  756.             var blob1 = new Blob([result_txt], { type: "text/plain" });
  757.             var result_url = URL.createObjectURL(blob1);
  758.             var date = new Date();
  759.             var dd = date.getDate(); if (dd < 10) { dd = '0' + dd; }
  760.             var mm = date.getMonth() + 1; if (mm < 10) { mm = '0' + mm; }
  761.             var hh = date.getHours(); if (hh < 10) { hh = '0' + hh; }
  762.             var mn = date.getMinutes(); if (mn < 10) { mn = '0' + mn; }
  763.             var ss = date.getSeconds(); if (ss < 10) { ss = '0' + ss; }
  764.  
  765.             var filename = 'S3Translator.' + date.getFullYear() + '.' + mm + '.'  + dd + '.'  + hh + '.'  + mn + '.'  + ss + '.txt';
  766.    
  767.             chrome.downloads.download({
  768.                 url: result_url,
  769.                 filename: filename,
  770.                 saveAs: true
  771.             }, function (downloadId) {
  772.             });
  773.         }
  774.         sendResponse({ 'success' : true });
  775.     }
  776.     //------------------------------------------------------------------------
  777.     else if (request.action_open_settings) {
  778.         chrome.runtime.openOptionsPage();
  779.         sendResponse({ 'success' : true });
  780.     }
  781.     //------------------------------------------------------------------------
  782.     else if (request.action_get_strings && request.string_list) {
  783.         for (var i in request.string_list) {
  784.             request.string_list[i] = s3gt.utils.get_string(i);
  785.         }
  786.         sendResponse({ 'string_list' : request.string_list });
  787.     }
  788.     //------------------------------------------------------------------------
  789.     else if (request.init_content_scripts) {
  790.         s3gt.set_content_scripts(sender.tab.id, sender.frameId, undefined, true);
  791.         sendResponse({ 'success' : true });
  792.     }
  793.     //------------------------------------------------------------------------
  794.     //------------------------------------------------------------------------
  795.     else if (request.set_work_data) {
  796.         request.data.tab_id = request.tab_id;
  797.         //------------------------------------------------------------------
  798.         if (request.data.tooltip) {
  799.             chrome.tabs.query({  active: true }, function(tab_list) {
  800.                 if (tab_list && tab_list.length) {
  801.                     for (var i in  tab_list) {
  802.                         if (tab_list[i].id == request.data.tab_id) {
  803.                             s3gt.work_data.current_id = request.data.current_id;
  804.                             s3gt.work_data.tooltip = request.data.tooltip;
  805.                             //----------------------------------
  806.                             if (s3gt.utils.prefs_get('translate_box_restore_restart')) {
  807.                                 s3gt.utils.prefs_set("work_data_tooltip", request.data.tooltip);
  808.                             } else {
  809.                                 s3gt.utils.prefs_set("work_data_tooltip", []);
  810.                             }
  811.                         }
  812.                     }
  813.                 }
  814.             });
  815.         }
  816.         sendResponse({ 'success' : true });
  817.     }
  818.     //------------------------------------------------------------------------
  819.     else if (request.get_work_data) {
  820.         sendResponse({ 'work_data' : s3gt.work_data, 'tab_id' : request.tab_id });
  821.     }
  822.     //------------------------------------------------------------------------
  823.     else if (request.google_request) {
  824.         request.data.tab_id = request.tab_id;
  825.         request.data.frame_id = sender.frameId;
  826.         //------------------------------------------------------------------
  827.         request.data.callback = function(data) {
  828.             chrome.tabs.sendMessage(data.tab_id, { 'action' : 'google_response', 'data' : data }, { 'frameId' : sender.frameId }, function(response) { if (chrome.runtime.lastError) {} });
  829.         }
  830.         //------------------------------------------------------------------
  831.         s3gt.translate.google_request(request.data);
  832.         sendResponse({ 'success' : true });
  833.     }
  834.     //------------------------------------------------------------------------
  835.     else if (request.google_request_text_short) {
  836.         request.data.tab_id = request.tab_id;
  837.         request.data.frame_id = sender.frameId;
  838.         //------------------------------------------------------------------
  839.         request.data.callback = function(data) {
  840.             chrome.tabs.sendMessage(data.tab_id, { 'action' : 'google_response', 'data' : data }, { 'frameId' : sender.frameId }, function(response) { if (chrome.runtime.lastError) {} });
  841.         }
  842.         //------------------------------------------------------------------
  843.         s3gt.translate.google_request_text_short(request.data);
  844.         sendResponse({ 'success' : true });
  845.     }
  846.     //------------------------------------------------------------------------
  847.     else if (request.google_value_tk_load) {
  848.         s3gt.google_value_tk_load(function(tkk){
  849.             chrome.tabs.sendMessage(request.tab_id, { 'action' : 'google_value_tk', 'result' : tkk }, { 'frameId' : sender.frameId }, function(response) { if (chrome.runtime.lastError) {} });
  850.         });
  851.         sendResponse({ 'success' : true });
  852.     }
  853.     //------------------------------------------------------------------------
  854.     else if (request.create_fly_iframe) {
  855.         chrome.tabs.sendMessage(request.tab_id, { 'action' : 'create_fly_custom', 'work_data' : s3gt.work_data, 'prefs_list' : s3gt.prefs.list, 'data' : request.data }, { 'frameId' : 0 }, function(response) { if (chrome.runtime.lastError) {} });
  856.         sendResponse({ 'success' : true });
  857.     }
  858.     //------------------------------------------------------------------------
  859.     else if (request.remove_fly_iframe) {
  860.         chrome.tabs.sendMessage(request.tab_id, { 'action' : 'remove_fly_custom' }, { 'frameId' : 0 }, function(response) { if (chrome.runtime.lastError) {} });
  861.         sendResponse({ 'success' : true });
  862.     }
  863.     //------------------------------------------------------------------------
  864.     else if (request.move_fly_iframe) {
  865.         chrome.tabs.sendMessage(request.tab_id, { 'action' : 'move_fly_custom', 'data' : request.data }, { 'frameId' : 0 }, function(response) { if (chrome.runtime.lastError) {} });
  866.         sendResponse({ 'success' : true });
  867.     }
  868.     //------------------------------------------------------------------------
  869.     else if (request.style_theme_load) {
  870.         var req = new XMLHttpRequest();
  871.         req.open("GET", request.url, true);
  872.         req.overrideMimeType("text/css");
  873.         req.onreadystatechange = function () {
  874.             if (req.readyState == 4) {
  875.                 chrome.tabs.sendMessage(request.tab_id, { 'action' : 'style_theme_load', 'result' : req.responseText, 'id_session' : request.id_session }, { 'frameId' : sender.frameId }, function(response) { if (chrome.runtime.lastError) {} });
  876.             }
  877.         };
  878.         req.send(null);
  879.         sendResponse({ 'success' : true });
  880.     }
  881.     //------------------------------------------------------------------------
  882.     else if (request.open_url) {
  883.         s3gt.open_url(request.url, request.tab_id, request.pos_after_active);
  884.         sendResponse({ 'success' : true });
  885.     }
  886.     //------------------------------------------------------------------------
  887.     else if (request.notification_box) {
  888.         s3gt.utils.notification_box(request.msg, request.title, request.url);
  889.         sendResponse({ 'success' : true });
  890.     }
  891.     //------------------------------------------------------------------------
  892.     else if (request.translate_action) {
  893.         if (request.method == 'translate_page_google') {
  894.             s3gt.translate.page_google(request.tab_id);
  895.         } else {
  896.             s3gt.translate_action(request.method, request.tab_id);
  897.         }
  898.         sendResponse({ 'success' : true });
  899.     }
  900.     //------------------------------------------------------------------------
  901.     else if (request.go_google) {
  902.         s3gt.open_url(s3gt.work_data.url_google_site, request.tab_id, true);
  903.         sendResponse({ 'success' : true });
  904.     }
  905.     //------------------------------------------------------------------------
  906.     else if (request.go_donate) {
  907.         s3gt.open_url(s3gt.work_data.go_donate, request.tab_id, true);
  908.         sendResponse({ 'success' : true });
  909.     }
  910.     //------------------------------------------------------------------------
  911.     else if (request.s3gt_main_init) {
  912.         chrome.tabs.getZoom(request.tab_id, function(zoom_index) {
  913.             chrome.tabs.sendMessage(request.tab_id, { 'action' : 's3gt_main_init', 'work_data' : s3gt.work_data, 'tab_id' : request.tab_id, 'zoom_index' : zoom_index}, function(response) { if (chrome.runtime.lastError) {} });
  914.         });
  915.         sendResponse({ 'success' : true });
  916.     }
  917.     //------------------------------------------------------------------------
  918.     else if (request.get_zoom_tab) {
  919.         chrome.tabs.getZoom(request.tab_id, function(zoom_index) {
  920.             chrome.tabs.sendMessage(request.tab_id, { 'action_change_zoom' : true, 'zoom_index' : zoom_index}, function(response) { if (chrome.runtime.lastError) {} });
  921.         });
  922.         sendResponse({ 'success' : true });
  923.     }
  924.     //------------------------------------------------------------------------
  925.     else if (request.detect_language) {
  926.         chrome.tabs.query({  active: true, currentWindow: true }, function(tab_list) {
  927.             if (tab_list && tab_list.length && tab_list[0].id && (tab_list[0].id == request.tab_id)) {
  928.                 chrome.tabs.detectLanguage(request.tab_id, function(language) {
  929.                     if (chrome.runtime.lastError) {
  930.                     } else {
  931.                         language = (language == 'und') ? '' : language;
  932.                         chrome.tabs.sendMessage(request.tab_id, { 'action' : 'load_tab', 'work_data' : s3gt.work_data, 'language' : language }, function(response) { if (chrome.runtime.lastError) {} });
  933.                     }
  934.                 });
  935.             } else {
  936.                 chrome.tabs.sendMessage(request.tab_id, { 'action' : 'load_tab', 'work_data' : s3gt.work_data, 'language' : '' }, function(response) { if (chrome.runtime.lastError) {} });
  937.             }
  938.         });
  939.         sendResponse({ 'success' : true });
  940.     }
  941.     //------------------------------------------------------------------------
  942.     else if (request.sound_play_get_url_batchexecute) {
  943.         var url = s3gt.translate.google_speech_request_batchexecute(request.tkk, request.sound_lang, request.string);
  944.         sendResponse({ 'success' : true, 'url' : url });
  945.     }
  946.     //------------------------------------------------------------------------
  947.     else if (request.action_window_close) {
  948.         chrome.tabs.remove(request.tab_id);
  949.         sendResponse({ 'success' : true });
  950.     }
  951. }
  952. //------------------------------------------------------------------------------
  953. //chrome.webRequest.onCompleted.addListener(function(details) {
  954. /*
  955.     if (details.tabId < 0) { return; }
  956.     if (details.statusCode != 200) { return; }
  957.  
  958.     setTimeout(function(){
  959.         //-----------------------------------------------------------------
  960.         var check_detect_timer = setTimeout(function(){
  961.             s3gt.set_content_scripts(details.tabId, 0, function(tab_id) {
  962.                 chrome.tabs.sendMessage(tab_id, { 'action' : 'load_tab', 'work_data' : s3gt.work_data, 'language' : '' }, function(response) { if (chrome.runtime.lastError) {} });
  963.             });
  964.             check_detect_timer = null;
  965.         }, 2000);
  966.         //-----------------------------------------------------------------
  967.         chrome.tabs.detectLanguage(details.tabId, function(language) {
  968.             if (chrome.runtime.lastError) {
  969.             } else {
  970.                 if (check_detect_timer) {
  971.                     language = (language == 'und') ? '' : language;
  972.                     s3gt.set_content_scripts(details.tabId, 0, function(tab_id) {
  973.                         chrome.tabs.sendMessage(tab_id, { 'action' : 'load_tab', 'work_data' : s3gt.work_data, 'language' : language }, function(response) { if (chrome.runtime.lastError) {} });
  974.                     });
  975.                     clearTimeout(check_detect_timer);
  976.                 }
  977.             }
  978.         });
  979.     }, 2000);
  980. */
  981. //}, {
  982. //  urls: ["http://*/*", "https://*/*"],
  983. //  types: ["main_frame"]
  984. //});
  985. //------------------------------------------------------------------------------
  986. var extraInfoSpec = ['blocking', 'requestHeaders'];
  987. if (chrome.webRequest.OnBeforeSendHeadersOptions.hasOwnProperty('EXTRA_HEADERS')) {
  988.     extraInfoSpec.push('extraHeaders');
  989. }
  990. //------------------------------------------------------------------------------
  991. chrome.webRequest.onBeforeSendHeaders.addListener(
  992.     function(info) {
  993.         // Replace the Referer header
  994.         var headers = info.requestHeaders;
  995.         var is_translate_google = false;
  996.         var x_referer = '';
  997.         var x_accept = '';
  998.         var x_secfetchdest = '';
  999.         var x_secfetchsite = '';
  1000.         //-----------------------------------------------------------------
  1001.         if (/^https?\:\/\/translate\.google/.test(info.url)) {
  1002.             is_translate_google = true;
  1003.             x_referer = s3gt.work_data.url_google_site;
  1004.         }
  1005.         //-----------------------------------------------------------------
  1006.         var header = null;
  1007.         var new_headers = [];
  1008.         while (header = headers.shift()) {
  1009.             if (is_translate_google && /^X\-/.test(header.name)) {
  1010.             }
  1011.             else if (is_translate_google && /DNT/.test(header.name)) {
  1012.             }
  1013.             else if (is_translate_google && /Origin/.test(header.name)) {
  1014.             }
  1015.             else if (header.name === 'x-referer') {
  1016.                 x_referer = header.value;
  1017.             }
  1018.             else if (header.name === 'x-accept') {
  1019.                 x_accept = header.value;
  1020.             }
  1021.             else if (header.name === 'x-secfetchdest') {
  1022.                 x_secfetchdest = header.value;
  1023.             }
  1024.             else if (header.name === 'x-secfetchsite') {
  1025.                 x_secfetchsite = header.value;
  1026.             } else {
  1027.                 new_headers.push(header);
  1028.             }
  1029.         }
  1030.         headers = new_headers;
  1031.  
  1032.         //-----------------------------------------------------------------
  1033.         if (x_referer || x_accept || x_secfetchdest || x_secfetchsite) {
  1034.             for (var i = 0; i < headers.length; i++) {
  1035.                 if (x_referer && (headers[i].name.toLowerCase() == 'referer')) {
  1036.                     headers[i].value = x_referer;
  1037.                     x_referer = '';
  1038.                 }
  1039.                 else if (x_accept && (headers[i].name.toLowerCase() == 'accept')) {
  1040.                     headers[i].value = x_accept;
  1041.                     x_accept = '';
  1042.                 }
  1043.                 else if (x_secfetchdest && (headers[i].name.toLowerCase() == 'sec-fetch-dest')) {
  1044.                     headers[i].value = x_secfetchdest;
  1045.                     x_secfetchdest = '';
  1046.                 }
  1047.                 else if (x_secfetchsite && (headers[i].name.toLowerCase() == 'sec-fetch-site')) {
  1048.                     headers[i].value = x_secfetchsite;
  1049.                     x_secfetchsite = '';
  1050.                 }
  1051.  
  1052.             }
  1053.             if (x_referer) {
  1054.                 headers.push({ 'name' : 'Referer', 'value' : x_referer });
  1055.             }
  1056.             if (x_accept) {
  1057.                 headers.push({ 'name' : 'Accept', 'value' : x_accept });
  1058.             }
  1059.             if (x_secfetchdest) {
  1060.                 headers.push({ 'name' : 'Sec-Fetch-Dest', 'value' : x_secfetchdest });
  1061.             }
  1062.             if (x_secfetchsite) {
  1063.                 headers.push({ 'name' : 'Sec-Fetch-Site', 'value' : x_secfetchsite });
  1064.             }
  1065.         }
  1066.         //-----------------------------------------------------------------
  1067.         return { requestHeaders: headers };
  1068.     },
  1069.     {urls: ["http://*/*", "https://*/*"]},
  1070.     extraInfoSpec
  1071. );
  1072. //------------------------------------------------------------------------------
  1073. // check Content Security Policy  "style-src" for styles fly-window and bottom panel
  1074. //------------------------------------------------------------------------------
  1075. chrome.webRequest.onHeadersReceived.addListener(
  1076.     function(httpChannel) {
  1077.         var headers = httpChannel.responseHeaders;
  1078.         //-----------------------------------------------------------------
  1079.         for (var i = 0; i < headers.length; i++) {
  1080.             if (headers[i].name.toLowerCase() === 'content-security-policy') {
  1081.                 var policy_list = headers[i].value.split(/\;/);
  1082.                 for (var p=0; p<policy_list.length; p++) {
  1083.                     if (/^\s*style\-src/.test(policy_list[p])) {
  1084.                         s3gt.work_data.tab_id_scp[httpChannel.tabId] = true;
  1085.                         break;
  1086.                     }
  1087.                 }
  1088.                 break;
  1089.             }
  1090.         }
  1091.         return;
  1092.     },
  1093.     {
  1094.         urls: ["http://*/*", "https://*/*"],
  1095.         types: ["main_frame"]
  1096.     },
  1097.     ["responseHeaders"]
  1098. );
  1099. //------------------------------------------------------------------------------
  1100. // chrome.tabs.onHighlighted.addListener(function(){ s3gt.init_general_data(); });
  1101. //-------------------------------------------------------------------------------------------
  1102. chrome.tabs.onActivated.addListener(function(activeInfo){ s3gt.init_main_data(null, activeInfo.tabId); });
  1103. //-------------------------------------------------------------------------------------------
  1104. chrome.tabs.onUpdated.addListener(function(tabId, changeInfo){
  1105.     if (! changeInfo) { return; }
  1106.     s3gt.init_main_data(changeInfo, tabId);
  1107. });
  1108. //-------------------------------------------------------------------------------------------
  1109. chrome.tabs.onRemoved.addListener(function(tab_id, removeInfo) {
  1110.     s3gt.work_data.tooltip = s3gt.utils.prefs_get("work_data_tooltip");
  1111.     var tooltip_list_tmp = [];
  1112.     for (var i=0; i<s3gt.work_data.tooltip.length; i++) {
  1113.         var tooltip = s3gt.work_data.tooltip[i];
  1114.         if (tooltip.translate_tooltip_pin == 'alltabs') {
  1115.             tooltip_list_tmp.push(tooltip);
  1116.         } else if (tooltip.tab_id != tab_id) {
  1117.             tooltip_list_tmp.push(tooltip);
  1118.         }
  1119.     }
  1120.     s3gt.work_data.tooltip = tooltip_list_tmp;
  1121.     s3gt.utils.prefs_set('work_data_tooltip', s3gt.work_data.tooltip);
  1122. });
  1123. //-------------------------------------------------------------------------------------------
  1124. try {
  1125.     chrome.windows.onFocusChanged.addListener(function(windowId){ setTimeout(function(){ s3gt.init_main_data(); }, 200); });
  1126. } catch(e) {};
  1127. //-------------------------------------------------------------------------------------------
  1128. chrome.webNavigation.onDOMContentLoaded.addListener(function(details){ s3gt.init_main_data({ d: details, 'status' : 'loading' , 'source' : 'webNavigation', 'tab_id' : details.tabId, 'frame_id' : details.frameId }, details.tabId); });
  1129. //-------------------------------------------------------------------------------------------
  1130. try {
  1131.     chrome.tabs.onZoomChange.addListener(function(zoom) {
  1132.         chrome.tabs.sendMessage(zoom.tabId, { 'action_change_zoom' : true, 'zoom_index' : zoom.newZoomFactor}, function(response) { if (chrome.runtime.lastError) {} });
  1133.     });
  1134. } catch(e) {};
  1135. //-------------------------------------------------------------------------------------------
  1136. chrome.notifications.onClicked.addListener(function(notification_id) {
  1137.     if (s3gt.notification_list[notification_id] && s3gt.notification_list[notification_id].url) {
  1138.         chrome.tabs.query({  active: true, currentWindow: true }, function(tab_list) {
  1139.             if (tab_list && tab_list.length && tab_list[0].id) {
  1140.                 s3gt.open_url(s3gt.notification_list[notification_id].url, tab_list[0].id, true);
  1141.             } else {
  1142.                 s3gt.open_url(s3gt.notification_list[notification_id].url);
  1143.             }
  1144.             chrome.notifications.clear(notification_id);
  1145.         });
  1146.     }
  1147. });
  1148. //-------------------------------------------------------------------------------------------
  1149. chrome.notifications.onClosed.addListener(function(notification_id) {
  1150.     delete s3gt.notification_list[notification_id];
  1151. });
  1152. //------------------------------------------------------------------------------
  1153. chrome.runtime.onUpdateAvailable.addListener(function(){
  1154. //  chrome.runtime.reload();
  1155. });
  1156. //------------------------------------------------------------------------------
  1157. setTimeout(s3gt.init, 1000);
  1158. //------------------------------------------------------------------------------
  1159.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement