11// Set up context menu for images
2- var title = chrome . i18n . getMessage ( "contextMenuTitle" ) ;
3- chrome . contextMenus . create ( {
4- id : "343642_image-reverse-search" ,
5- title : title ,
6- contexts : [ "image" ]
7- } ) ;
2+ function createContextMenu ( options ) {
3+ const title = chrome . i18n . getMessage ( "contextMenuTitle" ) ;
4+
5+ /* If there is only one search provider, do not create a submenu */
6+ if ( options . searchProviders . length == 1 ) {
7+ chrome . contextMenus . create ( {
8+ id : options . searchProviders [ 0 ] ,
9+ title : title ,
10+ contexts : [ "image" ]
11+ } ) ;
12+ return
13+ }
14+
15+ /* Create menu and submenu entries */
16+ chrome . contextMenus . create ( {
17+ id : "Image-Reverse-Search" ,
18+ title : title ,
19+ contexts : [ "image" ]
20+ } ) ;
21+ for ( i = 0 ; i < options . searchProviders . length ; i ++ ) {
22+ chrome . contextMenus . create ( {
23+ parentId : "Image-Reverse-Search" ,
24+ id : options . searchProviders [ i ] ,
25+ title : searchProviderNames [ options . searchProviders [ i ] ] ,
26+ contexts : [ "image" ]
27+ } ) ;
28+ }
29+ }
830
931/* Default settings. If there is nothing in storage, use these values. */
1032var defaultSettings = {
1133 openInBackground : false ,
1234 openTabAt : "right" ,
13- searchProvider : "google"
14- }
15-
16- /* Generic error logger. */
17- function onError ( e ) {
18- console . error ( e ) ;
35+ searchProviders : [ "google" ]
1936}
2037
21- /* On startup, check whether we have stored settings.
22- If we don't, then store the default settings. */
38+ /* On startup, check whether we have stored settings and set up the context menu .
39+ If we don't, then store the default settings. */
2340function checkStoredSettings ( storedSettings ) {
24- if ( ! storedSettings . openInBackground || ! storedSettings . openTabAt || ! storedSettings . searchProvider ) {
41+ if ( storedSettings . openInBackground == null || ! storedSettings . openTabAt || ! storedSettings . searchProviders ) {
2542 chrome . storage . sync . set ( defaultSettings ) ;
43+ createContextMenu ( defaultSettings ) ;
44+ } else {
45+ chrome . storage . sync . get ( "searchProviders" , createContextMenu ) ;
2646 }
2747}
2848
29- const gettingStoredSettings = chrome . storage . sync . get ( null , checkStoredSettings ) ;
30-
3149function reverseSearch ( info , storedSettings ) {
3250 function getTabIndex ( openTabAt , tabs ) {
3351 if ( openTabAt == 'right' ) {
@@ -39,32 +57,32 @@ function reverseSearch(info, storedSettings) {
3957 }
4058 }
4159
42- function getSearchProvider ( searchProvider ) {
43- if ( searchProvider == 'google' ) {
60+ function getSearchProviderURL ( searchProviderName ) {
61+ if ( searchProviderName == 'google' ) {
4462 return 'https://www.google.com/searchbyimage?image_url=%s' ;
45- } else if ( searchProvider == 'bing' ) {
63+ } else if ( searchProviderName == 'bing' ) {
4664 return 'https://www.bing.com/images/searchbyimage?FORM=IRSBIQ&cbir=sbi&imgurl=%s' ;
47- } else if ( searchProvider == 'yandex' ) {
65+ } else if ( searchProviderName == 'yandex' ) {
4866 return 'https://yandex.com/images/search?url=%s&rpt=imageview' ;
49- } else if ( searchProvider == 'yandexru' ) {
67+ } else if ( searchProviderName == 'yandexru' ) {
5068 return 'https://yandex.ru/images/search?url=%s&rpt=imageview' ;
51- } else if ( searchProvider == 'tineye' ) {
69+ } else if ( searchProviderName == 'tineye' ) {
5270 return 'https://www.tineye.com/parse?url=%s' ;
53- } else if ( searchProvider == 'baidu' ) {
71+ } else if ( searchProviderName == 'baidu' ) {
5472 return 'https://image.baidu.com/n/pc_search?queryImageUrl=%s'
55- } else if ( searchProvider == 'saucenao' ) {
73+ } else if ( searchProviderName == 'saucenao' ) {
5674 return 'https://saucenao.com/search.php?db=999&url=%s'
57- } else if ( searchProvider == 'iqdb' ) {
75+ } else if ( searchProviderName == 'iqdb' ) {
5876 return 'https://iqdb.org/?url=%s'
59- } else if ( searchProvider == 'other' ) {
77+ } else if ( searchProviderName == 'other' ) {
6078 return storedSettings . cseProvider ;
6179 }
6280 }
6381
6482 const imageURL = info . srcUrl ;
6583 const openInBackground = storedSettings . openInBackground ;
6684 const openTabAt = storedSettings . openTabAt ;
67- const searchProvider = getSearchProvider ( storedSettings . searchProvider ) ;
85+ const searchProvider = getSearchProviderURL ( info . menuItemId ) ;
6886
6987 function openImageSearch ( tabs ) {
7088 tabIndex = getTabIndex ( openTabAt , tabs ) ;
@@ -78,6 +96,20 @@ function reverseSearch(info, storedSettings) {
7896 chrome . tabs . query ( { currentWindow : true , active : true } , openImageSearch ) ;
7997}
8098
99+ /* Load search engine names and settings and set up context menu */
100+ const searchProviderNames = {
101+ google : "Google" ,
102+ bing : "Bing" ,
103+ yandex : "Yandex" ,
104+ yandexru : "Яндекс" ,
105+ baidu : "Baidu" ,
106+ tineye : "TinEye" ,
107+ saucenao : "SauceNAO" ,
108+ iqdb : "IQDB" ,
109+ other : chrome . i18n . getMessage ( "customSearchProviderLabel" )
110+ } ;
111+ chrome . storage . sync . get ( null , checkStoredSettings ) ;
112+
81113/* On click, fetch stored settings and reverse search. */
82114chrome . contextMenus . onClicked . addListener ( ( info , tab ) => {
83115 chrome . storage . sync . get ( null , reverseSearch . bind ( null , info ) ) ;
0 commit comments