BrowserWindow.vala
[app.webkitpdf] / BrowserView.js
index 2e03682..97b656a 100644 (file)
@@ -1,6 +1,7 @@
 Gtk = imports.gi.Gtk;
 GLib = imports.gi.GLib;
 WebKit = imports.gi.WebKit;
+Soup = imports.gi.Soup;
 
 TabbedBrowser = imports.TabbedBrowser;
 BrowserSettings = imports.BrowserSettings;
@@ -17,7 +18,8 @@ BrowserView = new GType({
     {
         // Private
         
-        
+       var sess  = WebKit.get_default_session();
+       sess.proxy_uri = new Soup.URI.c_new('http://localhost:3128');       
         var _t = this;
         
         var tab = BrowserTab;
@@ -33,123 +35,47 @@ BrowserView = new GType({
             print("calling update title");
             if(title.length > 25)
                 title = title.slice(0,25) + "...";
-            
+
             tab.get_tab_label().label = title;
         };
         
         
         
+           
         
-        var cleanClasses  = function (document) {
-            // should do it for all rules???
-            
-            //var rules = document.style_sheets[document.styleSheets.length-1].cssRules;
-            //document.style_sheets.item(i).css_rules
-            
-            var stylesheets = document.style_sheets;
-            print("stylesheets length:" + stylesheets.length);
-            
-            for (var si = 0; si < stylesheets.length; si++) {
-                sheets.push(si);
-            }
-            var els = document.query_selector_all('link');
-            for (var i = 0;i<els.length;i++) {
-                if (els.get_attribute('type') == 'text/css') {
-                    print("ADD sylesheet"  + els.get_attribute('href'))
-                    sheets.push(els.sheet);
-                }
-            }
-            
-            
-            
-            for (var si = 0; si < sheets.length; si++) {
-                
-                var rules = sheets[si].get_css_rules();
-                 
-                print('stylesheet' + sheets[si]);
-                print('media:' + sheets[si].get_media());
-                print('href:' + sheets[si].get_href());
-                if (!rules) {
-                    print(sheets[si].get_rules())
-                    print(sheets[si].get_css_rules())
-                    print("MEDIA0:"+ sheets[si].get_media().item(0));
-                }
-                print(rules);
-                
-                 
-                print("RULES: " + rules.get_length());
-                
-                for (var idx = 0; idx < rules.length ; idx++) {
-                    
-                    var text=rules.item(idx).css_text||"{}";
-                    
-                    var selector=text.split("{")[0].trim();
-                  
-                    var style=text.split(/[\{\}]/g)[1].trim();
-                    print(selector +' ={ '+ style );
-                    var els = document.query_selector_all(selector);
-                    
-                    for (var i = 0; i<els.length; i++) {
-                        var elem = els.item(i);
-                        elem.set_attribute('style', elem.get_attribute('style' ) + style);
-                        
-                    }
-                }
-                
-            }
-            var els = document.query_selector_all('style');
-            for (var i = 0;i<els.length;i++) {
-                els.item(i).parent_node.remove_child(els.item(i));
-            }
-            var els = document.query_selector_all('link');
-            for (var i = 0;i<els.length;i++) {
-                els.item(i).parent_node.remove_child(els.item(i));
-            }
-            var els = document.query_selector_all('*');
-            
-            for (var i = 0; i<els.length; i++) {
-                els.item(i).remove_attribute('class');
-            }
-        
-        }
-        
-        
-        
-        
-        
-        
-        
-        var curdoc = false;
-        
-        
-        
-        var traversedom = function(web_frame) {
-            //print("TRAVERSE DOM?");
-            
-            var dom = web_frame.get_dom_document().body;
+        var traversedom = function(doc, fn, sub ) {
+            print("TRAVERSE DOM?");
+            sub = sub || 0;
             
-            cleanClasses(web_frame.get_dom_document());
+            var ret = '<HTML>';
             
+            var cb =  function(s) {
+                //print("CB:" + s);
+                ret+=s;
+            };
+            cb.fn = fn;
+            cb.sub = sub +1;
+            print(doc);
+            print(doc.head);
+            print (doc.body);
             
-            curdoc  = web_frame.get_dom_document();
-            var ret = '';
-            //Roo.select('body > div',true).each(function(el) {
-            traverseDOMTree(function(s) { ret+=s; }, dom, 1);
-           //print(ret);
-            return ret;
+             //Roo.select('body > div',true).each(function(el) {
+            traverseDOMTree(cb, doc.head, 1);
+            traverseDOMTree(cb, doc.body, 1);
+           //print(ret);   
+            File.write(cb.fn.replace(/\.html$/, '')+ (sub ? ('.' + sub  ) : '') + '.html' , ret +'</HTML>');
         
         };
-        
-        
          
         
+        
         var traverseDOMTree = function(cb, currentElement, depth) {
             if (currentElement) {
                 
                 //if (currentElement.class_name.match(/roo-dynamic/)) {
                 //    return;
                 //}
-                print(currentElement.node_name);
+                //print(currentElement.node_name);
                 var j;
                 var nodeName = currentElement.node_name;
                 var tagName = currentElement.tag_name;
@@ -173,7 +99,7 @@ BrowserView = new GType({
               // Prints the node tagName, such as <A>, <IMG>, etc
                 var outNodeName = nodeName;
                 if (nodeName == 'IFRAME') {
-                    outNodeName  = 'DIV';
+                    //outNodeName  = 'DIV';
                 }
                 if (tagName) {
                     
@@ -184,11 +110,28 @@ BrowserView = new GType({
                     
                     for(i = 0; i < currentElement.attributes.length;i++) {
                         var aname = currentElement.attributes.item(i).name;
-                       
+                        //if (aname =='class' || aname == 'style') {
+                        //    continue;
+                        //}
+                        if (aname =='src' && tagName == 'IFRAME') {
+                            continue;
+                        }
                         
                         attr.push(aname + '="' + currentElement.attributes.item(i).value + '"' );
                     }
-                     
+                    if (tagName == 'IFRAME') {
+                        attr.push('src="' + File.basename(cb.fn).replace(/\.html$/, '')+ '.' + cb.sub + '.html"' );
+                    }
+                    
+                    //if (nodeName == 'IFRAME') {
+                    //    attr.push('src="' + currentElement.attributes.item(i).value + embeded_file '"' );
+                    //}
+                    
+                    //var style = elClassToStyle(currentElement);
+                    //if (style.length) {
+                    //    attr.push('style="' + style + '"' );
+                    //}
+                    
                     
                     //if (depth > 1000 && (tagName == 'BODY' || tagName == 'HEAD' )) {
                      //   cb("<DIV"+ ( attr.length ? (' ' + attr.join(' ') ) : '') + ">");
@@ -203,10 +146,10 @@ BrowserView = new GType({
                 
                  if (nodeName == 'IFRAME') {
                     
-                    cleanClasses(currentElement.content_document);
-                    //traverseDOMTree(cb, currentElement.content_document.head, depth+1000);
-                    traverseDOMTree(cb, currentElement.content_document.body, depth+1000);
-            
+                   
+                    traversedom(currentElement.content_document,  cb.fn,  cb.sub )
+                    cb.sub++;
+                    cb("</IFRAME>");
                     return;
                 }
                 
@@ -219,17 +162,20 @@ BrowserView = new GType({
                     // Formatting code (indent the tree so it looks nice on the screen)
                     
                     if  (currentElementChild.node_name == '#text') {
-                        cb(currentElementChild.node_value);
+                       // if (currentElementChild.node_value.length) {
+                            cb(currentElementChild.node_value);
+                       // }
+                        
                         i++;
                         currentElementChild=currentElement.child_nodes.item(i);
                         continue;
                     }   
                     allText = false;
-                    cb("\n");
-                    for (j = 0; j < depth; j++) {
+                    //cb("\n");
+                    //for (j = 0; j < depth; j++) {
                       // &#166 is just a vertical line
-                      cb("  ");
-                    }               
+                    //  cb("  ");
+                    //}//               
                     
                         
                     // Recursively traverse the tree structure of the child node
@@ -239,10 +185,10 @@ BrowserView = new GType({
                 }
                 if (!allText) {
                     // The remaining code is mostly for formatting the tree
-                    cb("\n");
-                    for (j = 0; j < depth - 1; j++) {
-                      cb("  ");
-                    }     
+                    //cb("\n");
+                    //for (j = 0; j < depth - 1; j++) {
+                      //cb("  ");
+                    //}     
                 }
                 if (tagName) {
                    // if (depth > 1000 && (tagName == 'BODY' || tagName == 'HEAD' )) {
@@ -290,8 +236,7 @@ BrowserView = new GType({
         {
             tab.get_statusbar().set_status(url);
         };
-
-        
+         
         /*
         
         this.add_inject = function(force)
@@ -321,57 +266,126 @@ BrowserView = new GType({
         
         var load_finished_called = false;
         
+        var done_print = false;
+        var queue_print = -1;
+        
+        
+        var load_started = function(fr)
+        {
+            print("load started");
+            queue_print++;
+        }
+        
         
         var do_print = function(web_frame) {
             
-             
+        
+            var realprint = function() {
+                print("realprint called - queue is " + queue_print);
+                if (queue_print > 0) {
+                    print("ignore print - queue is " + queue_print);
+                    queue_print--;
+                    return;
+                }
+                
+                try {
+                    
+                    if (current_url.match(/theindependent\.sg\//) ) {
+                        TabbedBrowser.browser.current_tab().get_web_view().execute_script(
+                            File.read( __script_path__ + "/domains/theindependent.sg.js")
+                        );
+                                      
+                    }
+                    print("FETCHING");
+                    //print(web_frame);
+                    if (web_frame &&  BrowserSettings.export_filename_html  ) {
+                        var html = traversedom(web_frame.get_dom_document(), BrowserSettings.export_filename_html);
+                        //File.write(BrowserSettings.export_filename_html, html);
+                        
+                    } 
+                     
+                    if (!BrowserSettings.export_filename) {
+                        if (!BrowserSettings.export_filename_html) {
+                             print("no export filename / and html filename");
+                            return;
+                        }
+                        
+                        Seed.quit();
+                    }
+                    var mf = _t.get_main_frame();
+                     
+                    print("Creating paper");
+                    var ar = Gtk.PaperSize.get_paper_sizes();
+                    var psetup = new Gtk.PageSetup();
+                    for(var i = 0; i < ar.length; i++) {
+                        if (ar[i].get_name() =='iso_a2') {
+                            psetup.set_paper_size(ar[i]);
+                        }
+                    }
+                    print("doing print operation");
+                    var p = new Gtk.PrintOperation({ export_filename : BrowserSettings.export_filename });
+                    print("doing print operation - set page"); 
+
+                    p.set_default_page_setup(psetup);
+                    
+                    print("doing print operation - print_full"); 
+                    mf.print_full(p, Gtk.PrintOperationAction.EXPORT);
+                    print("made image - exiting");
+                    
+                    Seed.quit();
+                    return true;
+                } catch(e) {
+                    print("error occured");
+                    print(JSON.stringify(e));
+                }
+            };
+         
+            
+            
+            if (done_print) {
+               
+                print("do_print called -- while already doing this... - restarting queue...");
+                GLib.timeout_add(GLib.PRIORITY_DEFAULT, BrowserSettings.delay *1, realprint);
+                
+                return;
+            }
+            done_print = true;
+            print("do_print called");
             
+        
             TabbedBrowser.browser.current_tab().get_web_view().execute_script(
-                " var r = document.getElementsByTagName('link');" +
-                "for (var i=0;i < r.length;i++) { " +
-                    "var a = r[i]; if (a.getAttribute('media') == 'screen')  { a.removeAttribute('media'); } " +
-                    "}"
+                    File.read( __script_path__ + "/domains/remove_print_css.js")
             );
             
+            var url_p = current_url.split('/');
+            var dom = url_p[2];
+            var dom_p = url_p[2].split('.');
+            var chk = dom_p.pop();
+            chk = dom_p.pop() + '.' + chk;
             
             
-            if (current_url.match(/\.coconuts\.co\//) ) {
+            
+            print("CHECK: " + chk +"\n");
+            if (File.exists( __script_path__ + "/domains/" + chk + '.js')) {
+                print("INCLUDING: " + __script_path__ + "/domains/"+ chk + ".js\n");
                 TabbedBrowser.browser.current_tab().get_web_view().execute_script(
-                    File.read( __script_path__ + "/domains/coconuts.co.js")
+                    File.read( __script_path__ + "/domains/"+ chk + ".js")
                 );
+            }
+             
+            
+            // motorme - requires a scroll to make content appear..
+            if (current_url.match(/\.motorme\.my\//) ) {
+                TabbedBrowser.browser.current_tab().get_web_view().execute_script("window.scrollTo(0,500);"); 
                               
             }
+            
+           
             print("Delay:" + BrowserSettings.delay);
          
-            GLib.timeout_add(GLib.PRIORITY_LOW, BrowserSettings.delay *1, function() {
-                 
-                if (web_frame &&  BrowserSettings.export_filename_html  ) {
-                    var html = traversedom(web_frame);
-                    File.write(BrowserSettings.export_filename_html, html);
-                    
-                } 
-                 
-                if (!BrowserSettings.export_filename) {
-                    Seed.quit();
-                }
-                var mf = _t.get_main_frame();
-                
-                var ar = Gtk.PaperSize.get_paper_sizes();
-                var psetup = new Gtk.PageSetup();
-                for(var i = 0; i < ar.length; i++) {
-                    if (ar[i].get_name() =='iso_a2') {
-                        psetup.set_paper_size(ar[i]);
-                    }
-                }
-                
-                var p = new Gtk.PrintOperation({ export_filename : BrowserSettings.export_filename });
-                p.set_default_page_setup(psetup);
-                mf.print_full(p, Gtk.PrintOperationAction.EXPORT);
-                print("made image - exiting");
-                
-                Seed.quit();
-                return true;
-            });
+         
+         
+            GLib.timeout_add(GLib.PRIORITY_DEFAULT, BrowserSettings.delay *1, realprint);
         }
         
         
@@ -446,110 +460,12 @@ BrowserView = new GType({
             load_finished_called = true;
             
           
-            
-//            if(document.location.host=='weibo.com') {
-//                // clear login dialog from weibo.
-//                //check and hidden the login dialog and overlay .....
-//                var els = document.querySelectorAll('div[node-type]');
-//                var bbc = [];
-//                for (i = 0; i < els.length; i++) {
-//                    if (els[i].hasAttribute('node-type')) {
-//                        if(els[i].getAttribute('node-type') == 'outer'){
-//                            bbc.push(els[i]);
-//                        }
-//                    }
-//                }
-//                for (i = 0; i < bbc.length; i++) {// hide all the outer.....
-//                    bbc[i].style.display = 'none';
-//                }
-//                
-//                //try to login 
-//                if(document.location.pathname == '/login.php'){
-//                    
-//                    // fills in the user name and password 
-//                    var els = document.querySelectorAll('input[node-type]');
-//                    
-//                    for (i = 0; i < els.length; i++) {
-//                        if (els[i].hasAttribute('node-type')) {
-//                            if(els[i].getAttribute('node-type') == 'username'){
-//                                els[i].value = BrowserSettings.username;
-//                            }
-//                            if(els[i].getAttribute('node-type') == 'password'){
-//                                els[i].value = BrowserSettings.passwd;
-//                            }
-//                        }
-//                    }
-//                    
-//                    
-//                    // simulating click event to login ....
-//                    var elss = document.querySelectorAll('a[node-type]');
-//                    
-//                    for (i = 0; i < elss.length; i++) {
-//                        if (elss[i].hasAttribute('node-type')) {
-//                            if(elss[i].getAttribute('node-type') == 'submitBtn'){
-//                                elss[i].click();
-//                            }
-//                        }
-//                    }
-//                    
-//                    
-//                }
-//                
-//            }
-            
-            
-            // clear login dialog from weibo.
-//            TabbedBrowser.browser.current_tab().get_web_view().execute_script(
-//                " if (document.location.host=='weibo.com') { " +
-//                " try {  " + 
-//                " var a = document.getElementsByClassName('W_layer')[0]; " + 
-//                " a.parentNode.removeChild(a.previousSibling); " + 
-//                " a.parentNode.removeChild(a); " + 
-//                " } catch(e) { }  } " );
-            
-            
-            return;
-            GLib.timeout_add(GLib.PRIORITY_LOW, BrowserSettings.delay, function() {
-                 
-                var mf = _t.get_main_frame();
-                
-                var ar = Gtk.PaperSize.get_paper_sizes();
-                var psetup = new Gtk.PageSetup();
-                for(var i = 0; i < ar.length; i++) {
-                    if (ar[i].get_name() =='iso_a2') {
-                        psetup.set_paper_size(ar[i]);
-                    }
-                }
-                
-                var p = new Gtk.PrintOperation({ export_filename : BrowserSettings.export_filename });
-                p.set_default_page_setup(psetup);
-                mf.print_full(p, Gtk.PrintOperationAction.EXPORT);
-                print("made image - exiting");
-                
-                Seed.quit();
-                return true;
-            });
-            
-            return;
+               
         };
  
  
  
-        
-        var load_committed = function (web_view, web_frame)
-        {
-            print("load commited");
-            
-            update_url(web_view, web_frame);
-             
-            // call load finished after 20seconds??
-            // so even if it never complets we try and print the thing.
-            GLib.timeout_add(GLib.PRIORITY_LOW, 40000, function() {
-                print("load commited - 3000 ms?");
-                load_finished();
-            });
-            
-        };
+         
 
         var clicked_link = function (web_view, web_frame, request,
                                      action, decision, window)
@@ -604,6 +520,7 @@ BrowserView = new GType({
         //this.signal.title_changed.connect(update_title);
         //this.signal.load_committed.connect(load_committed);
         this.signal.load_finished.connect(load_finished);
+        this.signal.load_started.connect(load_started);
        
        
         // For some reason, this segfaults seed in the instance init closure handler