browser_object_follow: do not give $opener for following non-element/window in new...
[conkeror.git] / modules / source-code.js
bloba94a073a7caea8130b28057d9087861d94e53c1a
1 /**
2  * (C) Copyright 2004-2007 Shawn Betts
3  * (C) Copyright 2007-2009 John J. Foerch
4  * (C) Copyright 2007-2008 Jeremy Maitin-Shepard
5  *
6  * Use, modification, and distribution are subject to the terms specified in the
7  * COPYING file.
8 **/
10 in_module(null);
12 require_later("external-editor.js");
14 var conkeror_source_code_path = null;
16 function source_code_reference (uri, line_number) {
17     this.uri = uri;
18     this.line_number = line_number;
20 source_code_reference.prototype = {
21     constructor: source_code_reference,
22     get module_name () {
23         if (this.uri.indexOf(module_uri_prefix) == 0)
24             return this.uri.substring(module_uri_prefix.length);
25         return null;
26     },
28     get file_name () {
29         var file_uri_prefix = "file://";
30         if (this.uri.indexOf(file_uri_prefix) == 0)
31             return this.uri.substring(file_uri_prefix.length);
32         return null;
33     },
35     get best_uri () {
36         if (conkeror_source_code_path != null) {
37             var module_name = this.module_name;
38             if (module_name != null)
39                 return "file://" + conkeror_source_code_path + "/modules/" + module_name;
40         }
41         return this.uri;
42     },
44     open_in_editor : function() {
45         yield open_with_external_editor(load_spec(this.best_uri),
46                                         $line = this.line_number);
47     }
50 var get_caller_source_code_reference_ignored_functions = {};
52 function get_caller_source_code_reference (extra_frames_back) {
53     /* Skip at least this function itself and whoever called it (and
54      * more if the caller wants to be skipped). */
55     var frames_to_skip = 2;
56     if (extra_frames_back != null)
57         frames_to_skip += extra_frames_back;
59     for (let f = Components.stack; f != null; f = f.caller) {
60         if (frames_to_skip > 0) {
61             --frames_to_skip;
62             continue;
63         }
64         if (get_caller_source_code_reference_ignored_functions[f.name])
65             continue;
66         return new source_code_reference(f.filename, f.lineNumber);
67     }
69     return null;
72 function ignore_function_for_get_caller_source_code_reference (func_name) {
73     get_caller_source_code_reference_ignored_functions[func_name] = 1;
76 provide("source-code");