Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How Can I communicate with Chrome(Chrome Extension) using C#?

I want to create a bridge which can communicate between my C# application and extension.
Here is the explanation of what I actually want: I have created an extension which will get details of HTML element.
But starts every time I start Chrome. Instead of doing this, is there any way I can send a message to my chrome extension to get HTML element details and then send it back to C# application?

I am able to pass information to C# using 'XMLHttpRequest' but issue is, it got started when my page gets loaded.

Let me explain to you what I want:

  1. When I open my chrome, my extension will start automatically and also my background.cs(background page) will start. (Here I want some client-server kind of communication)

  2. Using my C# application I will send some data to the chrome extension (e.g. StartFetchingDocument)

  3. Once my extention gets this message (i.e. StartFetchingDocument), then my extension should inject contect-sctipt.js to the selected tab.

I know the rest of what I need to send that data back to C#, but here I got stuck only at this one stage - how to send data from C# to my extension (background page).

like image 921
Sanket Shah Avatar asked Dec 17 '12 08:12

Sanket Shah


People also ask

How do I communicate with Chrome extensions?

If you only need to send a single message to another part of your extension (and optionally get a response back), you should use the simplified runtime. sendMessage or tabs. sendMessage. This lets you send a one-time JSON-serializable message from a content script to extension, or vice versa, respectively.

Can Chrome extensions communicate with each other?

A Chrome extension will typically consist of various cohesive parts or components, each with a different set of responsibilities. In order for all these components to work together, they communicate via messaging.

What code do Chrome extensions use?

Chrome extensions are built with HTML, JavaScript, and CSS scripts and are essentially small websites uploaded to the Chrome store.

Can Chrome extension read my data?

Your browsing history: The app or extension can read and erase your browsing history. Your tabs and browsing activity: The app or extension can see the URLs and titles of websites you visit.


1 Answers

Hm...there's probably better ways, but an easy way might be opening an HttpListener in your c# app and communicate with it from the extension like this:

var listener = "http://localhost:60024/";

function getCommand(){

    var postData = { 
        "action": "getCommand" 
    };

    $.post( listener, postData, function(response){
        //Parse response and do whatever c# wants
    });
}

function send(data){

    var postData = {
        "action" : "send",
        "data": data
    };

    $.post(listener, postData);
}


setInterval(getCommand, 1000);

In the example i'm using jQuery.post, which can be added to the extension context, but you could use XMLHttpRequest if you like it better. And on the c# side:

using System;
using System.Net;


namespace HttpListenerTEst
{
    class Program
    {
        private static HttpListener _listener;

        static void Main(string[] args)
        {
            _listener = new HttpListener();
            _listener.Prefixes.Add("http://localhost:60024/");
            _listener.Start();
            _listener.BeginGetContext(new AsyncCallback(Program.ProcessRequest), null);

            Console.ReadLine();
        }

        static void ProcessRequest(IAsyncResult result)
        {
            HttpListenerContext context = _listener.EndGetContext(result);
            HttpListenerRequest request = context.Request;

            //Answer getCommand/get post data/do whatever

            _listener.BeginGetContext(new AsyncCallback(Program.ProcessRequest), null);
        }
    }
}

In the ProcessRequest function you can read post data or send something back.

Get post data:

        string postData;
        using (var reader = new StreamReader(request.InputStream, request.ContentEncoding))
        {
            postData = reader.ReadToEnd();
            //use your favourite json parser here
        }

and send back some stuff with:

        string responseString           = "This could be json to be parsed by the extension";

        HttpListenerResponse response   = context.Response;
        response.ContentType            = "text/html";

        byte[] buffer                   = System.Text.Encoding.UTF8.GetBytes(responseString);
        response.ContentLength64        = buffer.Length;
        Stream output                   = response.OutputStream;

        output.Write(buffer, 0, buffer.Length);
        output.Close();

Just some quick brainstorming, looking forward to better ideas :)

like image 150
cviejo Avatar answered Nov 15 '22 08:11

cviejo