September 2008 - Posts

Kā izveidot Internet Explorer 8 accelerator

Sveiki!

Pagājušajā nedēļā nedaudz aplūkoju jauno Internet Explorer 8 betu. Neskatoties uz dažādām ar betu saistītām problēmām, tajā ir vairāki jauninājumi (salīdzinot ar septīto versiju, nevis astotās pirmo betu), kuri man šķiet interesanti un noderīgi. Viens no tiem ir tā sauktie "accelerators", kas kontekstjūtīgajā izvēlnē pievieno dažādus tīmekļa pakalpojumus, piemēram, iezīmētā vārda paskaidrošanu, izmantojot Encarta enciklopēdiju.

encarta acclerator preview

Tā kā man šī funkcionalitāte ļoti iepatikās, tad nolēmu paspēlēties un izveidot savu akseleratoru. Sākumā, lai demonstrētu tehnoloģiju izveidosim pavisam vienkāršu akseleratoru, kurš parādīs iezīmēto tekstu.

Tagad, kad ir zināma prasību specifikācija, varam sākt apskatīt tehniskās detaļas. Kā jau minēju, akseleratori ir domāti, lai izmantotu tīmekļa pakalpojumus, tāpēc to darbības principu var reducēt līdz tīmekļa lapas atvēršanai ar norādītajiem parametriem. Mūsu gadījumā asp.net lapa būs ļoti vienkārša un sastāvēs no viena literal elementa.

    <form id="form1" runat="server">
    <div>
        <asp:Literal runat="server" ID="litOutput" />
    </div>
    </form>

Page_Load() metodē aizpildam litOutput elementu ar parametra vērtību.

        protected void Page_Load(object sender, EventArgs e)
        {
            litOutput.Text = Request["text"];
        }

Šajā reizē tas arī ir viss, kas nepieciešams akselerātora darbināšanai. Tagad nepieciešams iemācīt Internet Explorer jauno akseleratoru. Lai to izdarītu ir nepieciešams izveidot OpenService aprakstu, kas ir XML fails, kurā ir aprakstīts viss nepieciešamais, lai izsauktu pakalpojuma piedāvātāja lapu ar nepieciešamajiem parametriem. Mūsu demo akseleratoram šis apraksts varētu būt šāds:

<?xml version="1.0" encoding="UTF-8"?>
<os:openServiceDescription
    xmlns:os="http://www.microsoft.com/schemas/openservicedescription/1.0">
  <os:homepageUrl>http://localhost:1663/</os:homepageUrl>
  <os:display>
    <os:name>Demo</os:name>
    <os:icon>http://localhost:1663/icon.ico</os:icon>
    <os:description>Demo akselerators, kurš parāda iezīmēto vārdu.</os:description>
  </os:display>
  <os:activity category="Demo">
    <os:activityAction context="selection">
      <os:preview action="http://localhost:1663/Default.aspx" method="get">
      <os:parameter name="text" value="{selection}" type="text" />
    </os:preview>
      <os:execute action="http://localhost:1663/Default.aspx" method="get">
        <os:parameter name="text" value="{selection}" type="text" />
      </os:execute>
    </os:activityAction>
  </os:activity>
</os:openServiceDescription>

Kā redzams, viss ir diezgan saprotams, tāpēc sīkāk katru sadaļu nekomentēšu. Interesenti var MSDN palasīt sīkāku aprakstu.

Tālāk ir nepieciešams kādā lapā izvietot javascript funkcijas izsaukumu, kas pievieno akseleratoru.

    <button id="btnAdd" onclick="window.external.AddService('http://localhost:1663/DemoAccleratorDescription.xml')">
   
Pievienot akseleratoru IE8</button>
    </
form>

Tagad atverot izveidoto lapu ir redzama poga, kuru nospiežot Internet Explorer piedāvā pievienot jauno akseleratoru.

add accelerator

Tagad var pārbaudīt jauno akseleratoru kādā tīmekļa lapā:

accelerator in action

Kā redzams, mūsu izveidotajam akseleratoram ir viens trūkums - lai gan tas jau ir pievienots Internet Explorer, lapa joprojām piedāvā to pievienot. Lai to novērstu Internet Explorer ir pieejama javascript funkcija, kas ļauj pārbaudīt, vai šāds akselerators jau ir pievienots. Lai paslēptu pievienošanas pogu, gadījumā ja akselerators jau ir pievienots, lapas onload metodā ir jāpievieno neliels javascript fragments.

    <script type="text/javascript">
        window.onload = function() 
        {
            if (window.external.IsServiceInstalled('http://localhost:1663/','demo')) 
            {
                document.getElementById('btnAdd').disabled = true;
            }
        }
    </script>

Diemžēl, ir problēmas, ja šis javascript tiek izmantots lapā, kas ir akseleratora priekšskats (preview). Lai to apietu, nepieciešams nelielas izmaiņas. Pirmkārt, akseleratora definīcijas XML failā izmainīt URL, kas norāda uz priekšskata lapu, pievienojot papildus parametru.

      <os:preview action="http://localhost:1663/Default.aspx?preview=yes" method="get">

Otrkārt, lapas kodā jāpievieno property, kas norāda vai ir priekšskata režīms:

        protected bool IsPreview
        {
            get
            {
                return !String.IsNullOrEmpty(Request.Params["preview"]) &&
                       Request.Params["preview"].Equals("yes", StringComparison.InvariantCultureIgnoreCase);
            }
        }

Un jāizmaina aspx lapas kods:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Accelerator demo</title>
    <%if (!IsPreview)
      {%>

    <script type="text/javascript">
        window.onload = function() 
        {
            if (window.external.IsServiceInstalled('http://localhost:1663/','demo')) 
                {
                    document.getElementById('btnAdd').disabled = true;
                }
        }
    </script>

    <%}%>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Literal runat="server" ID="litOutput" />
    </div>
    <%if (!IsPreview)
      {%>
    <button id="btnAdd" onclick="window.external.AddService('http://localhost:1663/DemoAcceleratorDescription.xml')">
        Pievienot akseleratoru IE8</button>
    <%} %>
    </form>
</body>
</html>

Tagad preview režīms ir bez liekās pogas, un arī atverot lapu, mums vairs netiek piedāvāts pievienot akseleratoru.

accelerator in action 2

Kā parasti pievienoju arī pirmkodu

P.S. Izstrādei un testēšanai izmantojot Visual Studio 2008 iebūvēto web serveri. Lai darbinātu piemēru, visticamākais, nāksies mainīt URL norādīto porta numuru.

Tikai vienreiz.

Programmatūras izstrādē ir lielisks princips, kuru latviski varētu nosaukt "tikai vienreiz". Šis princips nosaka, ka jebkura uzvedība kodā būtu jādefinē tikai vienu reizi. Reālās dzīves™ projektos patiesība ir daudz skarbāka un koda atkārtošanās ir samērā ikdienišķa lieta. Kaut vai tādēļ, ka ne visi izstrādātāji perfekti pārzin visus koda funkcionālos apgabalus un atkārtoti izgudro velosipēdu.

Pārlasot dienišķo ziņu plūsmu uzgāju vizuālās studijas papildinājumu, kurš palīdz risināt koda atkārtošanās problēmu. Clone detective ir apvalks ConQAT rīkam, kurš to integrē vizuālajā studijā, tādejādi ļaujot ērti veikt dublicēta koda meklēšanu un analīzi.

Tā kā ikdienas darbi šobrīd neatļauj veikt padziļinātu klonu meklētāja analīzi, tad varu pieminēt tikai tos plusus un mīnusus ko ātrumā pamanīju. Kā mīnusus varu minēt to, ka  ConQAT ir nepieciešama Java, kā arī nabadzīgās konfigurācijas iespējas - ātrumā neredzēju iespēju izslēgt no analizējamo failu saraksta automātiski ģenerētos failus. Tāpat nedaudz problemātiski bija atrast vietu, kur aktivizēt analīzi (View -> Other Windows -> Clone Explorer). Pie plusiem var minēt salīdzinoši labo ātrdarbību, jo vienu no mūsu lielākajiem projektiem izanalizēja ~3 minūšu laikā. Par lielāko plusu domāju, ka var uzskatīt šāda bezmaksas rīka eksistenci pašu par sevi.

Kopumā liekas, ka šis rīks noderēs, lai uzlabotu koda kvalitāti un nedaudz atvieglotu izstrādātāju dzīvi. Veiksmīgu cīņu ar kloniem!