[Mono-dev] Bug in System.Windows.Forms.WebBrowser

Quandary quandary82 at hailmail.net
Sat Apr 9 13:59:26 EDT 2011


Hi,

I was trying to work around the problem that there is no SQL Syntax
highlighter that works for mono on Linux with WinForms.

As a workaround, I put the SQL editor in a WebBrowser window, setting
the initial page on Form_Load and then calling

            object objReturnValue =
this.wbSQLhighlighter.Document.InvokeScript("getSqlStatement");

to invoke a JavaScript function that returns me the text in the HTML
control.
It works perfectly on Windows...
The HTML SQL editor works perfectly in FireFox, IE and Google
Chrome/WebKit, also on Linux.

But the problem is:
object objReturnValue =
this.wbSQLhighlighter.Document.InvokeScript("getSqlStatement");
returns ">" on the first run, and crashes when run for a second time...
It seems like InvokeScript is buggy.
It's not the Regex, I tested that by removing it, including the encoding
change.

And another problem:
I tried doing that with webkit-sharp in a GTK project.
The problem there is that while you can invoke a void return type
JavaScript function - which works fine - , there's no way to get a
JavaScript function return value, such as a string, in webkit-sharp...


Used mono-version:
mono --version
Mono JIT compiler version 2.10.1 (tarball Sun Mar  6 21:19:00 CET 2011)
Copyright (C) 2002-2011 Novell, Inc and Contributors. www.mono-project.com
    TLS:           __thread
    SIGSEGV:       altstack
    Notifications: epoll
    Architecture:  x86
    Disabled:      none
    Misc:          softdebug
    LLVM:          supported, not enabled.
    GC:            Included Boehm (with typed GC and Parallel Mark)
root at IS1300-1:~#

uname -a
Linux IS1300-1 2.6.35-28-generic #49-Ubuntu SMP Tue Mar 1 14:40:58 UTC
2011 i686 GNU/Linux
root at IS1300-1:~#


Used code:
------------------------------------------------------------------------------------------       

        public string Strip(string text)
        {
            if (string.IsNullOrEmpty(text))
                return string.Empty;

            // Grrrrr
            text = System.Text.RegularExpressions.Regex.Replace(text,
@"currentText=""(\s+)?<(\s+)?""", string.Empty);
            text = System.Text.RegularExpressions.Regex.Replace(text,
@"currentText=""(\s+)?>(\s+)?""", string.Empty);
            // Ungrrrr

            text = System.Text.RegularExpressions.Regex.Replace(text,
@"<(.|\n)*?>", string.Empty);
            return text;
        } // End Function Strip
       
       
        public string GetSQLstatement()
        {
            object objReturnValue =
this.wbSQLhighlighter.Document.InvokeScript("getSqlStatement");

            string broken = objReturnValue.ToString();
            byte[] encoded =
Encoding.GetEncoding(System.Text.Encoding.Default.CodePage).GetBytes(broken);
            string corrected = Encoding.UTF8.GetString(encoded);

            corrected = Strip(corrected);
            corrected = System.Web.HttpUtility.HtmlDecode(corrected);

            return corrected;
        } // End Function GetSQLstatement
       
       
        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show(GetSQLstatement());
        } // End Sub button1_Click
       
       
------------------------------------------------------------------------------------------

With
System.Windows.Forms.WebBrowser wbSQLhighlighter;

and on Form_Load:
if(Environment.OSVersion.Platform == PlatformID.Unix)
               
this.wbSQLhighlighter.Navigate(@"/var/www/codemirror/CodeMirror-1.0/contrib/sql/highlight.htm");

------------------------



where highlight.htm is
********************

<html xmlns="http://www.w3.org/1999/xhtml" style="height: 100%;">
  <head>
    <script src="../../js/codemirror.js" type="text/javascript"></script>
    <title>CodeMirror: SQL demonstration</title>
    <link rel="stylesheet" type="text/css" href="../../css/docs.css"/>
<script language="javascript" >



function gimme(strMessage)
{
    return strMessage + strMessage;
}


function say(strMessage)
{
    alert(strMessage);
}


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


function getSqlStatement()
{
    return getSQLtext();
}


function getSQLtext()
{
    var elements = document.getElementsByTagName("iframe");
    var objiFrame = elements[0];
   
   
   
    var str = objiFrame.contentWindow.document.body.innerHTML;
    if(str == null)
        return "NULL";
   
    //return "SELECT * FROM T_Benutzeräöü";
    // str = str.replace(/<.*?>/ig, "");
    /*
    // IE sucks, Chrome doesn't. Moving this to C#, problem solved ...
    str = str.replace(/<span.*?>/ig, "");
    str = str.replace(/<\/span.*?>/ig, "");
    str = str.replace(/<br.*?>/ig, "");
    */
    return str;
}


</script>


  </head>
  <body style="margin: 0px; padding: 0px; width: 100%; height: 100%;
overflow: hidden;">


<textarea id="code" cols="120" rows="50" style="margin: 0px; padding: 0px;">
SELECT table_name, view_definition FROM INFORMATION_SCHEMA.VIEWS
</textarea>


<script type="text/javascript">
  var editor = CodeMirror.fromTextArea('code', {
    height: "450px",
    parserfile: "../contrib/sql/js/parsesql.js",
    stylesheet: "css/sqlcolors.css",
    path: "../../js/",
    textWrapping: false
  });
</script>
    <input type="button" onclick="alert(getSQLtext());" value="Get
command text" />
    <!--
   
    -->
  </body>
</html>

********************



More information about the Mono-devel-list mailing list