1. JavaScript / Говнокод #11297

    +162

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    try {
    	chrome.tabs.update(tabInfo.tabId, {"active" : true}); // chrome 15+
    } catch (e) {
    	chrome.tabs.update(tabInfo.tabId, {"selected" : true}); // older
    }

    Это ни капли не говнокод. Это - результат breaking changes в chrome.tabs API, про которое нигде не написали и из-за которого ваши расширения для Chrome, использующие chrome.tabs API могут запросто не работать в относительно старых версиях Chrome. При том, что заявлена поддержка Chrome 9+. Из-за такого странного подхода приходится городить такие конструкции, которые выглядят как непонятный говнокод для непосвященных людей.

    Запостил: 1999, 25 Июня 2012

    Комментарии (54) RSS

    • Хром в последнее время расстраивает, а ФФ - крут.
      Ответить
      • ФФ всё так же тормозит... Лично у меня на рабочем компе он стоит только из-за селениум иде и потому что он входит список поддерживаемых браузеров на любом проекте. :)
        У него, кстати, тоже бывают странные глюки с JS, про которые даже консоль молчит... Т.е. ИЕ говорит ошибку, хром говорит ошибку, а ФФ молча ничего не делает. :)
        Ответить
        • У Хрома шрифты не настраиваются. И поэтому читать текст набранный всякими придурками с использованием шрифтов для которых Хром не может найти нормальный аналог без сглаживания просто отвратительно.

          Это как бы не совсем проблема браузера, но все равно не приятно.
          Ответить
      • Ололо.
        >Сотрудники Mozilla Foundation сообщили, что объем кода в Firefox стал слишком большим для работы в 32-разрядной версии Windows. По их словам, проблема заключается в наличии всего 3 Гб максимального виртуального адресного пространства в операционной системе. Один из разработчиков Mozilla Кайл Хьюи (Kyle Huey) отметил: «Похоже на то, что компилятор не работает из-за недостатка виртуального адресного пространства во время фазы оптимизации».
        http://blogerator.ru/page/firefox-suxx
        Ответить
        • А разбить на модули, нэ?
          Ответить
        • > Один из разработчиков Mozilla Кал Хуя
          Ответить
        • Компилятор работает. В 3 Гб не влезает линкер, ибо он 32-битный. Аналогичная проблема гораздо раньше возникла у Хрома.
          Ответить
      • зато в ff есть туева хуча аддонов (в т.ч. и для для параноиков) и отсутствуют гуглозонты
        Ответить
    • показать все, что скрытоговносайт
      Ответить
    • Война браузеров на моём уютненьком говнокодике? Как-то это тоскливо.
      Ответить
      • Такого ещё не было
        Ответить
        • А на паскале есть браузер?
          Ответить
          • Не знаю, но стандартный компонент в Дельфи есть.
            Ответить
            • "Стандартный" или обёртка над ослом?
              Ответить
              • Всяко обертка над ослом. Вебкит тогда еще под столом ползал...
                Ответить
              • Ну а над чем же еще. По дефолту в окнах больше ничего нету.
                Ответить
              • Да наверняка обёртка.
                Ответить
                • Если мы про TWebBrowser/TCppWebBrowser, то это однозначно COM-объект iexplore.
                  Ответить
            • Там еще были стандартные компоненты "Ворд" и "Эксель" ;)
              Ответить
    • А
      chrome.tabs.update(tabInfo.tabId, {
      	"active" : true, // chrome 15+
      	"selected" : true // older
      });
      не работает?
      Ответить
      • Возможно, при попытке установить свойство "active" старый хром выдает исключение. Поэтому ОП и использует try.
        Ответить
      • К сожалению нет - выбрасывает исключение в старых версиях Chrome
        Ответить
        • А если в другом порядке?
          try {
          	chrome.tabs.update(tabInfo.tabId, {
          		"selected" : true, // older
          		"active" : true // chrome 15+
          	});
          }
          catch(e) {
          }
          ?

          Но с API, конечно, фейл, да.
          Ответить
          • А это смотрится еще хуже чем код 1999.
            Ответить
            • Да это уже больше интерес, насколько там (не)продуманы последствия от изменений API. :)

              Впрочем, еще остается небольшой шанс, что с другим порядком заработает без try/catch.
              Ответить
              • Я не буду проверять - нет смысла. Внутри нативного биндинга Chromium просто проверяются ключи объекта tabProperties, который передается вторым параметром. И если там есть неизвестный ключ (например, active), то просто выкидывается исключение. Порядок тут вряд ли имеет значение.
                Ответить
          • В каком порядке? Это ж хеш таблица...
            Ответить
            • Недавно как раз разбирался, можно ли опираться на порядок обхода ключей в QtScript (аля EcmaScript с небольшими дополнениями). Де юре - порядка нет, де факто - для строковых ключей порядок при обходе соблюдается, для числовых - нет.

              Вот здесь есть хороший холивар на эту тему:
              http://code.google.com/p/v8/issues/detail?id=164

              Как раз о том, что многие считают искажение порядка (даже для числовых индексов, при сохранении порядка индексов строковых!) багом. Несмотря на то, что в спецификациях EcmaScript явно сказано, что ни о каком порядке не может быть речи: "The mechanics and order of enumerating the properties (step 6.a in the first algorithm, step 7.a in the second) is not specified".
              Ответить
              • Мало ли как сделали... во флеше, в AS2 порядок по-факту оставался тот же, но если ключи удалялись в время перебора их в цикле, то мог нарушиться (т.как на время цикла вся таблица дублировалась...) В AS3 это изменяли и работало по-разному в разных версиях. Вобщем, смысл в том, что не нужно опираться на то как оно случайно могло получиться, если сказали, что не объязательно - почти наверняка была причина.
                Ну и всякие такие штуки типа object[100] = 100; object["100"] = 100 - и каким по счету станет ключ - хз.
                Ответить
                • Да я то как раз на стороне неупорядоченности, и с вами и стандартом полностью согласен.
                  Ответить
            • Года этак четыре назад мне нужно было сохранение порядка (потому как проверка на key in obj быстрее, чем поиск по массиву из этих key, в котором порядок уже гарантирован), так порядка не было только в каком-то старом IE – что-то типа 5.5 или 5.0.
              Но на всякий случай все равно делалась простая проверка на порядок числовых ключей, и если она не проходила, перезаписывались методы для работы с «очередью».

              Но вообще, мне кажется, что с сохранением порядка должно быть быстрее – не надо ничего сортировать. Там же некий список свойств, по идее – знай себе, добавляй в конец.
              Ответить
              • При реализации с сохранением порядка или придется держать отдельный список для перебора по порядку, или придется забить на хеши, после чего производительность просядет еще больше.

                Сортировка при обходе, имхо, меньше зло, нежели деградация скорости доступа ко всем хешам, массивам и свойствам объектов.

                Хотя хз как оно там в браузерах...
                Ответить
              • red-black tree
                Ответить
                • Где?
                  Ответить
                  • Если нужно сохранение порядка И быстрый доступ к элементам.
                    По сути то же дает отсортированный массив. При добавлении элемента ищем за O(log(n)) куда его поместить, чтобы всё осталось сортированным.
                    Ответить
                    • Стоп. Но RBT же не сохраняет порядок вставок... Оно поддерживает упорядоченность по некоторому ключу. А anonimb84a2f6fd141, имхо, хочет чтобы элементы обходились в том порядке, в котором они помещены в список, но при этом еще и был быстрый поиск элемента по его ключу.
                      Ответить
                      • А. Чёто я не вчитался.
                        Ну тогда как указано выше
                        >При реализации с сохранением порядка или придется держать отдельный список для перебора по порядку
                        Ответить
    • stable_api_nonsense.js
      Ответить

    Добавить комментарий