Bonjour,
J'essaye de créer ma première extension Google Chrome. Son objectif est de récupérer la liste des chanson de mes playlists deezer.
Voici mon manifest :
J'ai donc un fichier background qui est appeler au chargement de l'extension et qui ajoute des listeners sur les tabs.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 { "name": "Deezer Playlist Exporter", "version": "1.0", "description": "Export your deezer playlists", "background_page": "background.html", // The page containig js to show/hide the page_action, and get the playlists structure from the content_script "content_scripts": [ // Parse the tab document and create playlist structure { "matches": ["http://www.deezer.com/*"], "js": ["deezer_content_script.js"] } ], "permissions" : [ "tabs" ], "page_action": { "default_icon": "icon.png", // optional "default_name": "Export the deezer playlist", // optional; shown in tooltip "default_popup": "playlist.html" // The popup shown when the user click ont the icon. Display the playlist structure. } }
La fonction updatePlaylist(...) permet de lancer un évenement vers deeezer_content_script.js pour récupérer la liste des chansons. Cette évènement est lancé depuis chrome.tabs.onUpdated.addListener ligne 84 et je m'assure que la page est chargée grace au changeInfo.status == "complete".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74 <script> var playlistsTab = new Array(); // One play list by tabId var selectedTabId = null; var selectedPlaylist = null; var playlistsTitle = new Array(); var selected function updatePlaylist(tabId) { chrome.tabs.sendRequest(tabId, {}, function(playlist) { playlistsTab[tabId] = playlist; if (!playlist) { chrome.pageAction.hide(tabId); } else { chrome.pageAction.show(tabId); if (selectedId == tabId) { updateSelected(tabId); } } }); } function updateSelected(tabId) { selectedPlaylist = playlistsTab[tabId]; if (selectedAddress) chrome.pageAction.setTitle({tabId:tabId, title:selectedPlaylist}); } // Called when the url of a tab changes. function checkForValidUrl(tab) { var ind = tab.url.indexOf('http://www.deezer.com/'); var show = false; if (ind == 0) { show = true; } return show; } function updatePlaylist(tab){ var isValidUrl = checkForValidUrl(tab); chrome.pageAction.hide(tab.id); if(isValidUrl){ chrome.tabs.sendRequest(tab.id, {}, function(playlist) { playlistsTab[tab.id] = playlist; if(playlist) { chrome.pageAction.show(tab.id); if (selectedId == tabId) { updateSelected(tab.id); } } }); } } // Listen for any changes to the URL of any tab. chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab){ if (changeInfo.status == "complete") { // alert("status => "+changeInfo.status); updatePlaylist(tab) } }); chrome.tabs.onSelectionChanged.addListener(function(tabId, info) { selectedId = tabId; updateSelected(tabId); }); // Ensure the current selected tab is set up. chrome.tabs.getSelected(null, function(tab) { updatePlaylist(tab); }); </script>
Le fichier deeezer_content_script.js est le seul capable de lire le contenu de la page grace au DOM.
Ca fonctionne cependant, l'alert ligne 136 à toujours une page de ratard. Si j'ouvre une playliste, l'alert me donnera le nombre de chansons de la liste précédente ! Or je récupère ce nombre en lisant document. C'est comme si le test que je faisais pour m'assurer que la page est bien terminée de chargé dans le background, ne servait à rien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 // The background page is asking us to find an address on the page. if (window == top) { chrome.extension.onRequest.addListener(function(req, sender, sendResponse) { sendResponse(findPlaylist()); }); } var getLoadedPlaylistTitle = function(){ var title = document.getElementById('naboo_playlist_title'); if(title){ title = title.innerHTML; } alert('title : '+title); return title; } // Search the playlist and return an array of playlist structure. // Return null if none is found. var findPlaylist = function() { var title = getLoadedPlaylistTitle(); var dlElements = document.getElementsByTagName("dl"); var htmlTracks = new Array(); var j=0; for(var i=0; i<dlElements.length; i++){ if(dlElements[i].id.indexOf('naboo_datagrid_track') == 0){ htmlTracks[j] = dlElements[i]; j++; } } alert('Nb tracks : '+htmlTracks.length); return "The play list 22!"; }
Quelqu'un verrait une erreur ?
Merci
Partager