From acb70dcac7114e82ec64f64b16df848deafe49a9 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Tue, 24 Feb 2015 16:16:11 +0100 Subject: [PATCH 1/8] First stab at changing favicon based on build or job state --- app/controllers/build.coffee | 4 ++++ app/controllers/job.coffee | 4 ++++ app/mixins/build-favicon.coffee | 36 +++++++++++++++++++++++++++++ app/routes/abstract-builds.coffee | 2 ++ app/routes/application.coffee | 3 ++- app/routes/build.coffee | 1 + app/routes/main-tab.coffee | 2 ++ app/routes/pull-requests.coffee | 1 + app/routes/repo/index.coffee | 2 ++ app/utils/favicon-manager.coffee | 38 +++++++++++++++++++++++++++++++ 10 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 app/mixins/build-favicon.coffee create mode 100644 app/utils/favicon-manager.coffee diff --git a/app/controllers/build.coffee b/app/controllers/build.coffee index 91c14983..6ce36f33 100644 --- a/app/controllers/build.coffee +++ b/app/controllers/build.coffee @@ -23,4 +23,8 @@ Controller = Ember.Controller.extend GithubUrlPropertievs, gravatarImage(@get('commit.authorEmail'), 40) ).property('commit.authorEmail') + buildStateDidChange: (-> + @send('faviconStateDidChange', @get('build.state')) + ).observes('build.state') + `export default Controller` diff --git a/app/controllers/job.coffee b/app/controllers/job.coffee index f05e44ad..f262a0e4 100644 --- a/app/controllers/job.coffee +++ b/app/controllers/job.coffee @@ -16,4 +16,8 @@ Controller = Ember.Controller.extend githubCommit(@get('repo.slug'), @get('commit.sha')) ).property('repo.slug', 'commit.sha') + jobStateDidChange: (-> + @send('faviconStateDidChange', @get('job.state')) + ).observes('job.state') + `export default Controller` diff --git a/app/mixins/build-favicon.coffee b/app/mixins/build-favicon.coffee new file mode 100644 index 00000000..47e5701a --- /dev/null +++ b/app/mixins/build-favicon.coffee @@ -0,0 +1,36 @@ +`import Ember from 'ember'` +`import { colorForState } from 'travis/utils/helpers'` +`import FaviconManager from 'travis/utils/favicon-manager'` + +Mixin = Ember.Mixin.create + actions: + faviconStateDidChange: (state) -> + if state + @setFaviconForState(state) + else + @setDefault() + + init: -> + @faviconManager = new FaviconManager() + + @_super.apply this, arguments + + setFaviconForState: (state) -> + color = colorForState(state) + + images = { + red: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP4z8DwHwAFAAH/VscvDQAAAABJRU5ErkJggg==', + yellow: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP4/5ThPwAHrwLktvrIVgAAAABJRU5ErkJggg==', + green: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mOwv276HwAE7wJLzZ3V0gAAAABJRU5ErkJggg==', + gray: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mMoqyj7DwAFMAJkMSbkxgAAAABJRU5ErkJggg==' + } + + @setFavicon(images[color]) + + setDefault: -> + @setFavicon('data:image/png;base64,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') + + setFavicon: (href) -> + @faviconManager.setFavicon(href) + +`export default Mixin` diff --git a/app/routes/abstract-builds.coffee b/app/routes/abstract-builds.coffee index 1fc355ba..1a79b7ec 100644 --- a/app/routes/abstract-builds.coffee +++ b/app/routes/abstract-builds.coffee @@ -15,6 +15,8 @@ Route = TravisRoute.extend deactivate: -> @controllerFor('repo').removeObserver(@get('path'), this, 'contentDidChange') + @_super.apply(this, arguments) + contentDidChange: -> path = @get('path') @controllerFor('builds').set('model', @controllerFor('repo').get(path)) diff --git a/app/routes/application.coffee b/app/routes/application.coffee index 2e17f470..c46573fe 100644 --- a/app/routes/application.coffee +++ b/app/routes/application.coffee @@ -1,7 +1,8 @@ `import TravisRoute from 'travis/routes/basic'` `import config from 'travis/config/environment'` +`import BuildFaviconMixin from 'travis/mixins/build-favicon'` -Route = TravisRoute.extend +Route = TravisRoute.extend BuildFaviconMixin, needsAuth: false renderTemplate: -> diff --git a/app/routes/build.coffee b/app/routes/build.coffee index a1227588..2703be70 100644 --- a/app/routes/build.coffee +++ b/app/routes/build.coffee @@ -22,6 +22,7 @@ Route = TravisRoute.extend @store.find('build', params.build_id) deactivate: -> + @_super.apply(this, arguments) @controllerFor('job').set('job', null) @controllerFor('build').set('build', null) diff --git a/app/routes/main-tab.coffee b/app/routes/main-tab.coffee index d35a328a..bbc1d4da 100644 --- a/app/routes/main-tab.coffee +++ b/app/routes/main-tab.coffee @@ -17,6 +17,8 @@ Route = TravisRoute.extend deactivate: -> @controllerFor('repos').removeObserver('firstObject', this, 'currentRepoDidChange') + @_super.apply(this, arguments) + currentRepoDidChange: -> if repo = @controllerFor('repos').get('firstObject') @controllerFor('repo').set('repo', repo) diff --git a/app/routes/pull-requests.coffee b/app/routes/pull-requests.coffee index 121aa633..4253f7c0 100644 --- a/app/routes/pull-requests.coffee +++ b/app/routes/pull-requests.coffee @@ -10,6 +10,7 @@ Route = AbstractBuildsRoute.extend( this.controllerFor('builds').set('isPullRequestsList', true) deactivate: -> + @_super.apply(this, arguments) this.controllerFor('builds').set('isPullRequestsList', false) ) diff --git a/app/routes/repo/index.coffee b/app/routes/repo/index.coffee index 348425cf..0715b315 100644 --- a/app/routes/repo/index.coffee +++ b/app/routes/repo/index.coffee @@ -16,4 +16,6 @@ Route = TravisRoute.extend @controllerFor('build').set('build', null) @controllerFor('job').set('job', null) + @_super.apply(this, arguments) + `export default Route` diff --git a/app/utils/favicon-manager.coffee b/app/utils/favicon-manager.coffee new file mode 100644 index 00000000..47b90619 --- /dev/null +++ b/app/utils/favicon-manager.coffee @@ -0,0 +1,38 @@ +`import Ember from 'ember'` + +manager = (headTag) -> + @headTag = headTag if headTag + + return this + +manager.prototype.getHeadTag = -> + @headTag || document.getElementsByTagName('head')[0] + +manager.prototype.setFavicon = (href) -> + link = @getLinkTag() + + if !link + oldLink = link + link = @createLinkTag() + head = @getHeadTag() + head.appendChild(link) + + link.setAttribute('href', href) + + if oldLink + head.removeChild(oldLink) + +manager.prototype.getLinkTag = -> + links = document.getElementsByTagName('head')[0].getElementsByTagName('link') + if links.length + for link in links + if link.getAttribute('rel').trim() == 'icon' + return link + +manager.prototype.createLinkTag = -> + link = document.createElement('link') + link.setAttribute('rel', 'icon') + link.setAttribute('type', 'image/png') + document.getElementsByTagName('head')[0].appendChild(link) + +`export default manager` From e8ad4824340a17b5d1b4e7a4104ab885fea32222 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Tue, 24 Feb 2015 16:51:35 +0100 Subject: [PATCH 2/8] Make favicon work properly when viewing job Current implementation of controllers makes it hard to implement favicon changes outside of build/job controllers. The problem is that if a job is viewed, both controller are populated, which means they will both send state change events to change favicon. This commit adds a check for build controller, which allows to disable state change events when we're viewing a job --- app/controllers/build.coffee | 4 +++- app/routes/job.coffee | 13 ++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/app/controllers/build.coffee b/app/controllers/build.coffee index 6ce36f33..1f86f62c 100644 --- a/app/controllers/build.coffee +++ b/app/controllers/build.coffee @@ -8,6 +8,7 @@ Controller = Ember.Controller.extend GithubUrlPropertievs, commitBinding: 'build.commit' currentUserBinding: 'controllers.repo.currentUser' tabBinding: 'controllers.repo.tab' + sendFaviconStateChanges: true currentItemBinding: 'build' @@ -24,7 +25,8 @@ Controller = Ember.Controller.extend GithubUrlPropertievs, ).property('commit.authorEmail') buildStateDidChange: (-> - @send('faviconStateDidChange', @get('build.state')) + if @get('sendFaviconStateChanges') + @send('faviconStateDidChange', @get('build.state')) ).observes('build.state') `export default Controller` diff --git a/app/routes/job.coffee b/app/routes/job.coffee index f5b39c25..e207df5f 100644 --- a/app/routes/job.coffee +++ b/app/routes/job.coffee @@ -20,13 +20,24 @@ Route = TravisRoute.extend if build = model.get('build') build = @store.recordForId('build', build.get('id')) - @controllerFor('build').set('build', build) + buildController = @controllerFor('build') + + # this is a hack to not set favicon changes from build + # controller while we're viewing job, this should go away + # after refactoring of controllers + buildController.set('sendFaviconStateChanges', false) + + buildController.set('build', build) model: (params) -> @store.find('job', params.job_id) deactivate: -> + buildController = @controllerFor('build') + buildController.set('sendFaviconStateChanges', true) @controllerFor('build').set('build', null) @controllerFor('job').set('job', null) + @_super.apply(this, arguments) + `export default Route` From 6bb53716a91a993d868de0ac31d327e0549ba2cc Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Wed, 25 Feb 2015 12:55:19 +0100 Subject: [PATCH 3/8] Add proper favicon data uris --- app/mixins/build-favicon.coffee | 12 +++--------- app/utils/favicon-data-uris.coffee | 12 ++++++++++++ 2 files changed, 15 insertions(+), 9 deletions(-) create mode 100644 app/utils/favicon-data-uris.coffee diff --git a/app/mixins/build-favicon.coffee b/app/mixins/build-favicon.coffee index 47e5701a..1d7bbed2 100644 --- a/app/mixins/build-favicon.coffee +++ b/app/mixins/build-favicon.coffee @@ -1,6 +1,7 @@ `import Ember from 'ember'` `import { colorForState } from 'travis/utils/helpers'` `import FaviconManager from 'travis/utils/favicon-manager'` +`import getFaviconUri from 'travis/utils/favicon-data-uris'` Mixin = Ember.Mixin.create actions: @@ -18,17 +19,10 @@ Mixin = Ember.Mixin.create setFaviconForState: (state) -> color = colorForState(state) - images = { - red: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP4z8DwHwAFAAH/VscvDQAAAABJRU5ErkJggg==', - yellow: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP4/5ThPwAHrwLktvrIVgAAAABJRU5ErkJggg==', - green: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mOwv276HwAE7wJLzZ3V0gAAAABJRU5ErkJggg==', - gray: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mMoqyj7DwAFMAJkMSbkxgAAAABJRU5ErkJggg==' - } - - @setFavicon(images[color]) + @setFavicon(getFaviconUri(color)) setDefault: -> - @setFavicon('data:image/png;base64,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') + @setFavicon(getFaviconUri('default')) setFavicon: (href) -> @faviconManager.setFavicon(href) diff --git a/app/utils/favicon-data-uris.coffee b/app/utils/favicon-data-uris.coffee new file mode 100644 index 00000000..c502e207 --- /dev/null +++ b/app/utils/favicon-data-uris.coffee @@ -0,0 +1,12 @@ +uris = { + default: 'data:image/png;base64,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' + red: 'data:image/png;base64,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' + gray: 'data:image/png;base64,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' + green: 'data:image/png;base64,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' + yellow: 'data:image/png;base64,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' +} + +uriForState = (type) -> + uris[type] + +`export default uriForState` From c20f5bb61a7fde5968dcbabb8be916623aec033e Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Wed, 25 Feb 2015 13:48:41 +0100 Subject: [PATCH 4/8] Add some tests for favicon manager and refactor it --- app/utils/favicon-manager.coffee | 22 ++++----- tests/unit/utils/favicon-manager-test.coffee | 51 ++++++++++++++++++++ 2 files changed, 60 insertions(+), 13 deletions(-) create mode 100644 tests/unit/utils/favicon-manager-test.coffee diff --git a/app/utils/favicon-manager.coffee b/app/utils/favicon-manager.coffee index 47b90619..90eaa4ff 100644 --- a/app/utils/favicon-manager.coffee +++ b/app/utils/favicon-manager.coffee @@ -9,30 +9,26 @@ manager.prototype.getHeadTag = -> @headTag || document.getElementsByTagName('head')[0] manager.prototype.setFavicon = (href) -> - link = @getLinkTag() + head = @getHeadTag() - if !link - oldLink = link - link = @createLinkTag() - head = @getHeadTag() - head.appendChild(link) - - link.setAttribute('href', href) - - if oldLink + if oldLink = @getLinkTag() head.removeChild(oldLink) + link = @createLinkTag() + head.appendChild(link) + link.setAttribute('href', href) + manager.prototype.getLinkTag = -> - links = document.getElementsByTagName('head')[0].getElementsByTagName('link') + links = @getHeadTag().getElementsByTagName('link') if links.length for link in links - if link.getAttribute('rel').trim() == 'icon' + if (link.getAttribute('rel') || '').trim() == 'icon' return link manager.prototype.createLinkTag = -> link = document.createElement('link') link.setAttribute('rel', 'icon') link.setAttribute('type', 'image/png') - document.getElementsByTagName('head')[0].appendChild(link) + @getHeadTag().appendChild(link) `export default manager` diff --git a/tests/unit/utils/favicon-manager-test.coffee b/tests/unit/utils/favicon-manager-test.coffee new file mode 100644 index 00000000..d5013381 --- /dev/null +++ b/tests/unit/utils/favicon-manager-test.coffee @@ -0,0 +1,51 @@ +`import Ember from 'ember'` +`import FaviconManager from 'travis/utils/favicon-manager'` + +manager = null +fakeHead = null + +module("Favicon manager", + beforeEach: -> + fakeHead = $('
').appendTo($('#qunit-fixture')) + manager = new FaviconManager(fakeHead[0]) + afterEach: -> + fakeHead.remove() + manager = null +) + +test 'use tag by default', -> + manager = new FaviconManager() + equal manager.getHeadTag(), $('head')[0] + +test 'set favicon if there is no link tag in head', -> + equal fakeHead.find('link').length, 0, 'there should be no link tags initially' + + manager.setFavicon('foobar') + + link = fakeHead.find('link')[0] + + ok link, 'link tag should be added by favicon manager' + equal link.getAttribute('href'), 'foobar', 'href attribute for the link should be properly set' + equal link.getAttribute('rel'), 'icon', 'rel attribute for the link should be properly set' + equal link.getAttribute('type'), 'image/png', 'type attribute for the link should be properly set' + +test 'replace exisiting link tag', -> + fakeHead.append($('')) + + ok 'foo', fakeHead.find('link').attr('id'), 'initially link should exist' + + manager.setFavicon('foobar') + + links = fakeHead.find('link') + equal links.length, 1, 'there should be only one link in head' + + link = links[0] + + ok !link.getAttribute('id'), 'existing link should be replaced with a new one' + equal link.getAttribute('href'), 'foobar', 'href attribute for the link should be properly set' + equal link.getAttribute('rel'), 'icon', 'rel attribute for the link should be properly set' + equal link.getAttribute('type'), 'image/png', 'type attribute for the link should be properly set' + +test 'find link with rel=icon only', -> + fakeHead.append($('')) + ok !manager.getLinkTag() From b96b776b02c9c7cace62eda2ef63cf82cec1c127 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Wed, 25 Feb 2015 16:55:17 +0100 Subject: [PATCH 5/8] Bump inline images to 0.0.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 498c2e91..e75e0df1 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "ember-cli-htmlbars": "^0.6.0", "ember-cli-ic-ajax": "0.1.1", "ember-cli-inject-live-reload": "^1.3.0", - "ember-cli-inline-images": "^0.0.3", + "ember-cli-inline-images": "^0.0.4", "ember-cli-pretender": "0.3.1", "ember-cli-qunit": "0.3.0", "ember-cli-sauce": "0.0.7", From 8087761c8a62e42640b16cc3097de63a6e42eea0 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Wed, 25 Feb 2015 17:00:19 +0100 Subject: [PATCH 6/8] Generate datauris for favicons automatically rather than hardcoding them --- app/index.html | 1 + app/utils/favicon-data-uris.coffee | 12 ------------ app/utils/favicon-data-uris.js | 13 +++++++++++++ public/cancelled-favicon.ico | Bin 4286 -> 0 bytes public/failed-favicon.ico | Bin 4286 -> 0 bytes public/favicon.ico | Bin 4286 -> 0 bytes public/passed-favicon.ico | Bin 4286 -> 0 bytes public/queued-favicon.ico | Bin 4286 -> 0 bytes 8 files changed, 14 insertions(+), 12 deletions(-) delete mode 100644 app/utils/favicon-data-uris.coffee create mode 100644 app/utils/favicon-data-uris.js delete mode 100644 public/cancelled-favicon.ico delete mode 100644 public/failed-favicon.ico delete mode 100644 public/favicon.ico delete mode 100644 public/passed-favicon.ico delete mode 100644 public/queued-favicon.ico diff --git a/app/index.html b/app/index.html index 7d63a71d..c6a62dfc 100644 --- a/app/index.html +++ b/app/index.html @@ -6,6 +6,7 @@ {{title}} + {{content-for 'head'}} diff --git a/app/utils/favicon-data-uris.coffee b/app/utils/favicon-data-uris.coffee deleted file mode 100644 index c502e207..00000000 --- a/app/utils/favicon-data-uris.coffee +++ /dev/null @@ -1,12 +0,0 @@ -uris = { - default: 'data:image/png;base64,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' - red: 'data:image/png;base64,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' - gray: 'data:image/png;base64,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' - green: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAC7lBMVEUAAACNzaJ0wY5VtHWLzaCGyJxbt3pat3mHyp0AAAB5xZJ5w5FzwY1ywIuBxpiByJh/w5BCrWVBrGSHyp15w5B3xJBPsnBOsW9/v3+Ax5hYtXdZt3iUzaSPzaWZzKaDyZllvIJLsGyEyZt1wI1pvYViun9wv4xHr2lErGYAVVVhuX51wo+QzKZMsG1ct3p7xZOBx5iSzKiX0aKSzaSPzqRZtnhvv4p2w5Biu39TtHKMy6KR0KVHr2lvwImOzaOIyp6FyZuAyJdku4CCyJmSzqZ4xJFLsW1DrWZduHuHy6GHyZ1mu4FArGRDrWZmu4KHyZw9q2E4qV06ql9jvICMzaGe1bA6ql5Ermeg1rHm9Ora7+Hh8udvwYns9/D///9zwo1buHpzw418xpT7/fxpvoVPs29ywox9x5WHy51duXtQs3H9/v1cuXr4/PlBrWRgun1BrWX5/PrN6db+//7k9OnC5c2s27yZ06xFr2hzw46l2Lbj8+hMsm5Hr2nS69p9x5ZlvYJ0w45Nsm5JsGt6xpPK6NTr9+/c8OJRtHFhu3/J6NPo9e3L6NR7xpRKsWxTtHPL6dWOzqPB5MzI6NJ4xJFStHI8q2DW7d7E5s/8/vz9/v7m9Ou64ceo2rib1K6EyZp5xZKByZma1K3M6da54cau3L2CyZk+rGKt3Ly44MU5qV5ovoSGy52o2bi+48ro9ezz+vW34MWg1rLe8eT6/ftkvIHv+PKV0and8OTU7NxTtXO948rk8+mY0qu138PF5tCw3b/G5tFhu35UtXSKzKDx+fR6xZLg8ubt9/D1+/f2+/dArGN/yJex3b+W0alMsW1nvYOd1a+z3sFStHNPs3BXtnaX0qtfun05qV3w+fO64cad1bC74sir27qAyJdZt3i54MWT0KfI59KJzJ9LsWyj17TV7d3P6tia063b7+LH59Ga06w/rGO038LT7NtmvYLn9eu/48t1w49Yt3c8q2F4xZE7ql+LzKCY06s+q2I5Da3uAAAAUHRSTlMAYM/2YV3y8mABubzK0JqeHv7+Irm69vcEqfT0PlIUod33m16sGlD8/QPsyjz66LSkIxY4VPnYxu3+aEH+12GDlqfdmT/D/PzuMX/m/v7jd2CHTsIAAAABYktHRF4E1mG7AAAAB3RJTUUH3wIXCgcI1L+jPwAAAodJREFUOMutk2VU1EEUxREs7BYUsDuxA7ubSywYPImVZZdw2SUURVQwEARFQVowiF0QlAUUsQUbEUXFbsXCjm8O/4VlF/WD53g/zcz9nfPmvjejpfUPqqOtYwqY6mjX/aNdrz7MzC0sLS3MzdCg4W+2biOelfXCRZwWW1vxGuvWAppgiQ0tBSdbsrFDU02/GewdiPjLHAVOfKGIyFmA5up+i5YursQAN4iWQ8wAche2aq0GtIFE6uHp5S1cIRK6CVf6eK4iCdqqAe1W2/my4mvITyRcS35s6btufftqV0+/A+Af4LNhI23C5kBskQYF+2wNATrq63GAAUIF26RUKQn8tiOMW0p37AyHAQcYRihdpl2VKSOrd9IIQyWAKLaLjpHExsXvTkhI3BMXuzcmmh1FwbCqxL79SS7J0JCpbVJKalUJIxkglqelH5BkZDqzHmVmHDyU7iQXAzIjZYxOnZFFpBBm51CQZe5hUvDDjzAwr0vX6qDdcJQlkOXFKlg4f4d84BhRBrqr+tQD8UTHgRNhOJmKU66nz5wtoBT0rOlkr0Kic+cvUKHY9eKly1xGhbx3nxqgb/IVKogskpslEtnjanHitZLr6Kc2i/4DcINlK03zIPK4GXDLCrg9UOM9DEJgUWTZnbte9+4/eCjIobJHGGxgrLKHDB0Ga5I+5lokzpaFeD15iuEYoQJGYtToZ8/lCMjJf5EVTS9Dld0cowLGmlTu17+KrpqSovx1yRuMU7vC+LfwLuc8G/47DnlfamKsfskJvAp3NtEPwQGA48fcYvaBJmo+60mo+PT5Cyv0Nf4bm+XkKVNr/5xpvOkzYFr8/UfCT8yc9ZfPOXvOXGDe/AVa/1W/ANqKEiJ0e/INAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTAyLTIzVDEwOjA3OjA4KzAxOjAwTDBZxgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0wMi0yM1QxMDowNzowOCswMTowMD1t4XoAAAAASUVORK5CYII=' - yellow: 'data:image/png;base64,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' -} - -uriForState = (type) -> - uris[type] - -`export default uriForState` diff --git a/app/utils/favicon-data-uris.js b/app/utils/favicon-data-uris.js new file mode 100644 index 00000000..088a1937 --- /dev/null +++ b/app/utils/favicon-data-uris.js @@ -0,0 +1,13 @@ +var __inlineImageDataUri__ = function() {}; // in case image inliner doesn't run + +var uris = { + default: __inlineImageDataUri__('favicon.png'), + red: __inlineImageDataUri__('favicon-red.png'), + gray: __inlineImageDataUri__('favicon-gray.png'), + green: __inlineImageDataUri__('favicon-green.png'), + yellow: __inlineImageDataUri__('favicon-yellow.png') +}; + +export default function(type) { + return uris[type] || uris.default; +} diff --git a/public/cancelled-favicon.ico b/public/cancelled-favicon.ico deleted file mode 100644 index e82838faa3133d21c40afd94bade8787329fa91c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 zcmeHKNl#l>6n?0cvZ<6Vs%$~+rrYkiXq$H1Wz}t^X4Rh%AOu601BAg8FoeNi0ycKd z3^t??0SRUbDL9Y>lM=>6Od`yKPtSMS`(&sMCh4*l-S@8VaK1Bs_n~PK{1+9aaf{OG zKGw7=Jo;RIY1+5^=2d=ji<0O6kN5C^!%=T2Ec|ux=FK>Nbo6yXHyGmmJU7Q{*WW{Q z(4*DW=DwJiXi7;*K4P3B;N7?pOU1=S)X?B0m#c#;mTHQNyCJ&d=H{$5Hrl@kD(r%j zb#-;Mz$+>$B(vE}ckW~hwz3=V>gsCh?Chl2*cicA`msNJHk-}V)YNqKg0QmP>2xH) zZeSlC9+GN)zn|9E*JyhB1=ZA8bj*s1a+;VJr}p+X@eO>W^t9V;g%{DGsj1-_$5+m~ z-7Z>MT2$~S-kY17R8nH1;o;#E^Z0RebVReWvy`2kMYnDx_}kjrJ_|>OmX?<9uwUt} z-l?f6>}NN@{<9i<1%01AdqzV;L*#b5#g4moODDs@=Qw+SX*3#FZ{N=FbKX%;PY?UF zSmeOxTU%SSva&+2UcI8%uV3pry?i-Cd`9=X(p|mTufLq9gUjW*(%9JeWpi`$k2u%e z{kxb8yW84YgUXJNze${LgnUU(PNGMT9*X@=r&IQG-tI$IS=rsG^YGQW#bRl}nSz1> z>gZ^v$;nCD-rlCMu`#-Tze_NlJb6M7ANG^gS|_zpTYFD@1BKOI$lyA%w6?Z>6K)Q0 z&3wgvKfu}a^t2N;BcB`&JFTv+>S=&6cmT1<&(EiX1jC6l%n8fNu5jK31;!Qd$>89i zV89mG4?iFeQ0q3ERmZ<~uSW2YE8r!pb#-+~{;7OGUWJ2=JuK(2s;Wwt|K`mbdi(Y* z?d|Q!9LI(b^Miu}+TY(N)GA^Stf3yjAxTMzN8#WzXMKb`;yTpDjf@QI{+ybcBCmHs zeh&_M=<(xG8Dk#$uC=MySqcj$Hz*%j4_9`(a}-%cek8zI2H*m7DGRf)ujddTVg@pxDaRAn7e9ny@^73+Zn*s;mKKKy#4fq!KipS%j2M>Cr zBUdnoI>8>)M5ucLHUKLazR6S^2pe)dH#he$pCJFkX}Fhz;ln5J8R{5uM$Uz5Sce_p zTaKlSQInw>{4p^x!Tet)d%3p1K5f6jVEE8#t+n!9u?5-C1$R4YA3j&y1B|7mC6SYn zkuLR){m-927kCvb?D2R8`qI%ER_Sf}v=e>3OrAQrv7z0Bu%au(;o>ng6WJv}|0 z>oQmP4dDI#efnP1TWM(tbGS$D~Ag)Srq0Fu`SOYpcTRz)Va`(D6}U zn6umK#aFw#ySkn@2i=+f-DhD2t}(wyvP^$RM~C<{@Bw~N_Z#dt8uLXybinV^&1|m3 zUEyc$`!o>ayfJfO3G~Lj7ubN0I~d=ahygeTbKu9*_=q25@cmzY9$v8Z%F2pC@epdES4%4bij8I_yu*axVR9s<8Ht=A^0C> z_{>{H z@3_ER^K)fo_iNZtq1BX_v^aX~Z8&SJC%0Epmf9 j&s`3j!~8$}@}HV^DO6Yc)LE8eAeK)(AMgjnWr6++mk+~^ diff --git a/public/failed-favicon.ico b/public/failed-favicon.ico deleted file mode 100644 index 81497d5376d979aa0305f5961303e4949bcce87d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 zcmeHKSx}Q#6#kud#+T06hmMbxXhf9^_yp6w}KKy^e>MUnZ^*n~DpnxpAwIQ_sIKSfP>ADd|Nb}KdQwUMG&q6r_U zxh)H`^|q?5mbW7+8z!-&QalR0yp<+e_nAoZm+EQU&R$(BmBDXdd%b>=hmS4IVjtbO>86b(689OltWk(`;b$l9Z0_K( zfeo^aWm}}i;n+~S!;)PVf1eKvad*ek<7^K9?vr~K6>I(4S|89H8i`~39hZ4b>~ zqNgb{HU5TX>CI?ts8?ANz%Sb_Kc~&rQuBTr!T-UAx7W|@y>i`6-~Hg=GSIPVz3E;w z_yvXLE8x$}H+0O-(D{>6wRGsHotCXK@pvNUo%Vjx8++;YJrA{MdV@CI`lE+tr|W`o zmu;7yTkEC#p=@Ys5=S>QietB{EOQ}u;BY5**U$W}Z|aDsJ1$8>IV+6xF3Xq1*;+b& zvWu?Xa8q@ymGdvi)On$6)q3Ooq44GX!cx;|$YkalNwwQXzg%^Zy~{@}=elX{!A_3R zdcjG@zUd-mg@w{sZ4_<_#0Ca~_w0||9A8-}9Qt5q$#c}bz@It)*?1zK zDr&4`F!cq~0PDs*HeL^l^9(d`nkE=0#3Um}C(3?B^UPeXZ%02ldD_7-x*R_4KjMHq z7(20zN-8Zu{KC>e9VXAw^4h~5Vubul$rB^USU#3=`zdGd`fUvqPNmM%9^>Owv1&FzG^VSK@I7_#*$Y1~jY)bF$; zgZFEe!}7R!tB2=yDvM?7c_;S?c@93zsVQ3OWBmp-DbsK+$m2Iwm!Ox|h&u+uFR7Le zt|>6z0Wa!D9_VF@at*Af8+q-6E=qm0?@%Z2w~y6<{)kwkAEvM#aQm)D7H8kc&(DX& zc{=;1YRjHTHZ(UIUqi0S_Qxh_c&;JWj~?%$^A}x&IG7o(quWQmKxjDz)}UeUOlvof zH)JZeTDcD7imVqHzzVkk^$8x6xsQKi#JPNnmHQ&g4)-}LO-E&$t%N>t_r8bjJ@9fn zfEA9vT_vT)Cu@Q+3tgc1A%-|_G^`f>y5k|_9{MsSas_7%_P_&P$V3_m3YO7U=l-fc5oX1NDNqyI4;` zO?>;kgV%$s54wQ?tnm1UzRyV0x-)VNbo@jYuQ^$M0=v_Ap4^4t`%IQ!3mG5!8%E1H zC$|gy$n)HlMxGlu6QfpgcFGZT2 zb|2?S&oU5X6vg5>hBG2ctO41|HcN{$vULvlJ88Ox>KZ%veFS|76TPRN(I&H;1W$UF z&QZ0^k~yHl=iJ!VV98v&(R6F>BAt7D$p1lDgND7DI!o4bs{c>Kg1PM(LnMqOzaS91 sD8*rV1YwMwO-36PN(24L9HkM2kpoScPnKnRl*IJY#h2Ixc@&5K2h4h_bpQYW diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index acb338dc38cd0f33ab36f4c032d84c478c1dcd91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 zcmeHKdrVVj6t6Qg+hXS8qRTd3$&}X=%A+kVX1ckVsWH*X1_%lYh!0eB4jo2{fI3H} zf;>eYeHSQ0%d0?J-clxtK#OA{>IS-HS>k_l&iUK-UA@gMwiWi*{@88K{mysJ`F_81 z&iCDWQyy;y`FVKo$mPLPzsBRuCz>}ije6_E-x2pB$v~kzUUnliW_f3 zd1(S`*Xe9>^zl$UUbIko&C6Au>G`(I|G9*mfQ4^LeZ1Y|zmTo^on)djBdmGkE1&CaeG*`1Qrk59u|;P0ij%i-g$v}>Q7gSV^v4v#0E z<&>D?%xg8zR+;Yp%I>ecYXToE(@u%Y$6bMsR@5Riyamw-?O460u9@`UqNj^2jzi&8 zRrQSTV7b|`uyzbWa`w2j1^8Cl%=tbQ$S5#d&m~<;o|7@LSp33*x$;+?l5(7+_CB>~ zoZ#HG!76FKgS4}Q$SmqdTB#A~5(AEx_hDyp4|5I*v|~2$Z0^e5@eeuh4poV9G)&rY zv*4W8gv6aYu{~}pl2cM~Jhu$_nl>o9ZZr6K^#dq1-hiaz7EV@lLH5*6YK63Q1V!2& zv}+M83Rr+{GdBQ-`W|+;TEcf?WymsM5Be^V%qCbnPfSFG1ST49329 z&u-)>8m)Co48z!eAQ`*1Z^MrGSnN+qLTaiQS>K*UdU__3_U=VV!&Q{(uRoSI+;F%D zr!M{cGVND!-Km9i!N`WwTuzHXquPZ84i5@3_h2kbLMcl-2c4*Q6ayM>gr1(loKuE;%vM zXD+|G{l@-%Nj6w@ZI_W-qD1=1Y-k$V8DFaSD30ZnGG`(_CJG%_Z!q?pVmVF~l%Z60 z5nTggR-7|u3vnV(iszlfEfJqbh{-;)wbHSB@D{=%qY)e|z=0GovPX55Ec=I za`gopJ2y|Nhet&tanC;JO%`ih_uv?06&H{YzjeeJx4&BNxg<|Lv3XMjVj@DxS&ze^ zg9n*9&*bEzs6+~>x`ym^9V#yBps6!Fky<@tqv!IxM2XyjVtkWz3aLkqASrPdVxz(t zyvVrN`-FdnqZ|S&J7NOL8xcrkX<;Q+r=CDq!gfSQhB51DPScf*Teo2S!6W!MSAoE? zx`#oU4u{{N;Hu6v%5P5uvL?JoWVuX-73K9KEzFp~Ct;1Zz4GC~tXYt-ZXaY?C&D)Q6zDtFeyw1qSolkk;#9 zMWi1BU)=`2!T`REOPUZsY7ks7L8$AuVhRky>mBj?R+?uCjh1YY z(ef9YgMUQ_xWd{)3>Ju5h9GJlAmiW@o#e}n^{?!-^3ru8!|?BcI`aZY{H&c|r!hRn z>o$1&sxB*@sNT$ccYQon5R_lB+9@YD2R2`k!J;Dd&1N~Ajebo7^F_wt2Xrl8({05I zsJ>+72_fGczpzFuT2l*Aqs40HbNKny-He^~GpNPv=8SW)PiQb_QvM+AWh+0;g{_B< z{&6kv+o-d(arlF3FEc)&!ICo>|9NwdveuVEjKf2u4+y9+F*(rMobr=cw)eDGq~}yd zrrP((IRzMo-ASJ(D5s$D8nYJ^lfTmd|JY_MUR#I78|uN|V?@B0Z4fpOf=`~Y;5u?1 zNG>GyH=+KT=VaXJ%tIRcJqV74TQ}u;cS$vT1FN10zY_dJ18A=(FO4N<{l}@C^{M0% zr0si!Me%}M^}i^@(0UL`2Hj|6ZHw2hFqOt z{MUS7uLte`Zzdj-KPiuRyk+3=+=)(Q8J#~MI{A3c;R>Yv@`k6qjHE NX)}PfnE>S@*FUm$mzMwl diff --git a/public/passed-favicon.ico b/public/passed-favicon.ico deleted file mode 100644 index b43783e2ea208bf3297ed698657b0a8515ad27b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 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 mvM9onX$z8Rpg)-lIuvF8OjGhnS=N(7te Date: Wed, 25 Feb 2015 17:00:55 +0100 Subject: [PATCH 7/8] Set href on favicon tag second time in a timeout This somehow fixes chrome inconsistencies when changing favicon --- app/utils/favicon-manager.coffee | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/utils/favicon-manager.coffee b/app/utils/favicon-manager.coffee index 90eaa4ff..4be9c524 100644 --- a/app/utils/favicon-manager.coffee +++ b/app/utils/favicon-manager.coffee @@ -16,7 +16,11 @@ manager.prototype.setFavicon = (href) -> link = @createLinkTag() head.appendChild(link) + link.setAttribute('href', href) + setTimeout -> + link.setAttribute('href', href) + , 1 manager.prototype.getLinkTag = -> links = @getHeadTag().getElementsByTagName('link') From 32c6ee18d611cc18ee609e3448a7fc23f7ce38bc Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Wed, 25 Feb 2015 17:05:17 +0100 Subject: [PATCH 8/8] Add favicon pngs --- public/images/favicon-gray.png | Bin 0 -> 1633 bytes public/images/favicon-green.png | Bin 0 -> 1748 bytes public/images/favicon-red.png | Bin 0 -> 2213 bytes public/images/favicon-yellow.png | Bin 0 -> 1694 bytes public/images/favicon.png | Bin 0 -> 1928 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/images/favicon-gray.png create mode 100644 public/images/favicon-green.png create mode 100644 public/images/favicon-red.png create mode 100644 public/images/favicon-yellow.png create mode 100644 public/images/favicon.png diff --git a/public/images/favicon-gray.png b/public/images/favicon-gray.png new file mode 100644 index 0000000000000000000000000000000000000000..e33f5dce0ea9e1f5d60ecf89dfb92c1aa76a3b1d GIT binary patch literal 1633 zcmY+DX;f2J5XT=|@gN?pYl~J;3s!}mBuYV)S~MI_I|FNeP)uenB7<7Z=m%bYfy6kw`3LGC?Sh zO3lyD&n1&dxw$kN?cKX~R4Vn!)29puBQGzHLZQUs@y}ypBO@aVXtacvFU!lz%gV~w zY&Kwmd=iNSXoZD^rKP2y1i(QE_v~3zOiW5@DkukOzy&z~3*a0Mhs))HWPr-f$w^5` ziHnafE-3*_Y;<&1b~acuSu8q(0g_*(r2!xyQ1bHuiec=817fCX^F z!o!0@LU1_T`-%#gO!n#1r?Igy>Bo=Yl%SW8(9qP>)amKzm6et8iHXI<#nI8xxVX4h zk!W*s6Z8(S8jXg_;9&fV7oDA*F*uw;p#a105R2E=)>y^GRn^tt z-oa(Hwzksf^fzzcg2|_6WQar}pai8-S;6H}-@HjqP8L*FHZ?bQb#*m1HGLKahr?pA zYHDhRhKG54{>0=YkH>3kYnz#!?H?HEmPmjYfYSJUem<2-NG~-6;&TjgcDf3AikH1^ z%+GsiaRsfNuSv$5!(867N|(0yqpkC9igYgP=M+P0^}0fMc5SMRdSowVwO6U}v(xl= z#iSJsW}a(UU!Q?TPG~e^!7I3HGk~jg>(WK!&A_fJ7QoRDLZR*Thqd<^=x>o!=br=r zMF0wEhp`qhQ&w+^9v*1ES~S3=9}8}I~T&-iW_M^b^P8biDumu+s;aZbd)k{RvFW6LvU2YU|fAI0yWDA6Os>6e9YZ|{(*m9KDjJei- z7i)yJ*x`i19qafJ?K`vU&BIl{L#tW=(+K)>xdf`dnUlSo_#O2pC!)_I*|cMoc9s{9 zEInyXMD0JsHrgLYBGb5Vim9GP+jGMF?0Ec(;}1;l-oF>QSFBeWz8-seOB(WaVQ#P> zBvVGiByx-b?X{f3Ny8DRcBtcLlNix7d16(Qwt0}Y=6YF$JYkPAzVEW_CI71jl)defWhh#je#Vp$~u`a-}jvpe?1%=+H~+xsJ7pa4SIJ0XkCdq)2QuI6~Q literal 0 HcmV?d00001 diff --git a/public/images/favicon-green.png b/public/images/favicon-green.png new file mode 100644 index 0000000000000000000000000000000000000000..3a243de1508376978fe5edc06b087fa32468547c GIT binary patch literal 1748 zcmV;_1}piAP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw0008+ 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 literal 0 HcmV?d00001 diff --git a/public/images/favicon.png b/public/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..4cd61479740ed9d674b5497b952c7e12eacf49d5 GIT binary patch literal 1928 zcmV;32Y2|1P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv0RI600RN!9r;`8x2A@epK~z}7?N(cCRM!<<``kNk&x|wUF~%P70~?635ydGW zHK4T6noy}}NR*c#QKhtMqn1``|C%UDq(+J=^&=8(qe34f5lULAAxT5qI5<%ZA;H1m zI2gZTum|wio*9qlb$#dFv->fA%ovXy+DiTDmPWegoORb;v-Uk_AK-r+bSvOb+qSO~ z;Kw28Zh%?@!43c{S!Y5QB)=(5KGxiNZuGw@p!1Cur^BT_1Hz95k!3loWX=-fu#6<0 zYI@*O@;?^Pb#h0I)yjVpf*R-M!f($Y(xF4nFmet6{yVK$z263aKm@Sl0h!J2YubB$ za5;Xl+~TEozf^6r;p8JKBC^>>{)Cm5KV$N&IT zRlr+n1%Q5zBwC7NDu7vDnfo*nniE6UJ-8ZnBbKzol(*D2=ELpK5e#IoaZM6lS0u~8 z<)Q*~X`YFvoYzmBZK%u|0;L`o{H1Qx)_CA{IZ@(r!0mFtVo{;03M`5;Z@H%HkWwO< z){shTNF>vUO(zkJO=I9%0=*+%cwOb`qeosjQB=U5hc5Qt|Inj{?`Up#_TIg_6q|LS z@0|YVJWjTq!u|K$ji&WAMgQ^B&%XeluMCer@@=?Wxf4<{qr3NWywTPXUi=Z=bPfno zhO>rIker$E&-M?{H!y^*?j8WZl~5S3zV#kndc6&&KlyAP+uJvUjx%S`)zh2DNia+k z!7{hn`QnQO-L$}gp7z5fktjX;*N(ylHW`hf^=mt^b@L`{Y0fpp_s@1=jo*g4$}${z z>tk%&ya5)AibLN!h^%42?Q%g%2{C(qPe!ItAN1E%Y;o@daB4{b9*fUo5194QslvVy z@cR((FYF$}G%G4!G(AaNt+ zvRfb}V>+2GTIWjxS5Z~&fzzIIbMv|YF7yt;FqYoJpY{#o^N}%Bmbn3m$%34V!J&_i zfA((YNMlF$2p;(6U8r4Kfoo%vxDpCuUJ z1Hp0+YAZ`oTTzOd3NLI{72^|=a5@}NRRz~>j3HQ637gdlW=0~dBbvw{mYjj68`!pC zHAv8JIBh%^{OWtiR?=cgdcMz5m2gZ^M9W!!a5StF& z2Y<`LO^lg`fA@CZdoTOyJqMzL)A^i59q4I4T;g;1hDeBV0FZhXpZxqN62mvJVi3Vo zUj=)h6jrYbiO|G5Q{6)uW`6TvsQ<`{0$yHI|Bbj7KeOl8PktwTCH%r<=Ve4L48hFI zERl=A{DnH?$iV33hG$T?4VM&fY<0u!!lJZ;IY30q-UO@n?}QePA$+=LndB@PeBZ&* z{?`|;ElK|9je%Y%`KK!-7Zw%4)@```NBiO5+OTMmm~84rX8r|B-nvxsq7KZ(OKTb) z1}VQ1Kt=w%&F6-DT@|YD`3k%nb9YTPB_=-Zg*F+_3XA%e$kmY_?mhbF=t`wovB^IT zSnGltHVTlBgc#rP+n-cB{O)go>FY$OBO;Q_aWKw-aDo#v$Afzwi>$=^|Coz^0XQbz ziIf{>s{jB1C3HntbYx+4WjbSWWnpw>05UK!H7zhQEiyAyF)%tXH##slD=;xSFfdFo zS;hbW03~!qSaf7zbY(hiZ)9m^c>ppnF*PkPGA%MQR536*FgH3dI4dwQIxsLjZQ*(V O0000