niedziela, 29 września 2013

DialogsControl - kontrolowanie domyślnych okien dialogowych

Prosta funkcja/klasa pozwalająca kontrolować (udawać) okna dialogowe.
Przy pomocy metody disable możemy wyłączyć wyświetlanie wszystkich okien dialogowych. oba parametry tej metody pozwalają ustawić wartości zwracane przez funkcje confirm oraz prompt. Domyślne ich wartości to odpowiednio true oraz '' (pusty string).
Metoda restore pozwala przywrócić domyślne wartości tych funkcji czyli oryginalne okna dialogowe w obiekcie window. Domyślne pod warunkiem, że nie były one modyfikowane przez inny skrypt.

var DialogsControl = function(w){
  w = w || window;
  var d = {
    alert: w.alert,
    confirm: w.confirm,
    prompt: w.prompt
  };

  return {
    disable: function(confirmRet, promptRet){
      if (typeof confirmRet === 'undefined')
        confirmRet = true;
      if (typeof promptRet === 'undefined')
        promptRet = '';
      w.alert = function(){};
      w.confirm = function(){return confirmRet;};
      w.prompt = function(){return promptRet;};
    },
    restore: function(){
      w.alert = d.alert;
      w.confirm = d.confirm;
      w.prompt = d.prompt;
    }
  };    
};

Gotowy kod z przykładami wywołania można przetestować tutaj http://jsfiddle.net/a8BvR/

onContentChange

Troszkę słabe rozwiązanie, ale pozwala wykryć zdarzenie zmiany treści na dowolnej stronie.

var onContentChange = function(htmlEl, fn) {
  var content = htmlEl.innerHTML;
  (function callee(){
    if (htmlEl.innerHTML !== content) {
      fn(htmlEl.innerHTML, content);
      return;
    }
    setTimeout(callee, 50);
  })();
};

Zdarzenie po wykryciu odpina się automatycznie.

Przykład wywołania:

onContentChange(document.querySelector('div'), function(n, o){
  alert(
    'changed'+"\n"+
    'old value: '+o+"\n"+
    'new value: '+n
  );
});

jsfiddle: http://jsfiddle.net/f82Um/1/

niedziela, 22 września 2013

php dump

Przydatna funkcja, która wyświetla obiekt, w postaci czytelnej na stronie html.
Zamiast print_r, można również użyć var_dump lub podobnej funkcji.

function dump($obj) {
  echo '<pre>';
  echo htmlspecialchars(print_r($obj, true));
  echo '</pre>';
}

czwartek, 12 września 2013

waitFor - zaczekaj na pojawienie się obiektu

Funkcja, która w bardzo prymitywny sposób czeka na pojawienie się oczekiwanego obiektu w bliżej nie określonym czasie. Czasami takie coś może się przydać jeśli inny skrypt tworzy obiekty i nie wiemy kiedy się pojawią.

var waitFor = function(obj, srcArr, fn, opt){
  opt = opt || {t: 50};

  (function callee(){
    var tmp = obj;
    var tid = setTimeout(callee, opt.t);
    for (var i = 0; i < srcArr.length; ++i) {
      if (typeof tmp[srcArr[i]] !== 'undefined') {
        tmp = tmp[srcArr[i]];
      } else {
        return;
      }
    }
    clearTimeout(tid);
    fn(tmp, obj);
  })();
};
Poniżej przykład użycia:
waitFor(window, 'abc.def'.split('.'), function(data, obj){
  alert('jest: ' + data);
});

setTimeout(function(){
  window.abc = {};
  
  setTimeout(function(){
    window.abc.def = 'obiekt/dane';
  }, 1e3);
}, 1e3);

uruchamianie chrome script w oryginalnym window

Jak wiadomo w rozszerzeniach google chrome, kiedy chcemy użyć obiektu window i wykonać interakcję z istniejącymi skryptami na stronie, lub zostawić dostęp do funkcji tak aby była widoczna z konsoli mamy mocno utrudnione zadanie ponieważ przeglądarka tworzy specjalnie dla skryptu nowy wirtualny obiekt window.

Poniżej stworzyłem kawałek kodu - hack, który pozwala na wykonanie naszego userscript w oryginalnym scope.
Może da się to zrobić jakoś lepiej. Zapraszam do komentowania.

"use strict";

(function main(w){
  if (chrome.extension) {
    var s = document.createElement('script');
    s.src = 'data:text/javascript;base64,' + btoa('('+main.toString()+')(window);');
    document.getElementsByTagName('head')[0].appendChild(s);
    return;
  }

  w.test = "ta zmienna powinna byc widoczna z konsoli";

})(window);

środa, 11 września 2013

Skrót do szybkiego blokowania ekranu na macu

Po wielu poszukiwaniach udało mi się wreszcie znaleźć skrót, taki który blokuje ekran (wymaga hasła aby dostać się do systemu), ale nie wyłącza działających aplikacji.

Wcześniej korzystałem z komendy suspend:
suspend () {
  /System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -suspend
}

Ale po jej uruchomieniu itunes się wyłączał.

Teraz korzystam ze skrótu control + shift + eject
Przy czym należy w preferencjach prywatności wybrać odpowiednią opcję: