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 :
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.
		}
}
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
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>
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".

Le fichier deeezer_content_script.js est le seul capable de lire le contenu de la page grace au DOM.

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!";
}
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.

Quelqu'un verrait une erreur ?

Merci