[SOLVED] How do you add extensions to CEFSharp in VB.NET?

The question is pretty straight forward.
How do you add extensions to CEFSharp?

Like 0 Dislike

Hiya [notify]ShoutOut! Technology[/notify],

Similarly to your previous question (https://techviewforum.com/topic/43/solv … -cefsharp/), your best option would be to use the "ExecuteScriptAsync" method in order to interact with the loaded web-page; deeper integration (such as allowing extensions to interact with your browser's UI) would have to be done yourself in whichever way you find suitable. You can find a bunch of scripts (generally called "user-scripts") to execute, here: https://tampermonkey.net/scripts.php

Hope this helps! 1f609

Like 0 Dislike

How do you specify what script for the browser to execute?

admin wrote:

Hiya @ShoutOut! Technology,

Similarly to your previous question (https://techviewforum.com/topic/43/solv … -cefsharp/), your best option would be to use the "ExecuteScriptAsync" method in order to interact with the loaded web-page; deeper integration (such as allowing extensions to interact with your browser's UI) would have to be done yourself in whichever way you find suitable. You can find a bunch of scripts (generally called "user-scripts") to execute, here: https://tampermonkey.net/scripts.php

Hope this helps! 1f609

Like 0 Dislike

You'd call the "ExecuteScriptAsync" method like this:

Browser.ExecuteScriptAsync("alert('Hello world')")

In this example, the browser has executed the following script:

alert('Hello world')

The JavaScript code should show a message box with the value "Hello world".


If you want to retrieve a returned value with the "ExecuteScriptAsync" method, you'd do something like this:

Dim script = "var returnValue = function(){ var value; value=10-2; return value; }"
Dim task As Threading.Tasks.Task = Browser.EvaluateScriptAsync(script)
Dim taskResult As String

task.ContinueWith( Sub(t)
                      If t.IsFaulted = False Then
                         Dim response = t.Result
                         If response.Success And response.Result IsNot Nothing Then
                             taskResult = response.Result
                         End If
                     End If
                  End Sub)

MsgBox(taskResult)

In this example, the browser has executed the following script:

var returnValue = function() { 
   var value; 
   value = 10 - 2; 
   return value; 
}

The JavaScript code should return a value of 8, and then the VB.NET code should display the value of 8 in a message box.

Like 0 Dislike

But can you make it execute a certain javascript file?

admin wrote:

You'd call the "ExecuteScriptAsync" method like this:

Browser.ExecuteScriptAsync("alert('Hello world')")

In this example, the browser has executed the following script:

alert('Hello world')

The JavaScript code should show a message box with the value "Hello world".


If you want to retrieve a returned value with the "ExecuteScriptAsync" method, you'd do something like this:

Dim script = "var returnValue = function(){ var value; value=10-2; return value; }"
Dim task As Threading.Tasks.Task = Browser.EvaluateScriptAsync(script)
Dim taskResult As String

task.ContinueWith( Sub(t)
                      If t.IsFaulted = False Then
                         Dim response = t.Result
                         If response.Success And response.Result IsNot Nothing Then
                             taskResult = response.Result
                         End If
                     End If
                  End Sub)

MsgBox(taskResult)

In this example, the browser has executed the following script:

var returnValue = function() { 
   var value; 
   value = 10 - 2; 
   return value; 
}

The JavaScript code should return a value of 8, and then the VB.NET code should display the value of 8 in a message box.

Like 0 Dislike

You'd have to read the file first, as the "ExecuteScriptAsync" method doesn't accept file path's, like this:

Dim pathToScript As String = "C:\path\to\script.js"
Dim script As String
Dim reader As StreamReader
Try
   reader = New StreamReader(pathToScript)
   script = reader.ReadToEnd()
   reader.Close()
Catch Ex As Exception
   script = ""
End Try

Then from the example you'd use the value of the "script" variable with the "ExecuteScriptAsync" method, as shown previously.

Like 0 Dislike

Is there a built in or third party javascript reader i can use? (To make it easier to find the title, description, and other stuff)

admin wrote:

You'd have to read the file first, as the "ExecuteScriptAsync" method doesn't accept file path's, like this:

Dim pathToScript As String = "C:\path\to\script.js"
Dim script As String
Dim reader As StreamReader
Try
   reader = New StreamReader(pathToScript)
   script = reader.ReadToEnd()
   reader.Close()
Catch Ex As Exception
   script = ""
End Try

Then from the example you'd use the value of the "script" variable with the "ExecuteScriptAsync" method, as shown previously.

Like 0 Dislike

Well, by looking at one of the user-scripts, I'll use this one as an example:
https://openuserjs.org/scripts/MAX30/To … Everywhere
Which has the following JavaScript code:

// ==UserScript==
// @name TopAndDownButtonsEverywhere
// @description Top and Down buttons everywhere (no Jquery) 
// @version 1.6
// @author Max Max
// @license MIT
// @include *
// @icon http://pics.smotri.com/cskins/blue/smiles/bt.gif
// @run-at document-end
// @grant none
// ==/UserScript==

// [1] skip all iframe 
if (window.self!=window.top) {return}

// create element
function ce(n) { return document.createElement(n); } // end of function

// add style
function addStyle(css) {
    var head = document.head || document.getElementsByTagName('head')[0];
    if (head) {
        var style = ce("style");
        style.type = "text/css";
        style.appendChild(document.createTextNode(css));
        head.appendChild(style);
    } // end if
} // end of function

// global variables
var position, 
// figure out if this is moz || IE because they use documentElement
el = (navigator.userAgent.indexOf('Firefox') != -1 || navigator.userAgent.indexOf('MSIE') != -1) ? document.documentElement : document.body,
// timer
t1, t2,
// speed by
speed_by_click = 500, // edit this value
speed_by_over = 100,  // edit this value
// z-index
zIindex = 1001;       // edit this value

// move up
function move_up() { 
    position = document.documentElement.scrollTop || document.body.scrollTop;
    window.scrollTo(0, position-1);
    t1 = setTimeout(move_up, speed_by_over);
} // end of function

// move downn
function move_dn() { 
    position = document.documentElement.scrollTop || document.body.scrollTop;
    window.scrollTo(0, position+1);
    t2 = setTimeout(move_dn, speed_by_over);
} // end of function

// document height
function getDocumentHeight() {
	return (document.body.scrollHeight > document.body.offsetHeight)?document.body.scrollHeight:document.body.offsetHeight;
} // end of function

// document scroll
function get_scroll(a) {
    var d = document,
        b = d.body,
        e = d.documentElement,
        c = "client" + a,
        a = "scroll" + a;
    return /CSS/.test(d.compatMode)? (e[c]< e[a]) : (b[c]< b[a])
} // end of function

// calk
function scrollTo(element, to, duration) {
    var start = element.scrollTop,
        change = to - start,
        currentTime = 0,
        increment = 20,
        newDuration = (typeof(duration) === 'undefined') ? 500: duration;
		
    var animateScroll = function(){        
        currentTime += increment;
        var val = Math.easeInOutQuad(currentTime, start, change, newDuration);                        
        element.scrollTop = val; 
        if(currentTime < newDuration) { setTimeout(animateScroll, increment); }
    };
    animateScroll();
} // end of function

//t = current time
//b = start value
//c = change in value
//d = duration
Math.easeInOutQuad = function (t, b, c, d) {
    t /= d/2;
    if (t < 1) return c/2*t*t + b;
    t--;
    return -c/2 * (t*(t-2) - 1) + b;
};

// add css
function shareCSS(){ 
    // variables
    var s='', img_up, img_dn; 
	
	// img vs button
    img_up = 'data:img/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAUCAYAAACAl21KAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAB+SURBVDhPY1i1atV/amAGahgCMoNhaIGlS5cKAp19BoRBbLJcj2QILDJINwzoAmMgfoclIkBixkS5DI8hMJcRNgxoSBoOl6CnNZBhaVhdBjWE1MSJahjQkA4KEmYH2GUrV66cSYEhYB+AzKBtFiHkQqKiH6Ro1CDCQTWgYQQAs81DU0G/83sAAAAASUVORK5CYII=';
	img_dn = 'data:img/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAUCAYAAACAl21KAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAACPSURBVDhPY2DAAlatWvUfH8amB6vYqEGEg2pgw4iQ7cTKM6xcuXImsYpxqQOZAQ4woIIOCgzrQAl1oEFpZBiWhitFgwx7R4SBIDXYDYGZDFRgTMAwkCHGhBMRJMxwGUa8ITCbli5dKgg08AySN8+AxIhyCboiJMPIN4Qsm6miiYioxltawvSDYogohYTUAQC80UNTOht/YwAAAABJRU5ErkJggg==';
    // button id
    s+='#play_btn_up { position:fixed; right:0; bottom:53%;z-index:'+zIindex+'; height:36px; width:36px; cursor:pointer; background:url('+img_up+') no-repeat scroll 50% 50% rgba(0, 0, 0, 0.7); border-radius:5px 0 0 5px; margin-top:-24px; }'; 
    s+='#play_btn_dn { position:fixed; right:0; top:53%;   z-index:'+zIindex+'; height:36px; width:36px; cursor:pointer; background:url('+img_dn+') no-repeat scroll 50% 50% rgba(0, 0, 0, 0.7); border-radius:5px 0 0 5px; margin-top:-24px; }'; 
    // button class
    s+='.play_btn { -webkit-transition-duration:0.5s linear; -o-transition-duration:0.5s linear; -moz-transition-duration:0.5s linear; transition-duration:0.5s linear; opacity:0.65; }'; 
    s+='.play_btn:hover { opacity:1; }'; 
	// append
    addStyle(''+s);
} // end of function

// main
function create_btn_element() { 
    // get scroll
	var up, dn, 
	    scrolled,
	    h = get_scroll('Height');
    // exit
    if(!h) { return; } // end if
	
	// add css
	shareCSS(); 

	// if 
	if(el){ 
		// create DOM element
		up = ce('span');
		dn = ce('span');
		// set attribute
		up.setAttribute('id','play_btn_up');
		dn.setAttribute('id','play_btn_dn');
		// set class
		up.className = "play_btn";
		dn.className = "play_btn";
        // append element
		document.body.appendChild(up);
		document.body.appendChild(dn);
		
		// scroll
		scrolled = window.pageYOffset || document.documentElement.scrollTop;
		// if scroll 
		up.style.display = (scrolled > 0)  ? "" : "none";
		
		// add event over
		up.addEventListener('mouseover', move_up, false);
		dn.addEventListener('mouseover', move_dn, false);
		// add event out
		up.addEventListener('mouseout', function(){clearTimeout(t1);},false);
		dn.addEventListener('mouseout', function(){clearTimeout(t2);},false);
		// add event click
		up.addEventListener('click', function(){ scrollTo(el, 0, speed_by_click); }, false);
		dn.addEventListener('click', function(){ scrollTo(el, getDocumentHeight(), speed_by_click); }, false);
		
		// add event scroll
		window.onscroll = function() { 
		    var scrolled = window.pageYOffset || document.documentElement.scrollTop, diffHeight = document.body.scrollHeight - window.innerHeight;
			// if scroll up
			up.style.display = (scrolled > 0)  ? "" : "none";
			// if scroll dn
			dn.style.display = (diffHeight > scrolled)  ? "" : "none";
		}; // end of function
	} // end if
} // end of function

// run it
create_btn_element();

It seems that most information about the author, title, description and such are commented at the very beginning of the script. So assuming that all the user-scripts apply the same method to associate the author, title and description; you'd essentially just have to check for a comment at the beginning of the script; and then look for the comments starting with "// @name", "// @description", "// @author" and whichever other tags you'd want to collect.

So using the aforementioned script, looking for the "// @name" of the script would go something like this (just assume that the script is contained in a variable called "script"):

Dim searchStart As String = "// @name" 'First delimiting word
Dim searchEnd As String = "//" 'Second delimiting word
Dim indexStart As Integer = script.IndexOf(searchStart) 'Find the first occurrence of f1
Dim indexEnd As Integer = script.IndexOf(searchEnd) 'Find the first occurrence of f2

If indexStart > -1 AndAlso indexEnd > -1 Then '-1 means the word was not found.
   Dim scriptName As String = Strings.Mid(script, indexStart + searchStart.Length + 1, indexEnd - indexStart - searchStart.Length) 'Crop the text between
   MessageBox.Show(scriptName) 'Display the name of the script
Else
   MessageBox.Show("No name found for the following script!")
End If

Like 0 Dislike

I'm using cefsharp. In what event do you have to tell the browser to execute?
Titlechanged? Onload?

Like 0 Dislike

Its global, so...pretty much anywhere you want. The "OnLoad" event seems like it'd be a good place to put it if you want an extension to always run on start-up.

The methods fixed to events normally start with "e" by default, like:

e.Title

Like 0 Dislike