LINUX.ORG.RU

Дополнение к Firefox 30. Получение содержимого активной страницы.

 , ,


0

2

Пытаюсь сделать просто сохранение html, активной вкладки по хоткею alt+s в жёстко заданное место
да вот пытаюсь получить html-содержимое текущей страницы через

windows.activeWindow
и потом записать в файл чрез nsFile
и в итоге при нажатии нужного хоткея получаю в логах
Message: TypeError: windows is undefined
хотя
var windows = require("sdk/windows").browserWindows;
смотрю сюда, но причин ошибки не вижу

Дай лучше нормальную ссылку «сюда». Ты же о конкретной странице говорил?

d2 ()
Ответ на: комментарий от d2

например отсюда

var windows = require("sdk/windows").browserWindows;
windows.activeWindow.close(function() {
  console.log("The active window was closed");
});
выдаёт
Message: TypeError: windows is undefined

Zhopin ()
Ответ на: комментарий от d2

и как вообще получить html из windows.activeWindow
про работу с document я вообще не въёхал, там колдуны писали

Zhopin ()
Ответ на: комментарий от Zhopin

Эээээ... Это весь код в моём main.js. УМВР (открывает 2-ое окно с http://www.example.com).

"use strict";

var windows = require("sdk/windows").browserWindows;
var example = windows.open("http://www.example.com");
d2 ()
Ответ на: комментарий от Zhopin

Вот такой код у меня тоже работает (вторая часть у меня запускалась по клику на кнопке):

"use strict";

var tabs = require("sdk/tabs");
var tab_utils = require("sdk/tabs/utils");
var { viewFor } = require("sdk/view/core");

//
var tab = tabs.activeTab;
var lowLevelTab = viewFor(tab);
var browser = tab_utils.getBrowserForTab(lowLevelTab);
console.log(browser.contentDocument.body.innerHTML);

// Консоль по Ctrl + Shift + J

d2 ()
Ответ на: комментарий от d2
var { viewFor } = require("sdk/view/core");

Что за новая магия?

anonymous ()
Ответ на: комментарий от anonymous

Что конкретно смутило? Такая запись часто используется в Add-ons SDK.

d2 ()
Ответ на: комментарий от d2

Что конкретно смутило?

Что это значит и кто кроме firefox это понимает?

anonymous ()
Ответ на: комментарий от anonymous

Я не знаю js и не ориентируюсь в его стандартах. :D Могу только пример привести:

> var a = {lol: 5};
> var { b } = a;
> var { lol } = a;
< undefined
> b
< undefined
> lol
< 5

кто кроме firefox это понимает?

Chromium точно не понимает.

d2 ()
Ответ на: комментарий от d2

по поводу магии есть такая интересная статья: http://blog.tastejs.com/rewriting-a-webapp-with-ecmascript-6

это называется «деструктуризация», Destructuring Assignment:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/D...

введено в ECMAScript 6 (ECMA-262), формальное описание:

http://people.mozilla.org/~jorendorff/es6-draft.html#sec-destructuring-assign...

в списке фич V8 о ней никаких упоминаний

также есть вот этот баг с 2010 года: https://code.google.com/p/v8/issues/detail?id=811

(вначале эту фичу считали Safari-only, потом она стала частью ES6, но резолюции никакой нет)

судя по вот этой таблице: http://pointedears.de/scripts/test/es-matrix

сейчас эта фича работает в JavaScript 1.7

stevejobs ★★★☆☆ ()
Последнее исправление: stevejobs (всего исправлений: 1)
Ответ на: комментарий от d2

большое спасибо, разобрался
дело как видимо было в нестабильной или устаревшей версии перла, поэтому cfx капризничал

Zhopin ()
Ответ на: комментарий от d2

всё таки не пашет у меня

var { Hotkey } = require("sdk/hotkeys");

var showHotKey = Hotkey({
  combo: "alt-p",
  onPress: function() {
    var tabs = require("sdk/tabs");
    var tab_utils = require("sdk/tabs/utils");
    var { viewFor } = require("sdk/view/core");

    var tab = tabs.activeTab;
    var lowLevelTab = viewFor(tab);
    var browser = tab_utils.getBrowserForTab(lowLevelTab); 
    console.log(browser.contentDocument.body.innerHTML);  
  

  }
});
выдаёт
test: An exception occurred.
TypeError: viewFor is not a function
resource://e8xfsmq3xijhkw-at-jetpack/test/lib/main.js 18
Traceback (most recent call last):
  File "resource://gre/modules/commonjs/sdk/keyboard/observer.js", line 39, in handleEvent
    this._emit(event.type, event, event.target.ownerDocument.defaultView);
  File "resource://gre/modules/commonjs/sdk/deprecated/events.js", line 123, in _emit
    return this._emitOnObject.apply(this, args);
  File "resource://gre/modules/commonjs/sdk/deprecated/events.js", line 153, in _emitOnObject
    listener.apply(targetObj, params);
  File "resource://gre/modules/commonjs/sdk/keyboard/hotkeys.js", line 103, in onKeypress
    hotkey();
  File "resource://e8xfsmq3xijhkw-at-jetpack/test/lib/main.js", line 18, in showHotKey<.onPress
    var lowLevelTab = viewFor(tab);
что то и не гуглиться ничего(

Zhopin ()
Ответ на: комментарий от Zhopin
var tabs = require("sdk/tabs");
var tab_utils = require("sdk/tabs/utils");
var { viewFor } = require("sdk/view/core");
var { Hotkey } = require("sdk/hotkeys");

var showHotKey = Hotkey({
  combo: "alt-p",
  onPress: function() {
    var tab = tabs.activeTab;
    var lowLevelTab = viewFor(tab);
    var browser = tab_utils.getBrowserForTab(lowLevelTab); 
    console.log(browser.contentDocument.body.innerHTML);
  }
});

ИМХО, так лучше, но у меня работает и твой вариант. Правда у меня уже старая версия SDK (Add-on SDK 1.16 (05dab6aeb50918d4c788df9c5da39007b4fca335)) и самый новый Firefox (Nightly).

Ты точно SDK нормально поставил / запускаешь? %) Какие у тебя версии SDK и Firefox? Можешь запаковать каталог с расширением (не .xpi, именно исходники) и залить куда-нибудь?

d2 ()
Ответ на: комментарий от d2

у меня тоже 1.16, насколько я понял это последний сдк
пытаюсь запустить на iceweasel 27.4.0 это последний в wheezy репозиториях дебиана
в общем случае хочу добиться чтобы по хоткею текущая страница сохранялась и конвертилась в latex внешней утилитой, поэтому пытаюсь заставить работать содержимое /lib/main.js

var tabs = require("sdk/tabs");
var tab_utils = require("sdk/tabs/utils");
var { viewFor } = require("sdk/view/core");
var { Hotkey } = require("sdk/hotkeys");
const {Cc,Ci,Cu, components} = require("chrome");
Cu.import("resource://gre/modules/FileUtils.jsm");
Cu.import("resource://gre/modules/NetUtil.jsm")
	
var showHotKey = Hotkey({
  combo: "alt-p",
  onPress: function() {
    var tab = tabs.activeTab;
    var lowLevelTab = viewFor(tab);
    var browser = tab_utils.getBrowserForTab(lowLevelTab); 
	var websource = browser.contentDocument.body.innerHTML;
	//сохраняю полученный html код страницы
	var file = FileUtils.getFile("TmpD", ["html.tmp"]);
	file.createUnique(components.interfaces.nsIFile.NORMAL_FILE_TYPE, FileUtils.PERMS_FILE);

	var ostream = FileUtils.openSafeFileOutputStream(file);

	var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].
					createInstance(components.interfaces.nsIScriptableUnicodeConverter);
	converter.charset = "UTF-8";
	var istream = converter.convertToInputStream(websource);

	NetUtil.asyncCopy(istream, ostream, function(status) {
	if (!components.isSuccessCode(status)) {
		return;
	}
	});
	//запускаю htmltolatex для преобразования html документа в latex
	var path = "/usr/bin/htmltolatex"
	var args = ["-o /home/zhopin/1.ts", "/tmp/html.tmp"];

	var file = Cc["@mozilla.org/file/local;1"]
				.createInstance(Ci.nsIFile);
	file.initWithPath(path);

	var process = Cc["@mozilla.org/process/util;1"]
                .createInstance(Ci.nsIProcess);

	process.init(file);
	process.run(true, args, args.length);
  }
});
но оно ругается, и именно на том куске кода, где идёт получение содержимого страницы активной вкладки, что я приводил выше.
все остальные директории проекта плагина не менял, только main.js

Zhopin ()
Ответ на: комментарий от Zhopin

разумеется имена переменных в рабочем примере не пересекаются, во время отладки коментил куски кода и убирал коменты уже набирая сообщение

Zhopin ()
Ответ на: комментарий от Zhopin

iceweasel 27.4.0

Может быть всё же «24.8.0esr»? Твоей версии, ЕМНИП, не существует. В любом случае твоё SDK предназначенно для Fx 29+. Обновись.

у меня тоже 1.16, насколько я понял это последний сдк

Последний - 1.17.

d2 ()
Ответ на: комментарий от d2

да, напутал 28.4.0
поставил фаерфокс 31 из минтовских репозиториев, и действительно перестало ругаться и стало работать.
Т.е. получается совместимости с iceweasel мне не ждать? сдк утверждает что сей плагин будет работать и на 21 огнелисе, так утверждает по крайней мере install.rdf, а всегда казалось что iceweasle это более свободная копия огнелиса=\

Zhopin ()
Ответ на: комментарий от Zhopin

да, напутал 28.4.0

28

Вот, опять. :D

сдк утверждает что сей плагин будет работать и на 21 огнелисе, так утверждает по крайней мере install.rdf

Какой install.rdf? ЕМНИП, поддерживаемые расширением версии берутся отсюда: https://github.com/mozilla/addon-sdk/blob/master/app-extension/install.rdf#L19

Кроме того, часть «модулей» в SDK могут иметь собственные требования (например) и этот файл приходится руками править.

Т.е. получается совместимости с iceweasel мне не ждать?

Можешь попробовать более старые версии SDK, либо забить и пользоваться актуальными версиями. %)

d2 ()
Ответ на: комментарий от d2

да. я чот слоупочу, извиняюсь)
с iceweasel не такая уж потеря, буду использовать firefox
но вот по теме топика, можно ли всё таки получить полный сурс страницы? из приведённого выше примера получаю лишь самый внешний div, без заголовков и meta. А хотелось бы получить полный html страницы, как получаю вызовом из контекстного меню «Исходный код страницы»

Zhopin ()

вот полное решение топика, вывод полного исходного кода содержимого (не URL!) активной вкладки

var tabs = require("sdk/tabs");
var tab_utils = require("sdk/tabs/utils");
var { viewFor } = require("sdk/view/core");
const {Cc,Ci} = require("chrome");
var domSerializer = Cc["@mozilla.org/xmlextras/xmlserializer;1"]
                    .createInstance(Ci.nsIDOMSerializer);
//-----

        var tab = tabs.activeTab;
        var lowLevelTab = viewFor(tab);
	var browser = tab_utils.getBrowserForTab(lowLevelTab);
	var serobj = new XMLSerializer();
	var pagesource = serobj.serializeToString(browser.contentDocument);

	console.log(pagesource); //вывод исходного кода в консоль браузера
мб кому пригодится

Zhopin ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.