~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to ivle/webapp/console/media/console.js

  • Committer: David Coles
  • Date: 2010-08-30 03:26:13 UTC
  • Revision ID: coles.david@gmail.com-20100830032613-d14vng0jkelniu3l
python-console: Fix globals broken with new JSON library.

simplejson always returns unicode strings. cJSON would return ordinary strings 
if possible. cPickle.loads() only accepts strings. At present we use pickle 
version 0 so they should all works as ASCII strings. Higher versions of pickle 
are not plain ASCII and are likely to break this and so this should be fixed 
at some point.

Also replaced unconditional exception with one that catches Pickle errors. Not 
sure the best way to report failures of these functions.

Show diffs side-by-side

added added

removed removed

Lines of Context:
36
36
 
37
37
interrupted = false;
38
38
 
 
39
 
 
40
function get_console_start_directory()
 
41
{
 
42
    if((typeof(current_path) != 'undefined') && current_file)
 
43
    {
 
44
        // We have a current_path - give a suggestion to the server
 
45
        var path;
 
46
        if (current_file.isdir)
 
47
        {
 
48
            // Browser
 
49
            return path_join("/home", current_path);
 
50
        }
 
51
        else
 
52
        {
 
53
            // Editor - need to chop off filename
 
54
            var tmp_path = current_path.split('/');
 
55
            tmp_path.pop();
 
56
            return path_join("/home", tmp_path.join('/'));
 
57
        }
 
58
    }
 
59
    else
 
60
    {
 
61
        // No current_path - let the server decide
 
62
        return '';
 
63
    }
 
64
}
 
65
 
39
66
/* Starts the console server, if it isn't already.
40
67
 * This can be called any number of times - it only starts the one server.
41
68
 * Note that this is asynchronous. It will return after signalling to start
58
85
    var callback1 = function(xhr)
59
86
        {
60
87
            var json_text = xhr.responseText;
61
 
            server_key = JSON.parse(json_text).key;
62
 
            server_started = true;
63
 
            if (callback != null)
64
 
                callback();
65
 
        }
66
 
 
67
 
    //var current_path;
68
 
    if((typeof(current_path) != 'undefined') && current_file)
69
 
    {
70
 
        // We have a current_path - give a suggestion to the server
71
 
        var path;
72
 
        if (current_file.isdir)
73
 
        {
74
 
            // Browser
75
 
            path = path_join("/home", current_path);
76
 
        }
77
 
        else
78
 
        {
79
 
            // Editor - need to chop off filename
80
 
            var tmp_path = current_path.split('/');
81
 
            tmp_path.pop();
82
 
            path = path_join("/home", tmp_path.join('/'));
83
 
        }
84
 
        ajax_call(callback1, "console", "service", {"ivle.op": "start", "cwd": path}, "POST");
85
 
    }
86
 
    else
87
 
    {
88
 
        // No current_path - let the server decide
89
 
        ajax_call(callback1, "console", "service", {"ivle.op": "start"}, "POST");
90
 
    }
 
88
            try
 
89
            {
 
90
                server_key = JSON.parse(json_text).key;
 
91
                server_started = true;
 
92
                var args = {
 
93
                    "ivle.op": "chat", "kind": "splash", "key": server_key
 
94
                };
 
95
                var callback2 = function(xhr)
 
96
                {
 
97
                    console_response(null, null, xhr.responseText);
 
98
                    if (callback != null)
 
99
                        callback();
 
100
                };
 
101
                ajax_call(callback2, "console", "service", args, "POST");
 
102
            }
 
103
            catch (e)
 
104
            {
 
105
                alert("An error occured when starting the IVLE console. " +
 
106
                    "Please refresh the page and try again.\n" +
 
107
                    "Details have been logged for further examination.")
 
108
            }
 
109
        }
 
110
 
 
111
    $("#console_output").append(
 
112
        '<span class="console_message">IVLE console starting up...</span>\n');
 
113
    console_maximize(true);
 
114
    ajax_call(
 
115
        callback1, "console", "service",
 
116
        {"ivle.op": "start", "cwd": get_console_start_directory()}, 
 
117
        "POST");
 
118
}
 
119
 
 
120
/** Start up the console backend before the user has entered text.
 
121
 * This will disable the text input, start a backend, and enable the input
 
122
 * again.
 
123
 */
 
124
function start_server_early()
 
125
{
 
126
    var inputbox = document.getElementById("console_inputText");
 
127
    inputbox.setAttribute("disabled", "disabled");
 
128
    var callback = function(xhr)
 
129
    {
 
130
        inputbox.removeAttribute("disabled")
 
131
    }
 
132
    start_server(callback);
91
133
}
92
134
 
93
135
/** Initialises the console. All apps which import console are required to
117
159
function console_minimize()
118
160
{
119
161
    if (!windowpane_mode) return;
120
 
    console_body.setAttribute("class", "windowpane minimal");
 
162
    console_body.setAttribute("class", "console_body windowpane minimal");
121
163
    console_filler.setAttribute("class", "windowpane minimal");
122
164
}
123
165
 
124
166
/** Show the main console panel, so it enlarges out to its full size.
125
167
 */
126
 
function console_maximize()
 
168
function console_maximize(do_not_start)
127
169
{
128
170
    if (!windowpane_mode) return;
129
 
    console_body.setAttribute("class", "windowpane maximal");
 
171
    if (!do_not_start && !server_started) start_server_early();
 
172
    console_body.setAttribute("class", "console_body windowpane maximal");
130
173
    console_filler.setAttribute("class", "windowpane maximal");
131
174
}
132
175
 
252
295
{
253
296
    interrupted = false;
254
297
 
 
298
    // Open up the console so we can see the output
 
299
    console_maximize();
 
300
 
255
301
    if (typeof(inputbox) == "string")
256
302
    {
257
303
        var inputline = inputbox + "\n";
278
324
        span.setAttribute("class", "inputMsg");
279
325
        span.appendChild(document.createTextNode(inputline));
280
326
        output.appendChild(span);
 
327
        divScroll.activeScroll();
281
328
    }
282
 
    var args = {"ivle.op": "chat", "kind": which, "key": server_key, "text":inputline};
 
329
    var args = {
 
330
        "ivle.op": "chat", "kind": which, "key": server_key,
 
331
        "text": inputline, "cwd": get_console_start_directory()
 
332
        };
283
333
    var callback = function(xhr)
284
334
        {
285
335
            console_response(inputbox, inputline, xhr.responseText);
306
356
        {
307
357
            output.appendChild(document.createTextNode(res.okay + "\n"));
308
358
            output.appendChild(span);
 
359
            divScroll.activeScroll();
309
360
        }
310
361
        // set the prompt to >>>
311
362
        set_prompt(">>>");
328
379
 
329
380
        // Print a reason to explain why we'd do such a horrible thing
330
381
        // (console timeout, server error etc.)
331
 
        print_error("Console Restart: " + res.restart);
 
382
        print_error(
 
383
            "IVLE console restarted: " + res.restart, "console_message");
332
384
        
333
385
        // set the prompt to >>>
334
386
        set_prompt(">>>");
343
395
        if (res.output.length > 0)
344
396
        {
345
397
            output.appendChild(document.createTextNode(res.output));
 
398
            divScroll.activeScroll();
346
399
        }
347
400
        var callback = function(xhr)
348
401
            {
356
409
        {
357
410
            var kind = "chat";
358
411
        }
359
 
        var args = {"ivle.op": "chat", "kind": kind, "key": server_key, "text":''};
 
412
        var args = {
 
413
            "ivle.op": "chat", "kind": kind, "key": server_key,
 
414
            "text": '', "cwd": get_console_start_directory()
 
415
            };
360
416
        ajax_call(callback, "console", "service", args, "POST");
361
417
 
362
418
        // Open up the console so we can see the output
363
 
        // FIXME: do we need to maximize here?
364
419
        console_maximize();
365
420
 
366
 
        /* Auto-scrolling */
367
 
        divScroll.activeScroll();
368
 
 
369
421
        // Return early, so we don't re-enable the input box.
370
422
        return;
371
423
    }
 
424
    else if (res.hasOwnProperty('input'))
 
425
    {
 
426
        set_prompt("+++");
 
427
    }
372
428
    else
373
429
    {
374
 
        // assert res.hasOwnProperty('input')
375
 
        set_prompt("...");
 
430
        alert("An internal error occurred in the python console.");
 
431
        return;
376
432
    }
377
433
 
378
434
    if (inputbox != null)
382
438
        interrupted = false;
383
439
    }
384
440
 
385
 
    /* Open up the console so we can see the output */
386
 
    console_maximize();
387
441
    /* Auto-scrolling */
388
442
    divScroll.activeScroll();
389
443
 
434
488
            hist.submit(inp.value);
435
489
            inp.value = hist.curr();
436
490
        }
 
491
 
 
492
        /* Disable the text box. This will be redone by
 
493
         * console_enter_line, but we do it here too in case start_server
 
494
         * takes a while.
 
495
         */
 
496
        inp.setAttribute("disabled", "disabled");
437
497
        /* Start the server if it hasn't already been started */
438
498
        start_server(callback);
439
499
        break;
467
527
    }
468
528
    else
469
529
    {
470
 
        xhr = ajax_call(null, "console", "service", {"ivle.op": "chat", "kind": "terminate", "key": server_key}, "POST");
 
530
        xhr = ajax_call(null, "console", "service", {"ivle.op": "chat", "kind": "terminate", "key": server_key, "cwd": get_console_start_directory()}, "POST");
471
531
        console_response(null, null, xhr.responseText);
472
532
    }
473
533
}
474
534
 
475
535
/** Prints an error line in the console **/
476
 
function print_error(error)
477
 
 
536
function print_error(error, cls)
 
537
{
 
538
    if (!cls)
 
539
        cls = "errorMsg";
 
540
 
478
541
    var output = document.getElementById("console_output");
479
542
  
480
543
    // Create text block
481
544
    var span = document.createElement("span");
482
 
    span.setAttribute("class", "errorMsg");
 
545
    span.setAttribute("class", cls);
483
546
    span.appendChild(document.createTextNode(error + "\n"));
484
547
    output.appendChild(span);
485
548