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ę:

poniedziałek, 26 sierpnia 2013

Dane z blockchaina

Poza transakcjami bitcoin w blockchain mogą być zawarte dowolne dane przez wykopujących bloki.
EThe Times 03/Jan/2009 Chancellor on brink of second bailout for banks

Poniższa komenda bash pozwala podejrzeć wszystkie aktualne dane zawarte w blokach.
for f in .bitcoin/blocks/blk*.dat; do echo -e "\n$f:"; strings -n 20 $f; done

Dla macos:
for f in ~/Library/Application\ Support/Bitcoin/blocks/blk*.dat; do echo -e "\n$f:"; strings -n 20 "$f"; done

http://pastebin.com/viRdMbAa

niedziela, 10 lutego 2013

Odblokowanie prawego klawisza myszy

Niektóre strony blokują prawy klawisz myszy w dokumencie. Przykładowy, kod który to realizuje znajduje się pod adresem pastebin.com/jyKeaZpZ.

Aby sobie z tym poradzić bez wyłączania JavaScript wystarczy wkleić poniższy kod do paska adresu.

javascript:document.oncontextmenu=function(){};

środa, 6 lutego 2013

Global scope

Przydatne do sprawdzania co jest w przeglądarce. Co zostało dodane przez skrypty a nie jest natywnym elementem JavaScript`u czy DOM.

(function(){
  var w = window.open('about:blank');
  var res = [];
  for( var i in window ){
    if( typeof w[i] === 'undefined' ){
      res.push(i);
    }
  }
  w.close();
  return res;
})().join('\n');

środa, 23 stycznia 2013

odpowiednik htmlspecialchars w js

Odpowiednik funkcji htmlspecialchars znanej z PHP.
var htmlspecialchars = function(html){
  return [
    [/&/g, '&amp;'],
    [/</g, '&lt;'],
    [/>/g, '&gt;'],
    [/"/g, '&quot;'],
    [/'/g, '&#39;']
  ].reduce(function(h, r){
    return h.replace(r[0], r[1]);
  }, html);
};
Funkcja przydatna np. do umieszczania kodu na tym blogu. Przykład użycia:
prompt('skopiuj kod HTML', htmlspecialchars(prompt('podaj kod HTML')));

poniedziałek, 21 stycznia 2013

Binary - operacje na bitach

Funkcja upraszczająca operacje na bitach w JavaScript.
var Binary = function(val){
  val = val || 0;

  return {
    value: function(v){
      if( typeof v === 'undefined' )
        return val;
      val = v;
    },
    bit: function(n, v){
      if( typeof v === 'undefined' )
        return val & (1<<n) ? 1 : 0;
      if( v ){
        val |= 1<<n;
      }else{
        val &= ~(1<<n);
      }
    },
    toString: function(){
      return val.toString(2);
    }
  };
};
Warto pamiętać, że operacje bitowe w JavaScript są powolne, ponieważ JavaScript przechowuje wszystkie liczby (Number) jako double. W związku z tym każda operacja bitowa (przesunięcie bitowe, suma bitowa czy iloczyn bitowy) wymusza konwersję double na int.
// utworz nowa wartosc 5
var b = new Binary(5);
// odczytaj drugi bit
console.log(b.bit(2));
// ustaw pierwszy bit na 1
b.bit(1, true);
// odczytaj wartosc liczbowa
console.log(b.value());

sobota, 5 stycznia 2013

getForm oraz getFormInputs

Dwie przydatne funkcje przy sprawdzaniu pól formularza na stronie. Pierwsza funkcja getForm wyszukuje formularz zawierający podany jako argument element.
var getForm = function(htmlObj){
  return htmlObj.form || (function callee(o){
    return o.tagName === 'FORM' ? o : o.parentNode && callee(o.parentNode);
  })(htmlObj);
};
Kolejna funkcja getFormInputs znajduje wszystkie pola wysyłane do serwera. Zwraca obiekt z kluczami zawierającymi name pola oraz im odpowiadającymi wartościami zawierającymi value pola.
var getFormInputs = function(form){
  var res = {};
  [].concat(
    [].slice.call(document.getElementsByTagName('textarea')),
    [].slice.call(document.getElementsByTagName('input'))
  ).map(function(obj){
    if( typeof obj.name !== 'undefined' ){
      res[obj.name] = obj.value;
    }
  });
  return res;
};