2015-05-13 5 views
0

Я работаю над расширением InDesign CS6 в Adobe Flash Builder 4.6. По какой-то причине мой код (который отлично работал в течение длительного времени) теперь выдает ошибку null is not an object. Ошибка находится в яваскрипта инъекции (последняя строка):Отладка JavaScript-инъекции в ActionScript (Flash Builder)

public class Script { 
    private static var _instance:Script; 

    [ Embed (source="script.jsx", mimeType="application/octet-stream") ] 
    private var ScriptClass:Class; 
    private var jsxInterface:HostObject; 

    public function Script() { 
     if (Script._instance) { 
      throw new Error("only single instance allowed"); 
     } 
     Script._instance = this; 
     this.init(); 
    } 

    public static function getInstance():Script { 
     return _instance; 
    } 

    private function init():void { 
     Log.log("HostObject.mainExtension: "+HostObject.mainExtension); 
     for each (var s:String in HostObject.extensions) { 
      Log.log("Extension: "+s); 
     } 

     this.jsxInterface = HostObject.getRoot(HostObject.mainExtension); 
     this.jsxInterface.eval(new ScriptClass().toString()); 
    } 

    public function getScript(name:String):Object { 
     return this.jsxInterface[name]; 
    } 

    public function exec(name:String, args:Array = null):Object { 
     return InDesign.app.doScript(
      this.jsxInterface[name], ScriptLanguage.javascript, args, UndoModes.AUTO_UNDO); // <-- this is where the error appears 
    } 

I'v проверил аргументы InDesign.app.doScript для нулевой, но все в порядке. Это функция (внутри script.jsx), который называют:

function prepareForImageExport(params) { 
    var pageItem = params[0]; 
    var prefix = params[1]; 
    var bounds = params[2]; 
    var ax = params[3]; 
    var ay = params[4]; 

    pageItem.visible = true; 

    // create tmp container 
    var container = app.activeDocument.rectangles.add(app.activeDocument.activeLayer); 

    container.name = prefix+container.id; 
    container.geometricBounds = bounds; 
    container.strokeWeight = 0; 
    container.strokeColor = app.activeDocument.swatches.item("None"); 
    container.fillColor = app.activeDocument.swatches.item("None"); 
    container.visible = true; 
    container.transparencySettings.blendingSettings.opacity = 100; 

    // create a duplicate of the pageItem in the tmp container 
    var copyItem = pageItem.duplicate(app.activeDocument.activeLayer); 
    copyItem.transparencySettings.blendingSettings.opacity = 100; 
    copyItem.locked = false; 
    container.geometricBounds = bounds; 
    container.move([ax,ay]); 
    copyItem.visible = true; 

    app.select(copyItem); 
    app.cut(); 
    app.select(container); 
    app.pasteInto(); 

    app.scriptArgs.setValue("container", container.name); 
} 

На этом месте я застрял. Я не знаю, в какой строке javascript появляется ошибка.

Я очень новичок в ActionScript, и я не могу найти документацию о том, как отлаживать инъекции Javascript в ActionScript. Также я не знаю, какие переменные (например, приложение) доступны внутри javascript-кода, а какие (например, консоль - я не могу писать console.log) - нет.

Любая помощь с благодарностью!

ответ

0

Прежде всего, попробуйте проверить, что аргументы/params, отправленные на javascript, действительны (не указаны здесь null или undefined) после этого попытайтесь зарегистрировать каждую строку в JS-коде, чтобы увидеть, где она сбой, я не уверен, как JS-код выполняется в вашем случае (я не делал расширения), но если он использует HtmlLoader, то вы можете получить доступ к окну объекта загрузчика и добавить к нему функцию журнала или консольный объект с функцией журнала.

+0

Я уже проверил значение null. HtmlLoader не работал, я переписал код JavaScript в ActionScript. –

0

Проверьте сначала this.jsxInterface, если это верный объект. Вы можете использовать режим отладки как режим и установить там точку останова. Затем посмотрите на this.jsxInterface [name].

Я не делал никаких расширений с тех пор, как пару лет, но jsxInterface должен быть доступен без «этого». как вы установите его как переменную выше.

Для чего я не пытаюсь отлаживать js-код в Flex Builder. Что вы можете сделать, так это использовать функцию журнала (http://debrouwere.github.io/Extendables/docs/packages/logging/doc/readme.html), а затем посмотреть, что вы получаете от Flex. Помните, что неудивительно, когда вы проходите объекты Flex, вы фактически получаете объекты Flex в контексте ExtendScript.

А если коротко, ваша ошибка означает, что вы пытаетесь использовать объект, который не существует (this.jsxInterface по моему скромному мнению). Может быть, вы js-код в порядке, возможно, параметры тоже, но проблема должна быть расположена в inbetweens.

И для гибкого ведения журнала вы можете использовать «trace()», но вам нужно быть в режиме отладки.

+0

Спасибо за ответ, к сожалению, это не помогло. Я поменял код javascript на actionscript и наткнулся на новую проблему: http://stackoverflow.com/questions/30322899/random-errors-in-actionscript-memory-overflow –

+0

Жаль, что это не помогло. – Loic

+1

Проверьте это: http://blogs.adobe.com/cssdk/category/cssdk/indesign-extensions и особенно hostObjectDelegate – Loic