5

Estoy usando Channel API en una extensión de Chrome.¿Por qué Google App Engine Channel API (jsapi) no se carga en una extensión de Chrome?

En Google App Engine Channel API Javascript Reference (Python) página dice que

Include the following in your html page before any JavaScript code that refers to it:

<script type="text/javascript" src="/_ah/channel/jsapi"></script> 

Por lo tanto, poner esto en la cabecera de mi archivo options.html:

<html> 
<head> 
    <title>Extension Options</title> 
    <script type="text/javascript" src="/_ah/channel/jsapi"></script> 
</head> 

pero Chrome lanza jsapiFailed to load resource error. ¿Qué estoy haciendo mal?

actualización

De acuerdo con la respuesta de Moishe He actualizado la llamada a jsapi así:

<head> 
    <title>Extension Options</title> 
    <!-- this does not work because it is local 
    <script type="text/javascript" src="/_ah/channel/jsapi"></script> 
    --> 
    <script type="text/javascript" src="https://talkgadget.google.com/talkgadget/channel.js"></script> 
</head> 

actualización

que añade onopen y otras propiedades. Ahora recibo la alerta onopen pero no recibo la alerta evt.data. ¿Qué estoy haciendo mal?

<html> 
<head> 
    <title>Extension Options</title> 
    <!-- this does not work because it is local url 
    <script type="text/javascript" src="/_ah/channel/jsapi"></script> 
    --> 
    <script type="text/javascript" src="https://talkgadget.google.com/talkgadget/channel.js"></script> 
</head> 

<body> 
<p>Enter your gmail address:</p> 

<textarea id="getEmail" style="margin-bottom: 4px; width: 250px; height: 20px"> 
</textarea><br /> 

<button id="save">Save</button> 
<!--<button id="save">Clear</button>--> 

<script> 
document.getElementById("getEmail").placeholder = "your gmail address" ; 

//save entered gmail address 
document.getElementById("save").addEventListener 
(
    "click", 
    function() 
    { 
     var userEmail = document.getElementById("getEmail").value; 
     var formData = new FormData(); 
     formData.append("extension_user", userEmail); 
     alert("after formData.append") 

     var channel; 
     var socket; 
     var handler = 
     { 
      onopen: function() { alert("onopen") }, 
      onerror: function() { alert("onerror") }, 
      onclose: function() { alert("onclose") }, 
      onmessage: 
      function (evt) 
      { 
       //evt.data will be what the server sends in channel.send_message 
       console.log("evt.data received from authhandler: " + evt.data); 
       alert("evt.data is: " + evt.data) 
      } 
     };  

     var xhr = new XMLHttpRequest(); 
     //changed to lowercase 
     xhr.onreadystatechange = function() 
     { 
      //alert("xhr.onReadyStateChange") 
      //error handling etc not included 
      if (xhr.readyState == 4 && xhr.status == 200) 
      { 
       token = xhr.responseText; 
       alert("token: " + token) 
       channel = new goog.appengine.Channel(token); 
       socket = channel.open(handler); 
      } 
     }; 
     xhr.open("POST", "http://ting-1.appspot.com/authsender", true); 
     xhr.send(formData); 
     console.log("formData sent to authsender: " + formData); 
    }, false 
) 



</script> 
</body> 
</html> 
+0

¿Esto está usando el dev_appserver o está en producción? ¿Puedes proporcionar detalles sobre la pestaña "Red" en las herramientas de desarrollo de Chrome? –

+0

Esto está en producción. Primero, no había nada en la pestaña "Red"; luego volví a cargar la página según las instrucciones y veo 2 elementos: options.html y jsapi: name: options.html; Método: GET; Estado: (desde el caché); Tipo: text/html; Tamaño: (desde el caché); Tiempo: 3ms y 'jsapi/_ah/channel; GET, (fallido); indefinido; 30B; 5ms' ¡Gracias! – Zeynel

+0

¿Le importaría decirme su aplicación? ¿Qué sucede si intenta navegar directamente a "http://your-app-id.appspot.com/_ah/channel/jsapi"? –

Respuesta

3

En una extensión de Chrome, tendrá que especificar directamente la ruta del Canal de Javascript (https://talkgadget.google.com/talkgadget/channel.js). La solicitud de/_ah/channel/jsapi no puede redireccionarse porque el archivo que intenta cargarlo es local.

+0

Lo siento, sobre el título debería haber mencionado "Extensión de Chrome". Ahora no obtengo el error original, pero obtengo otro y no estoy seguro de si está relacionado con mi código: 'Uncaught TypeError: propiedad 'onopen' del objeto [object Object] no es una función' en línea 77 de channel.js. ¿Esto está relacionado con un problema con mi 'función (evt)'? Gracias de nuevo. – Zeynel

+0

No sé si es relevante, pero la pestaña de red muestra OBTENER 200-OK para 'vincular 235.talkgadget.google.com/talkgadget/dch' – Zeynel

+1

Debe especificar una devolución de llamada abierta en su controlador. –