1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file.
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvar port = null;
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvar getKeys = function(obj){
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch   var keys = [];
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch   for(var key in obj){
107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      keys.push(key);
117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   }
124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)   return keys;
137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochfunction appendMessage(text) {
177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  document.getElementById('response').innerHTML += "<p>" + text + "</p>";
187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochfunction updateUiState() {
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (port) {
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    document.getElementById('connect-button').style.display = 'none';
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    document.getElementById('input-text').style.display = 'block';
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    document.getElementById('send-message-button').style.display = 'block';
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } else {
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    document.getElementById('connect-button').style.display = 'block';
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    document.getElementById('input-text').style.display = 'none';
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    document.getElementById('send-message-button').style.display = 'none';
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochfunction sendNativeMessage() {
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  message = {"text": document.getElementById('input-text').value};
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  port.postMessage(message);
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  appendMessage("Sent message: <b>" + JSON.stringify(message) + "</b>");
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochfunction onNativeMessage(message) {
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  appendMessage("Received message: <b>" + JSON.stringify(message) + "</b>");
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)function onDisconnected() {
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  appendMessage("Failed to connect: " + chrome.runtime.lastError.message);
447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  port = null;
457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  updateUiState();
467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochfunction connect() {
497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  var hostName = "com.google.chrome.example.echo";
507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  appendMessage("Connecting to native messaging host <b>" + hostName + "</b>")
517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  port = chrome.runtime.connectNative(hostName);
527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  port.onMessage.addListener(onNativeMessage);
537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  port.onDisconnect.addListener(onDisconnected);
547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  updateUiState();
557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochdocument.addEventListener('DOMContentLoaded', function () {
587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  document.getElementById('connect-button').addEventListener(
597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      'click', connect);
607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  document.getElementById('send-message-button').addEventListener(
617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      'click', sendNativeMessage);
627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  updateUiState();
637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch});
647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch