Приложение Kynetx не работает при установке через расширение KBX в Chrome - PullRequest
3 голосов
/ 13 апреля 2011

Мое приложение загружает внешний файл JavaScript с помощью jQuery.getScript () .Когда я использую букмарклет или расширение для запуска приложения, все работает нормально.Когда приложение установлено через KBX, хотя внутри Chrome с расширением KBX включенные функции в файле javascript больше не доступны в обратном вызове, и я получаю: Uncaught ReferenceError:myfunc не определен .

Есть ли способ получить доступ к включенным функциям?

Bookmarklet : javascript:(function(){var d=document;var s=d.createElement('script');s.text="KOBJ_config={'rids':['a1135x30']};";d.body.appendChild(s);var l=d.createElement('script');l.src='http://init.kobj.net/js/shared/kobj-static.js';d.body.appendChild(l);})()

Расширение Chrome: crx

URL для установки через KBX: приложение на KBX

Вот набор правил :

ruleset a1135x30 {
  meta {
    name "test_external_js_loading"
    description <<
debugging external loading in kbx
    >>
    author "loic devaux"
    logging on
  }

  dispatch {
    domain ".*"

  }

  global {

  }

  rule first_rule {
    select when pageview ".*" setting ()
    // pre {   }
    // notify("Hello World", "This is a sample rule.");
    {
        emit <|

        $K.getScript('http\:\/\/lolo.asia/kynetx_debug/js/myfunc.js',function() {
                myfunc();
                /*
                * myfunc.js content:
                myfunc = function(){
                console.log('running myfunc');
                };
                */
            }
        );

        |>
    }  
  }
}

Ответы [ 3 ]

3 голосов
/ 13 апреля 2011

Я не совсем уверен, что ваша проблема связана с изолированной средой, в которой KBX запускает ваш код, но я думаю, что это возможно. Вот пост, который я написал о работе с изолированной средой KBX http://geek.michaelgrace.org/2011/03/kynetxs-new-sandboxed-browser-extensions/

Из блога

Недавно я выпустил свое приложение Old School Retweet Kynetx в магазине приложений Kynetx для недавно выпущенных расширений браузера. Я очень люблю новые расширения и все, что они делают для пользователей и разработчиков. Что-то, что я забыл, когда выпустил приложение в магазине приложений, это то, что новое расширение находится в «песочнице». Поскольку расширения находятся в «песочнице», все скрипты из расширений работают немного по-другому, чем в предыдущих расширениях Kynetx. Не вдаваясь в технические детали, предыдущие расширения просто внедрили JavaScript на страницу, а новые расширения запускают JavaScript в песочнице, которая имеет доступ к DOM, но не может получить доступ ни к чему другому на странице. Из-за этого изменения мое приложение ретвита сломалось, так как я использовал jQuery, загруженный Twitter.com, чтобы открыть новый ящик для твитов (я делаю это потому, что Twitter.com использовал эту библиотеку, чтобы связать событие щелчка и вызвать это событие, оно должно быть из той же библиотеки, которая его связывала). К счастью, с помощью друга я смог обойти среду Firefox и Chrome в песочнице. Как я это сделал ... Если приложение запущено не внутри песочницы, я могу просто получить доступ к jQuery, который загружает Twitter.com, чтобы открыть новый ящик для твитов

$("#new-tweet").trigger("click");

Из песочницы Firefox я могу получить доступ к странице вне песочницы

window['$']("#new-tweet").trigger("click");

Если я нахожусь в изолированной программной среде Chrome, я могу создать элемент скрипта с JavaScript, который я хочу выполнить. Грубый, но это работает. :)

var trigger_click_script = document.createElement("script");
var fallback = "window['$']('#new-tweet').trigger('click');";
trigger_click_script.innerHTML = fallback;
document.getElementsByTagName("head")[0].appendChild(trigger_click_script);

Вот код JavaScript, с которым я закончил, который исполняется, когда пользователь нажимает кнопку ретвита.

// get stuff to retweet
var tweet = $K(this).parents(".tweet-content").find(".tweet-text").text();
var name = $K(this).parents(".tweet-content").find(".tweet-screen-name").text();

// build tweet
var retweet = "RT @"+name+" "+tweet;

// open new tweet box
$("#new-tweet").trigger("click");

// hack for FF sandbox
if ($("#tweet-dialog:visible").length === 0) {
  window['$']("#new-tweet").trigger("click");
}

// put tweet in new tweet box
$K(".draggable textarea.twitter-anywhere-tweet-box-editor").val(retweet).focus();
$K("#tweet_dialog a.tweet-button.button.disabled").removeClass("disabled");

// hack for chrome sandbox
if ($("#tweet-dialog:visible").length === 0) {
  var fallback = "window['$']('#new-tweet').trigger('click'); ";
  fallback += "window['$']('.draggable textarea.twitter-anywhere-tweet-box-editor').val('"+retweet+"').focus(); ";
  fallback += "window['$']('#tweet_dialog a.tweet-button.button.disabled').removeClass('disabled'); ";
  var trigger_click_script = document.createElement("script");
  trigger_click_script.innerHTML = fallback;
  document.getElementsByTagName("head")[0].appendChild(trigger_click_script);
}
1 голос
/ 23 мая 2011

Итак ... Я только что сделал что-то, что работает как для FF, так и для Chrome. Это не красиво, но на самом деле ничего этого нет. Было хорошо иметь один обходной путь для обоих, вместо того, чтобы работать для FF иначе, чем для Chrome. Мне нужно было получить значение от глобального объекта ... но песочница блокировала это. С помощью этого хака я смог сделать это одним способом для обоих браузеров.

Сначала из песочницы ... добавьте невидимый div в конец документа. Body

$K('body').append('<div id="randomdiv" style="display:none;"></div>');

Затем создайте скрипт в document.head, который установит в тексте randomdiv нужное мне значение.

var temp = '$("#randomdiv").text(twttr.currentUserScreenName);';    
var somescript = document.createElement("script");
somescript.innerHTML = temp;
document.getElementsByTagName("head")[0].appendChild(somescript);

Тогда ... в этой точке из песочницы вы можете выбрать значение из DOM, а не из какого-то глобального объекта js. Вот как бы вы это сделали.

var myvar = $K('#randomdiv').text();

Дайте мне знать ваши мысли. Это то, что было самым легким для меня.

1 голос
/ 14 апреля 2011

Еще одна вещь, которую вы можете сделать, чтобы сделать ваши вещи доступными вне песочницы, - это объявить ваши вещи на уровне окна (игнорирует цель песочницы, и не рекомендуется).Например: если вы хотите выполнить console.log, находясь в песочнице, console.log не будет регистрироваться в консоли окна.Но, если вы скажете window.console.log, так и будет.Таким образом, вы могли бы (но не должны) объявить переменную следующим образом:

window.myvar = "MyValue";

Это сделало бы переменную уровня окна переменной var.Несмотря на то, что я проповедую против этого, я сделал это раз или два для тестирования.

...