SlideShare a Scribd company logo
1 of 63
Download to read offline
Web Development with


     Christopher M. Judd
Christopher M. Judd
President/Consultant of

                                    leader
Creator of open source projects FallME and Fiddle
December 2008 issue
Columbus iPhone
  User Group

http://groups.google.com/group/cidug
    Going the conversation
iPhone
2008 Third Quarter Smart Phone Sales
iPhone Uniqueness
Screen
  320




           480




                    Landscape


Portrait
Input




Multi-touch
                      Virtual Keyboard
Always Connected


                 EDGE
                  3G




Unlimited data
Location Aware
Accelerometer
Camera
Browser

   HTML 4.01
  XHTML 1.0
   JavaScript 3
 CSS 2.1 (partial 3.0)
  DOM Level 2
AJAX (XMLHTTPrequest)



                   Mobile Safari (WebKit)
Browser

   HTML 4.01
  XHTML 1.0
   JavaScript 3
 CSS 2.1 (partial 3.0)
  DOM Level 2                               XHTML Mobile Profile (MP)
AJAX (XMLHTTPrequest)                             WAP 2.0
                                                 WAP/WML




                   Mobile Safari (WebKit)
Browser

   HTML 4.01
  XHTML 1.0
   JavaScript 3
 CSS 2.1 (partial 3.0)
  DOM Level 2                               XHTML Mobile Profile (MP)
AJAX (XMLHTTPrequest)                             WAP 2.0
                                                 WAP/WML




                   Mobile Safari (WebKit)
iPhone Development

        vs
Disadvantages:
Advantages:
                             Must know Objective-C
 Access native features
                             Need Mac and OSX Leopard
  camera
  location awareness         Give up first born child in
  3D support                 mountain of legal agreements
  accelerometer (fine grain)
                             Must have application
  off-line access
                             approved and vetted before
 Performance
                             distribution in App Store
                             Process is on Apple’s timeline
                             not yours
Advantages:                  Disadvantages:
 Develop with Server-side     Don’t have access to
    technology of choice      native features
  Java                        Not as glamorous
  Groovy/Grails
                              Network performance
  Ruby
  .NET
  PHP
  Perl
 Don’t have to deal with
 syncing data with cloud
 Deployment and schedule
 is under your control
 Easier to deal with versioning
Support Levels

Incompatible                Optimized
               Compatible
Incompatible Websites
No plug-in support
                                                       Avoid
                    No mobile
                                                     HTML Frames
                technology support                Absolute positioning
                                                Mouse and keyboard events

                     XHTML Mobile Profile (MP)
                           WAP 2.0
                          WAP/WML




      There is not much Mobile Safari
              doesn’t support
Compatible Websites




Looks good and proportioned Home screen icon (Web Clip Icon)
Optimized Websites
Grails
• Web Application Framework
• Development Environment
• Open Source under Apache 2.0 License
• Current version 1.0.4 (1.1 is around the corner)
• Best Practices
      Convention over configuration
  –
      Don’t repeat yourself (DRY)
  –
      Default is what you expect (DIWYE)
  –
      Agile
  –
      Scaffolding
  –
      AJAX
  –
      Plug-ins
  –
      Unit testing
  –
      Web Services
  –
Grails MVC

    Controller




                 Domain
                          DB
      GSP
Grails Development Environment
      JDK
  •                               JDK 1.4


      Web Container/App Server
  •
      Build System
  •
      Application Stack
  •
      Persistence Framework
  •                              GORM

      Web Framework
  •
      Unit Test Framework
  •
      AJAX Framework
  •
      Database
  •
      Scheduling Framework
  •
      XML Framework
  •
      Logging Framework
  •
      View
  •
      IDE
  •
Installing Grails

1. Download from http://www.grails.org/Download
  • 1.0.4 - Stable Release
  • 1.1-BETA2 - Development Release
2. Unzip archive
3. Set GRAILS_HOME environment variable
4. Add %GRAILS_HOME%bin to system path




                 Depends on JDK 1.4 or greater
Creating a Grails App


grails create-app mynotes
Running a Grails App
                 Navigate to http://localhost:8080/mynotes



grails run-app
Add Domain Classes
                                        Note.groovy

                                    class Note {
grails create-domain-class note
                                    }

                                    NoteTests.groovy
                          class NoteTests extends GroovyTestCase
                          {

                              void testSomething() {

                              }
                          }
Implement Domains
    Add properties, methods, constraints, relationships

class Note {
  String title
  String content
  Date dateCreated
  Date lastUpdated

    static constraints = {
      title(blank:false, nullable:false, size:5..150)
      content(nullable:false, maxSize:1000)
    }

    String toString() { title }

}
Generate Scaffolding


grails generate-all note
Generate Scaffolding


grails generate-all note


  • Controller
  • Views
    • create
    • edit
    • list
    • show
Grails Request Flow
http://localhost:8080/mynotes/note/list
          class NoteController {

                     def index = { redirect(action:list,params:params) }

                     def list = {
                           if(!params.max) params.max = 10
                           [ noteList: Note.list( params ) ]
                     }

                      // ... code removed for brevity
          }

                                                  grails-app/views/layout/main.gsp
grails-app/views/note/list.gsp
                                                        <html>
      <html>                                                <head>
        <head>                                                  <title><g:layoutTitle default=quot;Grailsquot; /></title>
          <meta name=quot;layoutquot; content=quot;mainquot; />                 <link rel=quot;stylesheetquot; href=quot;${createLinkTo(dir:'css',f
          <title>Note List</title>                              <link rel=quot;shortcut iconquot; href=quot;${createLinkTo(dir:'ima
        </head>                                                 <g:layoutHead />
        <body>                                                  <g:javascript library=quot;applicationquot; />
          <div class=quot;bodyquot;>                                </head>
             <h1>Note List</h1>                             <body>
             <div class=quot;listquot;>                                 <div id=quot;spinnerquot; class=quot;spinnerquot; style=quot;display:none;quot;
               <!-- code remove for brevity -->                     <img src=quot;${createLinkTo(dir:'images',file:'spinner
             </div>                                             </div>
          </div>                                                <div class=quot;logoquot;><img src=quot;${createLinkTo(dir:'images'
        </body>                                                 <g:layoutBody />
      </html>                                               </body>
                                                        </html>
Minimal iPhone Support
Home Screen Icon
      (Web Clip Icon)
Home Screen Icon
      (Web Clip Icon)
Home Screen Icon
        (Web Clip Icon)



    <link rel=quot;apple-touch-iconquot;
        href=quot;images/apple-touch-icon.pngquot;/>
Home Screen Icon
        (Web Clip Icon)



    <link rel=quot;apple-touch-iconquot;
        href=quot;images/apple-touch-icon.pngquot;/>




              iPhone Adds
              • Rounded corners
              • Drop shadow
              • Reflective shine
Home Screen Icon
        (Web Clip Icon)



    <link rel=quot;apple-touch-iconquot;
        href=quot;images/apple-touch-icon.pngquot;/>




              iPhone Adds
              • Rounded corners
              • Drop shadow
              • Reflective shine
Home Screen Icon
        (Web Clip Icon)



    <link rel=quot;apple-touch-iconquot;
        href=quot;images/apple-touch-icon.pngquot;/>


            png image 57x57
              iPhone Adds
              • Rounded corners
              • Drop shadow
              • Reflective shine
Scaling




        Default width is 980                              Custom Viewport
   and scaled down by 2:1 or 3:1
<meta name=quot;viewportquot;
    content=quot;width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;quot;>
Custom iPhone
 Applications
   with iUI
iUI
 Provide a native iPhone application look and feel
  Open Source library containing
   Cascading Style Sheets (CSS)
   JavaScript
   Images


http://code.google.com/p/iui/




                       Transitions    Lists   Forms
iUI is AJAX
ommonly implemented as a single page
Named anchors URLs transition to named elements
Standard URLs make AJAX requests to server for snippet
Full page requests must use target of _self
Get more URLs must use target of _replace
Setting up iUI
     1.Download tar
     2.Uncompress
     3.Copy images, iui.css, iui.js and iuix.js to web project
     4.Import iui.css and iui.js
<html>
  <head>
    <title>Note List</title>
    <style type=quot;text/cssquot; media=quot;screenquot;>@import quot;/mynotes/js/iui/iui.cssquot;;</style>
    <meta name=quot;viewportquot;
       content=quot;width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;quot;>
    <link rel=quot;apple-touch-iconquot; href=quot;/mynotes/images/apple-touch-icon.pngquot;/>
    <script type=quot;text/javascriptquot; src=quot;/mynotes/js/iui/iui.jsquot;></script>
    <script type=quot;text/javascriptquot; src=quot;/mynotes/js/application.jsquot;></script>
  </head>
  <body>
     <!-- code removed for brevity -->
  </body>
</html>
Toolbar
<html>
  <head>
   <!-- code removed for brevity -->
  </head>
  <body>
    <div class=quot;toolbarquot;>
       <h1 id=quot;pageTitlequot;></h1>
       <a id=quot;backButtonquot; class=quot;buttonquot; href=quot;#quot;></a>
       <a href=quot;/mynotes/note/createquot; class=quot;buttonquot;>+</a>
    </div>
    </body>
</html>




        Manages state and history
List
 <html>
   <head>
      <!-- code removed for brevity -->
   </head>
   <body>
     <div class=quot;toolbarquot;>
        <h1 id=quot;pageTitlequot;></h1>
        <a id=quot;backButtonquot; class=quot;buttonquot; href=quot;#quot;></a>
        <a href=quot;/mynotes/note/createquot; class=quot;buttonquot;>+</a>
     </div>

     <ul id=quot;notesquot; title=quot;Notesquot; selected=quot;truequot;>
       <li><a href=quot;/mynotes/note/show/46quot;>Grocery list</a></li>
       <li><a href=quot;/mynotes/note/show/47quot;>Chrismas wish list</a></li
       <li>
         <a href=quot;/mynotes/note/more?offset=8quot; target=quot;_replacequot;>
           Show 8 More Notes...
         </a>
       </li>
     </ul>
     </body>
 </html>



Just an HTML unordered list
Forms
<html>
  <body>

  <div style=quot;left: 0%;quot; id=quot;Notesquot; title=quot;Notesquot; class=quot;panelquot;>
    <h2>Show Note</h2>
    <fieldset>
      <div class=quot;rowquot;>
        <label>Title</label>
        <input type=quot;textquot; name=quot;titlequot; value=quot;Grocery listquot;/>
      </div>
      <div class=quot;rowquot;>
        <label>Content</label>
        <textarea rows=quot;5quot; cols=quot;30quot; name=quot;contentquot;>
          Eggs
          Milk
          Coffee
        </textarea>
      </div>
    </fieldset>

    <form id=quot;deleteFormquot; name=quot;deleteFormquot;
              action=quot;deletequot; method=quot;postquot;>
      <input type=quot;hiddenquot; name=quot;idquot; value=quot;46quot; />
      <a class=quot;whiteButtonquot; href=quot;#quot;
        target=quot;_selfquot;
        onclick=quot;document.deleteForm.submit()quot;>Delete</a>
    </form>

  </div>
  </body>
</html>
Grails and iUI
Grails iUI Plug-in
      A plug-in for simplifying using iUI with Grails.
                   http://grails.org/iUI+Plugin


                              iPhone layout
                              iUI CSS, JavaScript and images
grails install-plugin iui     Grails apple-touch-icon
                              Automatically uses optimized
                              JavaScript in production mode
Determine iPhone
User-Agents
 iPhone - Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML,
    like Gecko) Version/3.0 Mobile/4A93 Safari/419.3


    iPod Touch - Mozilla/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1
    (KHTML, like Gecko) Version/3.0 Mobile/4A93 Safari/419.3


            Use Regular Express - Mobile.*Safari
class IPhoneFilters {
  def filters = {
    all(controller:'*', action:'*') {
      before = {
        if (request.getHeader(quot;User-Agentquot;) =~ quot;Mobile.*Safariquot;)
          request['fromIPhone'] = true
      }

        }
    }
}
Render iPhone View

def list = {
    if(!params.max) params.max = 8

    if (request.fromIPhone)
      render(view:'iphone_list', model:[noteList: Note.list( params )])
    else
      render(view:'list', model: [ noteList: Note.list( params ) ])
}
Snippets
                                Use templates

 <ul id=quot;notesquot; title=quot;Notesquot; selected=quot;truequot;>
   <g:render template=quot;iphone_notesquot; />
 </ul>




_iphone_notes.gsp
<g:each in=quot;${noteList}quot; status=quot;iquot; var=quot;notequot;>
  <li><g:link action=quot;showquot; id=quot;${note?.id}quot;>
       ${fieldValue(bean:note, field:'title')}
  </g:link></li>
</g:each>
<li>
  <g:link action=quot;morequot; target=quot;_replacequot; params=quot;[offset: 8]quot;>
       Show 8 More Notes...
  </g:link>
</li>
Testing
iPhone/iPod Touch

                      Challenges
                      • Corporate Network Access
                      • Hands of keyboard
                      • Difficult to debug




Should definitely use for final testing
SDK iPhone Simulator

              Challenges
              • Only works on Leopard OSX
              • Difficult to debug




  Included with SDK/XCode
Safari

      Challenges
      • Renders things the iPhone won’t




Mac or Windows
iPhone Spoofing
Debugging
iPhone Bookmarklets
http://www.manifestinteractive.com/iphone/#_Webdev


            Unique JavaScript solution
             View source
             Dump scripts
             View cookies
             etc
Resources


Web Development Guidelines for the iPhone (Safari Web Content Guide for iPhone OS)
   - https://developer.apple.com/webapps/docs/documentation/AppleApplications/Reference/SafariWebContent/
Safari HTML Reference
   - http://developer.apple.com/documentation/AppleApplications/Reference/SafariHTMLRef/
Safari CSS Reference
   - http://developer.apple.com/documentation/AppleApplications/Reference/SafariCSSRef/
WebKit DOM Programming Topic
   - http://developer.apple.com/documentation/AppleApplications/Conceptual/SafariJSProgTopics/

More Related Content

What's hot

Build responsive applications with google flutter
Build responsive applications with  google flutterBuild responsive applications with  google flutter
Build responsive applications with google flutterAhmed Abu Eldahab
 
Build beautiful native apps in record time with flutter
Build beautiful native apps in record time with flutterBuild beautiful native apps in record time with flutter
Build beautiful native apps in record time with flutterRobertLe30
 
Google flutter the easy and practical way
Google flutter the easy and practical wayGoogle flutter the easy and practical way
Google flutter the easy and practical wayAhmed Abu Eldahab
 
Flutter beyond hello world GCDC Egypt Devfest 2019
Flutter beyond hello world GCDC Egypt  Devfest 2019Flutter beyond hello world GCDC Egypt  Devfest 2019
Flutter beyond hello world GCDC Egypt Devfest 2019Ahmed Abu Eldahab
 
What is flutter and why should i care?
What is flutter and why should i care?What is flutter and why should i care?
What is flutter and why should i care?Sergi Martínez
 
Build web applications using google flutter
Build web applications using google flutterBuild web applications using google flutter
Build web applications using google flutterAhmed Abu Eldahab
 
Google flutter the easy and practical way
Google flutter the easy and practical wayGoogle flutter the easy and practical way
Google flutter the easy and practical wayAhmed Abu Eldahab
 
Flutter latest updates and features 2022
Flutter latest updates and features 2022Flutter latest updates and features 2022
Flutter latest updates and features 2022Ahmed Abu Eldahab
 
Developing cross platform apps in Flutter (Android, iOS, and Web)
Developing cross platform apps in Flutter (Android, iOS, and Web)Developing cross platform apps in Flutter (Android, iOS, and Web)
Developing cross platform apps in Flutter (Android, iOS, and Web)Priyanka Tyagi
 
Mobile Devolpment Slides
Mobile Devolpment SlidesMobile Devolpment Slides
Mobile Devolpment SlidesLuke Angel
 
Flutter Tutorial For Beginners | Edureka
Flutter Tutorial For Beginners | EdurekaFlutter Tutorial For Beginners | Edureka
Flutter Tutorial For Beginners | EdurekaEdureka!
 
Getting started with flutter
Getting started with flutterGetting started with flutter
Getting started with flutterrihannakedy
 
Rapid Prototyping with Cordova aka Phonegap
Rapid Prototyping with Cordova aka PhonegapRapid Prototyping with Cordova aka Phonegap
Rapid Prototyping with Cordova aka PhonegapJosue Bustos
 
Silverlight 2 with Visual Studio 2008 and Expression Blend
Silverlight 2 with Visual Studio 2008 and Expression BlendSilverlight 2 with Visual Studio 2008 and Expression Blend
Silverlight 2 with Visual Studio 2008 and Expression BlendCaleb Jenkins
 
Flutter state management from zero to hero
Flutter state management from zero to heroFlutter state management from zero to hero
Flutter state management from zero to heroAhmed Abu Eldahab
 
Flutter for web
Flutter for web Flutter for web
Flutter for web rihannakedy
 
Building beautiful apps using google flutter
Building beautiful apps using google flutterBuilding beautiful apps using google flutter
Building beautiful apps using google flutterAhmed Abu Eldahab
 

What's hot (20)

Build responsive applications with google flutter
Build responsive applications with  google flutterBuild responsive applications with  google flutter
Build responsive applications with google flutter
 
Build beautiful native apps in record time with flutter
Build beautiful native apps in record time with flutterBuild beautiful native apps in record time with flutter
Build beautiful native apps in record time with flutter
 
Flutter beyond hello world
Flutter beyond hello worldFlutter beyond hello world
Flutter beyond hello world
 
Flutter - DevFestDC
Flutter - DevFestDCFlutter - DevFestDC
Flutter - DevFestDC
 
Google flutter the easy and practical way
Google flutter the easy and practical wayGoogle flutter the easy and practical way
Google flutter the easy and practical way
 
Flutter beyond hello world GCDC Egypt Devfest 2019
Flutter beyond hello world GCDC Egypt  Devfest 2019Flutter beyond hello world GCDC Egypt  Devfest 2019
Flutter beyond hello world GCDC Egypt Devfest 2019
 
What is flutter and why should i care?
What is flutter and why should i care?What is flutter and why should i care?
What is flutter and why should i care?
 
Build web applications using google flutter
Build web applications using google flutterBuild web applications using google flutter
Build web applications using google flutter
 
Google flutter the easy and practical way
Google flutter the easy and practical wayGoogle flutter the easy and practical way
Google flutter the easy and practical way
 
Flutter latest updates and features 2022
Flutter latest updates and features 2022Flutter latest updates and features 2022
Flutter latest updates and features 2022
 
Developing cross platform apps in Flutter (Android, iOS, and Web)
Developing cross platform apps in Flutter (Android, iOS, and Web)Developing cross platform apps in Flutter (Android, iOS, and Web)
Developing cross platform apps in Flutter (Android, iOS, and Web)
 
Mobile Devolpment Slides
Mobile Devolpment SlidesMobile Devolpment Slides
Mobile Devolpment Slides
 
Flutter Tutorial For Beginners | Edureka
Flutter Tutorial For Beginners | EdurekaFlutter Tutorial For Beginners | Edureka
Flutter Tutorial For Beginners | Edureka
 
Getting started with flutter
Getting started with flutterGetting started with flutter
Getting started with flutter
 
Rapid Prototyping with Cordova aka Phonegap
Rapid Prototyping with Cordova aka PhonegapRapid Prototyping with Cordova aka Phonegap
Rapid Prototyping with Cordova aka Phonegap
 
Silverlight 2 with Visual Studio 2008 and Expression Blend
Silverlight 2 with Visual Studio 2008 and Expression BlendSilverlight 2 with Visual Studio 2008 and Expression Blend
Silverlight 2 with Visual Studio 2008 and Expression Blend
 
Flutter state management from zero to hero
Flutter state management from zero to heroFlutter state management from zero to hero
Flutter state management from zero to hero
 
Flutter for web
Flutter for web Flutter for web
Flutter for web
 
Flutter101
Flutter101Flutter101
Flutter101
 
Building beautiful apps using google flutter
Building beautiful apps using google flutterBuilding beautiful apps using google flutter
Building beautiful apps using google flutter
 

Similar to IPhone Web Development With Grails from CodeMash 2009

IE 8 et les standards du Web - Chris Wilson - Paris Web 2008
IE 8 et les standards du Web - Chris Wilson - Paris Web 2008IE 8 et les standards du Web - Chris Wilson - Paris Web 2008
IE 8 et les standards du Web - Chris Wilson - Paris Web 2008Association Paris-Web
 
HTML5 on Mobile
HTML5 on MobileHTML5 on Mobile
HTML5 on MobileAdam Lu
 
Real-World AJAX with ASP.NET
Real-World AJAX with ASP.NETReal-World AJAX with ASP.NET
Real-World AJAX with ASP.NETgoodfriday
 
Silver Light By Nyros Developer
Silver Light By Nyros DeveloperSilver Light By Nyros Developer
Silver Light By Nyros DeveloperNyros Technologies
 
SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13
SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13
SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13Fred Sauer
 
Widget Summit 2008
Widget Summit 2008Widget Summit 2008
Widget Summit 2008Volkan Unsal
 
Grails Introduction - IJTC 2007
Grails Introduction - IJTC 2007Grails Introduction - IJTC 2007
Grails Introduction - IJTC 2007Guillaume Laforge
 
Accelerated Adoption: HTML5 and CSS3 for ASP.NET Developers
Accelerated Adoption: HTML5 and CSS3 for ASP.NET DevelopersAccelerated Adoption: HTML5 and CSS3 for ASP.NET Developers
Accelerated Adoption: HTML5 and CSS3 for ASP.NET DevelopersTodd Anglin
 
Client-side JavaScript Vulnerabilities
Client-side JavaScript VulnerabilitiesClient-side JavaScript Vulnerabilities
Client-side JavaScript VulnerabilitiesOry Segal
 
GTLAB Installation Tutorial for SciDAC 2009
GTLAB Installation Tutorial for SciDAC 2009GTLAB Installation Tutorial for SciDAC 2009
GTLAB Installation Tutorial for SciDAC 2009marpierc
 
Internet Explorer 8 for Developers by Christian Thilmany
Internet Explorer 8 for Developers by Christian ThilmanyInternet Explorer 8 for Developers by Christian Thilmany
Internet Explorer 8 for Developers by Christian ThilmanyChristian Thilmany
 
HTML5 for Rich User Experience
HTML5 for Rich User ExperienceHTML5 for Rich User Experience
HTML5 for Rich User ExperienceMahbubur Rahman
 
Html 5 in a big nutshell
Html 5 in a big nutshellHtml 5 in a big nutshell
Html 5 in a big nutshellLennart Schoors
 
Web Apps and more
Web Apps and moreWeb Apps and more
Web Apps and moreYan Shi
 
Web app and more
Web app and moreWeb app and more
Web app and morefaming su
 
Strutsjspservlet
Strutsjspservlet Strutsjspservlet
Strutsjspservlet Sagar Nakul
 
Strutsjspservlet
Strutsjspservlet Strutsjspservlet
Strutsjspservlet Sagar Nakul
 
Even Faster Web Sites at jQuery Conference '09
Even Faster Web Sites at jQuery Conference '09Even Faster Web Sites at jQuery Conference '09
Even Faster Web Sites at jQuery Conference '09Steve Souders
 
Moving from Web 1.0 to Web 2.0
Moving from Web 1.0 to Web 2.0Moving from Web 1.0 to Web 2.0
Moving from Web 1.0 to Web 2.0Estelle Weyl
 

Similar to IPhone Web Development With Grails from CodeMash 2009 (20)

IE 8 et les standards du Web - Chris Wilson - Paris Web 2008
IE 8 et les standards du Web - Chris Wilson - Paris Web 2008IE 8 et les standards du Web - Chris Wilson - Paris Web 2008
IE 8 et les standards du Web - Chris Wilson - Paris Web 2008
 
HTML5 on Mobile
HTML5 on MobileHTML5 on Mobile
HTML5 on Mobile
 
Real-World AJAX with ASP.NET
Real-World AJAX with ASP.NETReal-World AJAX with ASP.NET
Real-World AJAX with ASP.NET
 
Silver Light By Nyros Developer
Silver Light By Nyros DeveloperSilver Light By Nyros Developer
Silver Light By Nyros Developer
 
SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13
SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13
SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13
 
Widget Summit 2008
Widget Summit 2008Widget Summit 2008
Widget Summit 2008
 
Grails Introduction - IJTC 2007
Grails Introduction - IJTC 2007Grails Introduction - IJTC 2007
Grails Introduction - IJTC 2007
 
Accelerated Adoption: HTML5 and CSS3 for ASP.NET Developers
Accelerated Adoption: HTML5 and CSS3 for ASP.NET DevelopersAccelerated Adoption: HTML5 and CSS3 for ASP.NET Developers
Accelerated Adoption: HTML5 and CSS3 for ASP.NET Developers
 
Client-side JavaScript Vulnerabilities
Client-side JavaScript VulnerabilitiesClient-side JavaScript Vulnerabilities
Client-side JavaScript Vulnerabilities
 
GTLAB Installation Tutorial for SciDAC 2009
GTLAB Installation Tutorial for SciDAC 2009GTLAB Installation Tutorial for SciDAC 2009
GTLAB Installation Tutorial for SciDAC 2009
 
Internet Explorer 8 for Developers by Christian Thilmany
Internet Explorer 8 for Developers by Christian ThilmanyInternet Explorer 8 for Developers by Christian Thilmany
Internet Explorer 8 for Developers by Christian Thilmany
 
HTML5 for Rich User Experience
HTML5 for Rich User ExperienceHTML5 for Rich User Experience
HTML5 for Rich User Experience
 
Html 5 in a big nutshell
Html 5 in a big nutshellHtml 5 in a big nutshell
Html 5 in a big nutshell
 
Web Apps and more
Web Apps and moreWeb Apps and more
Web Apps and more
 
Web app and more
Web app and moreWeb app and more
Web app and more
 
Struts,Jsp,Servlet
Struts,Jsp,ServletStruts,Jsp,Servlet
Struts,Jsp,Servlet
 
Strutsjspservlet
Strutsjspservlet Strutsjspservlet
Strutsjspservlet
 
Strutsjspservlet
Strutsjspservlet Strutsjspservlet
Strutsjspservlet
 
Even Faster Web Sites at jQuery Conference '09
Even Faster Web Sites at jQuery Conference '09Even Faster Web Sites at jQuery Conference '09
Even Faster Web Sites at jQuery Conference '09
 
Moving from Web 1.0 to Web 2.0
Moving from Web 1.0 to Web 2.0Moving from Web 1.0 to Web 2.0
Moving from Web 1.0 to Web 2.0
 

Recently uploaded

Grant Readiness 101 TechSoup and Remy Consulting
Grant Readiness 101 TechSoup and Remy ConsultingGrant Readiness 101 TechSoup and Remy Consulting
Grant Readiness 101 TechSoup and Remy ConsultingTechSoup
 
Student login on Anyboli platform.helpin
Student login on Anyboli platform.helpinStudent login on Anyboli platform.helpin
Student login on Anyboli platform.helpinRaunakKeshri1
 
Activity 01 - Artificial Culture (1).pdf
Activity 01 - Artificial Culture (1).pdfActivity 01 - Artificial Culture (1).pdf
Activity 01 - Artificial Culture (1).pdfciinovamais
 
Organic Name Reactions for the students and aspirants of Chemistry12th.pptx
Organic Name Reactions  for the students and aspirants of Chemistry12th.pptxOrganic Name Reactions  for the students and aspirants of Chemistry12th.pptx
Organic Name Reactions for the students and aspirants of Chemistry12th.pptxVS Mahajan Coaching Centre
 
CARE OF CHILD IN INCUBATOR..........pptx
CARE OF CHILD IN INCUBATOR..........pptxCARE OF CHILD IN INCUBATOR..........pptx
CARE OF CHILD IN INCUBATOR..........pptxGaneshChakor2
 
Mastering the Unannounced Regulatory Inspection
Mastering the Unannounced Regulatory InspectionMastering the Unannounced Regulatory Inspection
Mastering the Unannounced Regulatory InspectionSafetyChain Software
 
Industrial Policy - 1948, 1956, 1973, 1977, 1980, 1991
Industrial Policy - 1948, 1956, 1973, 1977, 1980, 1991Industrial Policy - 1948, 1956, 1973, 1977, 1980, 1991
Industrial Policy - 1948, 1956, 1973, 1977, 1980, 1991RKavithamani
 
Beyond the EU: DORA and NIS 2 Directive's Global Impact
Beyond the EU: DORA and NIS 2 Directive's Global ImpactBeyond the EU: DORA and NIS 2 Directive's Global Impact
Beyond the EU: DORA and NIS 2 Directive's Global ImpactPECB
 
Advanced Views - Calendar View in Odoo 17
Advanced Views - Calendar View in Odoo 17Advanced Views - Calendar View in Odoo 17
Advanced Views - Calendar View in Odoo 17Celine George
 
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdfssuser54595a
 
Q4-W6-Restating Informational Text Grade 3
Q4-W6-Restating Informational Text Grade 3Q4-W6-Restating Informational Text Grade 3
Q4-W6-Restating Informational Text Grade 3JemimahLaneBuaron
 
How to Make a Pirate ship Primary Education.pptx
How to Make a Pirate ship Primary Education.pptxHow to Make a Pirate ship Primary Education.pptx
How to Make a Pirate ship Primary Education.pptxmanuelaromero2013
 
Hybridoma Technology ( Production , Purification , and Application )
Hybridoma Technology  ( Production , Purification , and Application  ) Hybridoma Technology  ( Production , Purification , and Application  )
Hybridoma Technology ( Production , Purification , and Application ) Sakshi Ghasle
 
Separation of Lanthanides/ Lanthanides and Actinides
Separation of Lanthanides/ Lanthanides and ActinidesSeparation of Lanthanides/ Lanthanides and Actinides
Separation of Lanthanides/ Lanthanides and ActinidesFatimaKhan178732
 
POINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptx
POINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptxPOINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptx
POINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptxSayali Powar
 
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptxSOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptxiammrhaywood
 
Paris 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activityParis 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activityGeoBlogs
 
The Most Excellent Way | 1 Corinthians 13
The Most Excellent Way | 1 Corinthians 13The Most Excellent Way | 1 Corinthians 13
The Most Excellent Way | 1 Corinthians 13Steve Thomason
 
Employee wellbeing at the workplace.pptx
Employee wellbeing at the workplace.pptxEmployee wellbeing at the workplace.pptx
Employee wellbeing at the workplace.pptxNirmalaLoungPoorunde1
 

Recently uploaded (20)

Grant Readiness 101 TechSoup and Remy Consulting
Grant Readiness 101 TechSoup and Remy ConsultingGrant Readiness 101 TechSoup and Remy Consulting
Grant Readiness 101 TechSoup and Remy Consulting
 
Student login on Anyboli platform.helpin
Student login on Anyboli platform.helpinStudent login on Anyboli platform.helpin
Student login on Anyboli platform.helpin
 
Activity 01 - Artificial Culture (1).pdf
Activity 01 - Artificial Culture (1).pdfActivity 01 - Artificial Culture (1).pdf
Activity 01 - Artificial Culture (1).pdf
 
Organic Name Reactions for the students and aspirants of Chemistry12th.pptx
Organic Name Reactions  for the students and aspirants of Chemistry12th.pptxOrganic Name Reactions  for the students and aspirants of Chemistry12th.pptx
Organic Name Reactions for the students and aspirants of Chemistry12th.pptx
 
CARE OF CHILD IN INCUBATOR..........pptx
CARE OF CHILD IN INCUBATOR..........pptxCARE OF CHILD IN INCUBATOR..........pptx
CARE OF CHILD IN INCUBATOR..........pptx
 
Mastering the Unannounced Regulatory Inspection
Mastering the Unannounced Regulatory InspectionMastering the Unannounced Regulatory Inspection
Mastering the Unannounced Regulatory Inspection
 
Industrial Policy - 1948, 1956, 1973, 1977, 1980, 1991
Industrial Policy - 1948, 1956, 1973, 1977, 1980, 1991Industrial Policy - 1948, 1956, 1973, 1977, 1980, 1991
Industrial Policy - 1948, 1956, 1973, 1977, 1980, 1991
 
Beyond the EU: DORA and NIS 2 Directive's Global Impact
Beyond the EU: DORA and NIS 2 Directive's Global ImpactBeyond the EU: DORA and NIS 2 Directive's Global Impact
Beyond the EU: DORA and NIS 2 Directive's Global Impact
 
Advanced Views - Calendar View in Odoo 17
Advanced Views - Calendar View in Odoo 17Advanced Views - Calendar View in Odoo 17
Advanced Views - Calendar View in Odoo 17
 
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf
18-04-UA_REPORT_MEDIALITERAСY_INDEX-DM_23-1-final-eng.pdf
 
Q4-W6-Restating Informational Text Grade 3
Q4-W6-Restating Informational Text Grade 3Q4-W6-Restating Informational Text Grade 3
Q4-W6-Restating Informational Text Grade 3
 
How to Make a Pirate ship Primary Education.pptx
How to Make a Pirate ship Primary Education.pptxHow to Make a Pirate ship Primary Education.pptx
How to Make a Pirate ship Primary Education.pptx
 
Hybridoma Technology ( Production , Purification , and Application )
Hybridoma Technology  ( Production , Purification , and Application  ) Hybridoma Technology  ( Production , Purification , and Application  )
Hybridoma Technology ( Production , Purification , and Application )
 
Separation of Lanthanides/ Lanthanides and Actinides
Separation of Lanthanides/ Lanthanides and ActinidesSeparation of Lanthanides/ Lanthanides and Actinides
Separation of Lanthanides/ Lanthanides and Actinides
 
Mattingly "AI & Prompt Design: The Basics of Prompt Design"
Mattingly "AI & Prompt Design: The Basics of Prompt Design"Mattingly "AI & Prompt Design: The Basics of Prompt Design"
Mattingly "AI & Prompt Design: The Basics of Prompt Design"
 
POINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptx
POINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptxPOINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptx
POINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptx
 
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptxSOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
 
Paris 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activityParis 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activity
 
The Most Excellent Way | 1 Corinthians 13
The Most Excellent Way | 1 Corinthians 13The Most Excellent Way | 1 Corinthians 13
The Most Excellent Way | 1 Corinthians 13
 
Employee wellbeing at the workplace.pptx
Employee wellbeing at the workplace.pptxEmployee wellbeing at the workplace.pptx
Employee wellbeing at the workplace.pptx
 

IPhone Web Development With Grails from CodeMash 2009

  • 1. Web Development with Christopher M. Judd
  • 2. Christopher M. Judd President/Consultant of leader Creator of open source projects FallME and Fiddle
  • 4. Columbus iPhone User Group http://groups.google.com/group/cidug Going the conversation
  • 6. 2008 Third Quarter Smart Phone Sales
  • 8. Screen 320 480 Landscape Portrait
  • 9. Input Multi-touch Virtual Keyboard
  • 10. Always Connected EDGE 3G Unlimited data
  • 14. Browser HTML 4.01 XHTML 1.0 JavaScript 3 CSS 2.1 (partial 3.0) DOM Level 2 AJAX (XMLHTTPrequest) Mobile Safari (WebKit)
  • 15. Browser HTML 4.01 XHTML 1.0 JavaScript 3 CSS 2.1 (partial 3.0) DOM Level 2 XHTML Mobile Profile (MP) AJAX (XMLHTTPrequest) WAP 2.0 WAP/WML Mobile Safari (WebKit)
  • 16. Browser HTML 4.01 XHTML 1.0 JavaScript 3 CSS 2.1 (partial 3.0) DOM Level 2 XHTML Mobile Profile (MP) AJAX (XMLHTTPrequest) WAP 2.0 WAP/WML Mobile Safari (WebKit)
  • 18. Disadvantages: Advantages: Must know Objective-C Access native features Need Mac and OSX Leopard camera location awareness Give up first born child in 3D support mountain of legal agreements accelerometer (fine grain) Must have application off-line access approved and vetted before Performance distribution in App Store Process is on Apple’s timeline not yours
  • 19. Advantages: Disadvantages: Develop with Server-side Don’t have access to technology of choice native features Java Not as glamorous Groovy/Grails Network performance Ruby .NET PHP Perl Don’t have to deal with syncing data with cloud Deployment and schedule is under your control Easier to deal with versioning
  • 20. Support Levels Incompatible Optimized Compatible
  • 21. Incompatible Websites No plug-in support Avoid No mobile HTML Frames technology support Absolute positioning Mouse and keyboard events XHTML Mobile Profile (MP) WAP 2.0 WAP/WML There is not much Mobile Safari doesn’t support
  • 22. Compatible Websites Looks good and proportioned Home screen icon (Web Clip Icon)
  • 25. • Web Application Framework • Development Environment • Open Source under Apache 2.0 License • Current version 1.0.4 (1.1 is around the corner) • Best Practices Convention over configuration – Don’t repeat yourself (DRY) – Default is what you expect (DIWYE) – Agile – Scaffolding – AJAX – Plug-ins – Unit testing – Web Services –
  • 26. Grails MVC Controller Domain DB GSP
  • 27. Grails Development Environment JDK • JDK 1.4 Web Container/App Server • Build System • Application Stack • Persistence Framework • GORM Web Framework • Unit Test Framework • AJAX Framework • Database • Scheduling Framework • XML Framework • Logging Framework • View • IDE •
  • 28. Installing Grails 1. Download from http://www.grails.org/Download • 1.0.4 - Stable Release • 1.1-BETA2 - Development Release 2. Unzip archive 3. Set GRAILS_HOME environment variable 4. Add %GRAILS_HOME%bin to system path Depends on JDK 1.4 or greater
  • 29. Creating a Grails App grails create-app mynotes
  • 30. Running a Grails App Navigate to http://localhost:8080/mynotes grails run-app
  • 31. Add Domain Classes Note.groovy class Note { grails create-domain-class note } NoteTests.groovy class NoteTests extends GroovyTestCase { void testSomething() { } }
  • 32. Implement Domains Add properties, methods, constraints, relationships class Note { String title String content Date dateCreated Date lastUpdated static constraints = { title(blank:false, nullable:false, size:5..150) content(nullable:false, maxSize:1000) } String toString() { title } }
  • 34. Generate Scaffolding grails generate-all note • Controller • Views • create • edit • list • show
  • 35. Grails Request Flow http://localhost:8080/mynotes/note/list class NoteController { def index = { redirect(action:list,params:params) } def list = { if(!params.max) params.max = 10 [ noteList: Note.list( params ) ] } // ... code removed for brevity } grails-app/views/layout/main.gsp grails-app/views/note/list.gsp <html> <html> <head> <head> <title><g:layoutTitle default=quot;Grailsquot; /></title> <meta name=quot;layoutquot; content=quot;mainquot; /> <link rel=quot;stylesheetquot; href=quot;${createLinkTo(dir:'css',f <title>Note List</title> <link rel=quot;shortcut iconquot; href=quot;${createLinkTo(dir:'ima </head> <g:layoutHead /> <body> <g:javascript library=quot;applicationquot; /> <div class=quot;bodyquot;> </head> <h1>Note List</h1> <body> <div class=quot;listquot;> <div id=quot;spinnerquot; class=quot;spinnerquot; style=quot;display:none;quot; <!-- code remove for brevity --> <img src=quot;${createLinkTo(dir:'images',file:'spinner </div> </div> </div> <div class=quot;logoquot;><img src=quot;${createLinkTo(dir:'images' </body> <g:layoutBody /> </html> </body> </html>
  • 37. Home Screen Icon (Web Clip Icon)
  • 38. Home Screen Icon (Web Clip Icon)
  • 39. Home Screen Icon (Web Clip Icon) <link rel=quot;apple-touch-iconquot; href=quot;images/apple-touch-icon.pngquot;/>
  • 40. Home Screen Icon (Web Clip Icon) <link rel=quot;apple-touch-iconquot; href=quot;images/apple-touch-icon.pngquot;/> iPhone Adds • Rounded corners • Drop shadow • Reflective shine
  • 41. Home Screen Icon (Web Clip Icon) <link rel=quot;apple-touch-iconquot; href=quot;images/apple-touch-icon.pngquot;/> iPhone Adds • Rounded corners • Drop shadow • Reflective shine
  • 42. Home Screen Icon (Web Clip Icon) <link rel=quot;apple-touch-iconquot; href=quot;images/apple-touch-icon.pngquot;/> png image 57x57 iPhone Adds • Rounded corners • Drop shadow • Reflective shine
  • 43. Scaling Default width is 980 Custom Viewport and scaled down by 2:1 or 3:1 <meta name=quot;viewportquot; content=quot;width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;quot;>
  • 45. iUI Provide a native iPhone application look and feel Open Source library containing Cascading Style Sheets (CSS) JavaScript Images http://code.google.com/p/iui/ Transitions Lists Forms
  • 46. iUI is AJAX ommonly implemented as a single page Named anchors URLs transition to named elements Standard URLs make AJAX requests to server for snippet Full page requests must use target of _self Get more URLs must use target of _replace
  • 47. Setting up iUI 1.Download tar 2.Uncompress 3.Copy images, iui.css, iui.js and iuix.js to web project 4.Import iui.css and iui.js <html> <head> <title>Note List</title> <style type=quot;text/cssquot; media=quot;screenquot;>@import quot;/mynotes/js/iui/iui.cssquot;;</style> <meta name=quot;viewportquot; content=quot;width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;quot;> <link rel=quot;apple-touch-iconquot; href=quot;/mynotes/images/apple-touch-icon.pngquot;/> <script type=quot;text/javascriptquot; src=quot;/mynotes/js/iui/iui.jsquot;></script> <script type=quot;text/javascriptquot; src=quot;/mynotes/js/application.jsquot;></script> </head> <body> <!-- code removed for brevity --> </body> </html>
  • 48. Toolbar <html> <head> <!-- code removed for brevity --> </head> <body> <div class=quot;toolbarquot;> <h1 id=quot;pageTitlequot;></h1> <a id=quot;backButtonquot; class=quot;buttonquot; href=quot;#quot;></a> <a href=quot;/mynotes/note/createquot; class=quot;buttonquot;>+</a> </div> </body> </html> Manages state and history
  • 49. List <html> <head> <!-- code removed for brevity --> </head> <body> <div class=quot;toolbarquot;> <h1 id=quot;pageTitlequot;></h1> <a id=quot;backButtonquot; class=quot;buttonquot; href=quot;#quot;></a> <a href=quot;/mynotes/note/createquot; class=quot;buttonquot;>+</a> </div> <ul id=quot;notesquot; title=quot;Notesquot; selected=quot;truequot;> <li><a href=quot;/mynotes/note/show/46quot;>Grocery list</a></li> <li><a href=quot;/mynotes/note/show/47quot;>Chrismas wish list</a></li <li> <a href=quot;/mynotes/note/more?offset=8quot; target=quot;_replacequot;> Show 8 More Notes... </a> </li> </ul> </body> </html> Just an HTML unordered list
  • 50. Forms <html> <body> <div style=quot;left: 0%;quot; id=quot;Notesquot; title=quot;Notesquot; class=quot;panelquot;> <h2>Show Note</h2> <fieldset> <div class=quot;rowquot;> <label>Title</label> <input type=quot;textquot; name=quot;titlequot; value=quot;Grocery listquot;/> </div> <div class=quot;rowquot;> <label>Content</label> <textarea rows=quot;5quot; cols=quot;30quot; name=quot;contentquot;> Eggs Milk Coffee </textarea> </div> </fieldset> <form id=quot;deleteFormquot; name=quot;deleteFormquot; action=quot;deletequot; method=quot;postquot;> <input type=quot;hiddenquot; name=quot;idquot; value=quot;46quot; /> <a class=quot;whiteButtonquot; href=quot;#quot; target=quot;_selfquot; onclick=quot;document.deleteForm.submit()quot;>Delete</a> </form> </div> </body> </html>
  • 52. Grails iUI Plug-in A plug-in for simplifying using iUI with Grails. http://grails.org/iUI+Plugin iPhone layout iUI CSS, JavaScript and images grails install-plugin iui Grails apple-touch-icon Automatically uses optimized JavaScript in production mode
  • 53. Determine iPhone User-Agents iPhone - Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/4A93 Safari/419.3 iPod Touch - Mozilla/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/4A93 Safari/419.3 Use Regular Express - Mobile.*Safari class IPhoneFilters { def filters = { all(controller:'*', action:'*') { before = { if (request.getHeader(quot;User-Agentquot;) =~ quot;Mobile.*Safariquot;) request['fromIPhone'] = true } } } }
  • 54. Render iPhone View def list = { if(!params.max) params.max = 8 if (request.fromIPhone) render(view:'iphone_list', model:[noteList: Note.list( params )]) else render(view:'list', model: [ noteList: Note.list( params ) ]) }
  • 55. Snippets Use templates <ul id=quot;notesquot; title=quot;Notesquot; selected=quot;truequot;> <g:render template=quot;iphone_notesquot; /> </ul> _iphone_notes.gsp <g:each in=quot;${noteList}quot; status=quot;iquot; var=quot;notequot;> <li><g:link action=quot;showquot; id=quot;${note?.id}quot;> ${fieldValue(bean:note, field:'title')} </g:link></li> </g:each> <li> <g:link action=quot;morequot; target=quot;_replacequot; params=quot;[offset: 8]quot;> Show 8 More Notes... </g:link> </li>
  • 57. iPhone/iPod Touch Challenges • Corporate Network Access • Hands of keyboard • Difficult to debug Should definitely use for final testing
  • 58. SDK iPhone Simulator Challenges • Only works on Leopard OSX • Difficult to debug Included with SDK/XCode
  • 59. Safari Challenges • Renders things the iPhone won’t Mac or Windows
  • 62. iPhone Bookmarklets http://www.manifestinteractive.com/iphone/#_Webdev Unique JavaScript solution View source Dump scripts View cookies etc
  • 63. Resources Web Development Guidelines for the iPhone (Safari Web Content Guide for iPhone OS) - https://developer.apple.com/webapps/docs/documentation/AppleApplications/Reference/SafariWebContent/ Safari HTML Reference - http://developer.apple.com/documentation/AppleApplications/Reference/SafariHTMLRef/ Safari CSS Reference - http://developer.apple.com/documentation/AppleApplications/Reference/SafariCSSRef/ WebKit DOM Programming Topic - http://developer.apple.com/documentation/AppleApplications/Conceptual/SafariJSProgTopics/