;

Seznam.cz představil vlastní webový prohlížeč, má být rychlý a jednoduchý

16. 12. 2014
Doba čtení: 3 minuty

Sdílet

Autor: seznam.cz
Seznam označuje svůj nový prohlížeč jako rychlý, bezpečný a bez zbytečných kudrlinek. Je postaven na aplikačním rozhraní node-webkit a používá vykreslovací jádro Blink. Stojí tedy oběma nohama na technologiích open source.

Seznam.cz před rokem představil jednoduchý prohlížeč pro mobilní telefony s operačním systémem Android. Aplikaci s názvem Seznam.cz si stáhl necelý milion uživatelů.

Nyní jde dál. První český prohlížeč je především navržený jako rychlá a bezpečná cesta ke všem službám společnosti Seznam.cz. Je to pravděpodobně odpověď na Chrome od Googlu, který ve svém uživatelském rozhraní také obsahuje řadu „zkratek“, vedoucích k využívání dalších služeb Googlu. Nový prohlížeč je postaven na aplikačním rozhraní node-webkit a používá vykreslovací jádro Blink, je tedy blízký příbuzný Chromu. (Z konkurečních řešení vzpomeňme Trident, který je v produktech Microsoftu, a Gecko, který pohání Mozillu.)

„V jednoduchosti je síla a v případě internetových řešení to platí více než kde jinde. Chceme lidem nabídnout možnost nainstalovat si ‚esko‘ i do svého počítače. Kdykoliv se tak dostanou na naše služby, které důvěrně znají. Prim pro nás kromě jednoduchosti hraje i on-line bezpečí. A protože víme, že hodně rizik číhá na běžné uživatele právě v podobě instalace doplňků, úplně jsme možnost jejich přidávání odstranili. Díky tomu nemusí mít lidé strach z jakéhokoliv nevítaného hosta a zároveň tím zaručíme rychlost celého systému,“ řekl Lukáš Kovač, produktový manažer, který má Seznam.cz prohlížeč na starosti. Rychlosti systému je kromě již zmíněného zákazu přidávání doplňků třetích stran docíleno technologiemi, na nichž Seznam.cz prohlížeč běží.

„Celý prohlížeč jsme chtěli udělat maximálně jednoduchý a efektivní. Veškeré možnosti nastavení jsme osekali na pouhých osm bodů včetně změny primárního vyhledávače. Maximální prostor jsme věnovali celkovému prožitku při prohlížení stránek, protože o tom podle nás prohlížeč je. O prohlížení. Seznam.cz prohlížeč je tak nejrychlejší cestou ke službám od Seznamu a uživatelé si mohou v plné kvalitě užít nejen veškeré naše služby, ale i prohlížení videí na YouTube či chatování s přáteli na Facebooku,“ doplnil Lukáš Kovač.

Jestli se s jednoduchostí trefili tvůrci do černého, na to odpovědí sami uživatelé, kteří novému softwaru vystaví vysvědčení v podobě jeho užívání či neužívání. Pak se ukáže, zda se rychlost a jednoduchost osvědčí, nebo zda je to jen eufemistické označení pro nedostatek pokročilých funkcí.

Zatím je k dispozici prvotní verze pro Windows, Mac a Android, verze pro iOS právě prochází schválením na App Storu. Verze pro Linux (snad zatím) k dispozci není, i když to pravděpodobně nemá technologickou příčinu - Blink i node-webkit jsou pro platformu Linux k dispozci.

Čtěte také:
→ Blink: Google inovuje jádro svého prohlížeče Chrome
Google již není spokojen s funkčností vykreslovacího jádra WebKit, a tak zahájil práce na jeho úpravách. Vznikl tak nový projekt Blink.
→ Seznam.cz kupuje podíly v Kupi.cz a TopGis
Největší český portál se po několikaměsíční obchodní spolupráci se srovnávacím serverem Kupi.cz rozhodl odkoupit 51 procent provozující firmy. Vedle toho se Seznam.cz stává majitelem 30procentního podílu ve společnosti TopGis, která sbírá a obchoduje s geodetickými daty.

Cyber25

Zaujal vás tento článek?
Zaregistrujte se k odběru našeho e-mailového newsletteru. Každý týden tak pohodlně získáte přehled o důležitých událostech v IT branži.

G+

'; document.getElementById('preroll-iframe').onload = function () { setupIframe(); } prerollContainer = document.getElementsByClassName('preroll-container-iframe')[0]; } function setupIframe() { prerollDocument = document.getElementById('preroll-iframe').contentWindow.document; let el = prerollDocument.createElement('style'); prerollDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:20px;right:25px}"; videoContent = prerollDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('PREROLL sound allowed'); // setUpIMA(true); videoContent.volume = 1; videoContent.muted = false; setUpIMA(); }).catch(function () { console.log('PREROLL sound forbidden'); videoContent.volume = 0; videoContent.muted = true; setUpIMA(); }); } } function setupDimensions() { prerollWidth = Math.min(iinfoPrerollPosition.offsetWidth, 480); prerollHeight = Math.min(iinfoPrerollPosition.offsetHeight, 320); } function setUpIMA() { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Preroll advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = prerollWidth; // adsRequest.linearAdSlotHeight = prerollHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. prerollDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( prerollDocument.getElementById('adContainer'), videoContent); } function unmutePrerollAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } } function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(prerollWidth, prerollHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } function onAdEvent(adEvent) { const ad = adEvent.getAd(); console.log('Preroll event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: if (!ad.isLinear()) { videoContent.play(); } prerollDocument.getElementById('adContainer').style.width = '100%'; prerollDocument.getElementById('adContainer').style.maxWidth = '640px'; prerollDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); if (ad.isLinear()) { intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } prerollDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (prerollLastError === 303) { playYtVideo(); } break; case google.ima.AdEvent.Type.COMPLETE: if (ad.isLinear()) { clearInterval(intervalTimer); } playYtVideo(); break; } } function onAdError(adErrorEvent) { console.log(adErrorEvent.getError()); prerollLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { playYtVideo(); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoPrerollPosition.remove(); playPrerollAd(); } else { return false; } adVolume = 1; return true; } function onContentPauseRequested() { videoContent.pause(); } function onContentResumeRequested() { videoContent.play(); } function onActiveView() { if (prerollContainer) { const containerOffset = prerollContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (prerollPaused) { adsManager.resume(); prerollPaused = false; } return true; } else { if (!prerollPaused) { adsManager.pause(); prerollPaused = true; } } } return false; } function playYtVideo() { iinfoPrerollPosition.remove(); youtubeIframe.style.display = 'block'; youtubeIframe.src += '&autoplay=1&mute=1'; } }
OSZAR »