7

Sto cercando una funzione all'interno di una pagina web per attivare un'estensione di Chrome.Chiamare la funzione di sfondo dell'estensione di Chrome da un sito

Immaginate che http://www.example.com/test.html contiene:

<script> 
hello(); 
</script> 

E la mia pagina di sfondo contiene la definizione della funzione hello:

function hello() { 
    alert("test"); 
} 

Come posso fare in modo che di sfondo della pagina della estensione Chrome hello viene chiamato quando test.html chiamate hello();?

+0

No, ca non per ovvi motivi di sicurezza. L'estensione dovrebbe esporre la sua API di proposito – Bergi

risposta

1

No, con il codice di cui sopra a causa di background page(s) architecture

Sì con content scripts

Dimostrazione utilizzando Content script

manifest.json

Registrazione di contenuti script myscripts. js

{ 
"name": "NFC", 
"description": "NFC Liken", 
"version": "0.1", 
"manifest_version": 2, 
"permissions": ["tabs", "http://*/", "https://*/"], 
"content_scripts": { 
    "matches": "http://www.example.com/*", 
    "js": [ "myscript.js"] 
    }, 
"browser_action": { 
"default_icon": "sync-icon.png", 
"default_title": "I Like I Tag" 
} 
} 

Fatemi sapere se avete bisogno di ulteriori informazioni.

+0

Grazie per la risposta. Ma no, l'accordo ... Posso anche richiamare queste funzioni all'interno di myscript.js function clearhist() { var millisecondsPerWeek = 1000 * 60 * 60 * 24 * 7; var oneWeekAgo = (new Date()) getTime() - millisecondsPerWeek.; chrome.browsingData.remove ({ "poiché": oneWeekAgo }, { "AppCache": true, "cache": true, "cookies": true, "Downloads": true, "file system" : true, "formdata": true, "storia": true, "IndexedDB": true, "localStorage": true, "pluginData": veri e propri, "parole d'ordine": true, "WebSQL": true }, callback); } –

+0

@WoutervanReeven: No, non è possibile inserire questo codice direttamente nel 'myscript.js', ma è possibile raggiungere questo obiettivo facendo chiamata indiretta al codice posizionando questo' pagina background' e attraverso la comunicazione dei messaggi. fare riferimento [QUESTO] (http://stackoverflow.com/questions/13637715/not-receiving-any-data-from-webpage-to-content-js-of-chrome-extension/13638508#13638508) fatemi sapere se bisogno di maggiori informazioni – Sudarshan

+0

Così ho bisogno di chiamare la funzione javascript in caratteri sullo sfondo js. Nel html della pagina http://www.example.com/test.html nel fare qualcosa per chiamare lo script all'interno dell'estensione chrome. Sfondo html MyScript.js ciao(); –

9

Prima che una pagina web è in grado di chiamare la funzione di una pagina di sfondo, i seguenti problemi da risolvere:

  1. in grado di utilizzare hello(); da una pagina web. Questo è fatto da injecting uno script che definisce hello utilizzando gli script di contenuto. La funzione iniettata comunica con lo script del contenuto utilizzando un evento personalizzato o postMessage.
  2. Lo script di contenuto deve comunicare con lo sfondo. Questo è implementato attraverso chrome.runtime.sendMessage.
    Se la pagina web ha bisogno di ricevere una risposta così:
  3. inviare una risposta dalla pagina di sfondo (sendMessage/onMessage, vedi sotto).
  4. Nello script di contenuto, creare un evento personalizzato o utilizzare postMessage per inviare un messaggio alla pagina Web.
  5. Nella pagina Web, gestire questo messaggio.

Tutti questi metodi sono asincroni e devono essere implementati tramite le funzioni di callback.

Questi passaggi devono essere progettati con attenzione. Ecco una implementazione generica che implementa tutti i passaggi precedenti. Quello che dovete sapere circa l'attuazione:

  • Nel codice-to-be-iniettato, utilizzare il metodo sendMessage ogni volta che ha bisogno di essere in contatto con la trascrizione dei contenuti.
    utilizzo: sendMessage(<mixed message> [, <function callback>])

contentscript.js

// Random unique name, to be used to minimize conflicts: 
var EVENT_FROM_PAGE = '__rw_chrome_ext_' + new Date().getTime(); 
var EVENT_REPLY = '__rw_chrome_ext_reply_' + new Date().getTime(); 

var s = document.createElement('script'); 
s.textContent = '(' + function(send_event_name, reply_event_name) { 
    // NOTE: This function is serialized and runs in the page's context 
    // Begin of the page's functionality 
    window.hello = function(string) { 
     sendMessage({ 
      type: 'sayhello', 
      data: string 
     }, function(response) { 
      alert('Background said: ' + response); 
     }); 
    }; 

    // End of your logic, begin of messaging implementation: 
    function sendMessage(message, callback) { 
     var transporter = document.createElement('dummy'); 
     // Handles reply: 
     transporter.addEventListener(reply_event_name, function(event) { 
      var result = this.getAttribute('result'); 
      if (this.parentNode) this.parentNode.removeChild(this); 
      // After having cleaned up, send callback if needed: 
      if (typeof callback == 'function') { 
       result = JSON.parse(result); 
       callback(result); 
      } 
     }); 
     // Functionality to notify content script 
     var event = document.createEvent('Events'); 
     event.initEvent(send_event_name, true, false); 
     transporter.setAttribute('data', JSON.stringify(message)); 
     (document.body||document.documentElement).appendChild(transporter); 
     transporter.dispatchEvent(event); 
    } 
} + ')(' + JSON.stringify(/*string*/EVENT_FROM_PAGE) + ', ' + 
      JSON.stringify(/*string*/EVENT_REPLY) + ');'; 
document.documentElement.appendChild(s); 
s.parentNode.removeChild(s); 


// Handle messages from/to page: 
document.addEventListener(EVENT_FROM_PAGE, function(e) { 
    var transporter = e.target; 
    if (transporter) { 
     var request = JSON.parse(transporter.getAttribute('data')); 
     // Example of handling: Send message to background and await reply 
     chrome.runtime.sendMessage({ 
      type: 'page', 
      request: request 
     }, function(data) { 
      // Received message from background, pass to page 
      var event = document.createEvent('Events'); 
      event.initEvent(EVENT_REPLY, false, false); 
      transporter.setAttribute('result', JSON.stringify(data)); 
      transporter.dispatchEvent(event); 
     }); 
    } 
}); 

background.js

estensione
chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) { 
    if (message && message.type == 'page') { 
     var page_message = message.message; 
     // Simple example: Get data from extension's local storage 
     var result = localStorage.getItem('whatever'); 
     // Reply result to content script 
     sendResponse(result); 
    } 
}); 

Un Chrome non è completa senza un file manifesto, quindi ecco il file manifest.json che ho usato per testare la risposta:

{ 
    "name": "Page to background and back again", 
    "version": "1", 
    "manifest_version": 2, 
    "background": { 
     "scripts": ["background.js"] 
    }, 
    "content_scripts": [{ 
     "matches": ["http://jsfiddle.net/jRaPj/show/*"], 
     "js": ["contentscript.js"], 
     "all_frames": true, 
     "run_at": "document_start" 
    }] 
} 

Questa estensione è stato testato a http://jsfiddle.net/jRaPj/show/ (contenente hello(); come si vede nella questione), e mostra una finestra di dialogo che dice "Background detto: null".
Aprire lo sfondo della pagina, utilizzare localStorage.setItem('whatever', 'Hello!'); vedere che il messaggio viene modificato in modo corretto.

+0

@Xan 'chrome.extension.sendMessage' è un alias per' chrome.runtime.sendMessage'. Sei forse confuso con 'chrome.extension.sendRequest'? –

+0

Non sono confuso; ma la funzione viene ritirata completamente (non menzionata nei documenti) e tuttavia continua a comparire nel nuovo codice a causa del vecchio codice di esempio. Vedi [questo problema] (https://code.google.com/p/chromium/issues/detail?id=495052) per contrassegnarlo come deprecato. – Xan

0

C'è una soluzione incorporata per Send messages from web pages all'estensione

mainfest.json

"externally_connectable": { 
    "matches": ["*://*.example.com/*"] 
} 

pagina Web:

// The ID of the extension we want to talk to. 
var editorExtensionId = "abcdefghijklmnoabcdefhijklmnoabc"; 

// Make a simple request: 
chrome.runtime.sendMessage(editorExtensionId, {openUrlInEditor: url}, 
    function(response) { 
    if (!response.success) 
     handleError(url); 
    }); 

sfondo copione di estensione:

chrome.runtime.onMessageExternal.addListener(
    function(request, sender, sendResponse) { 
    if (sender.url == blacklistedWebsite) 
     return; // don't allow this web page access 
    if (request.openUrlInEditor) 
     openUrl(request.openUrlInEditor); 
    });