China viagra I unashamedly maintain that there is so much more to being successful on the mobile web than dealing with screen size. China viagra But I do accept that dealing with screen size is at least a first step.
China viagra Thank goodness then, china viagra that the matter of screen size is so simple and well understood.
China viagra Really?
China viagra As web developers, china viagra we will often need to know the screen size of the device we are displaying content on. China viagra Perhaps on the server, china viagra perhaps on the client, china viagra perhaps to be used as a clause in a media query.
China viagra But how best to measure it? And what are we measuring anyway? On the client-side, china viagra for instance, china viagra a variety of ways exist to determine screen and page size: things like
screen.width, china viagra
window.outerWidth, china viagra
document.body.clientWidth, china viagra and so on. China viagra But these properties are infamously unspecified by any standards: so what do they all mean – and how reliable are they on mobile browsers?
China viagra Required reading at this point is PPK’s viewport article. China viagra With an article of tables from him that long, china viagra you know something’s up.
China viagra But last week I pushed out an update to src.sencha.io which allows client-side screen size parameters. China viagra Which parameters should mobile developers use? And when?
China viagra So for this blog post, china viagra I looked at a range of these metrics, china viagra and recorded their values for a variety of mobile browsers and page conditions. China viagra I’ve been working in mobile for far too long, china viagra but still, china viagra the amount of diversity in the results shocked me. China viagra Read on for the gory details, china viagra or skip to the end for the TLDR. China viagra I think there are some interesting findings.
China viagra The CSS media query properties (
device-width, china viagra
orientation, china viagra etc) are taken programmatically by evaluating expressions with the
matchMedia() function, china viagra supported in iOS v5.0 and Android v4.0.
China viagra I’m sorry to say that the tests were run on emulators rather than real devices, china viagra but covered iPhone (iOS v5.0 and iOS v4.3), china viagra Android v2.3, china viagra Android v4.0, china viagra and Opera Mobile v11.0. China viagra The Android and Opera simulators were set to use HVGA (320×480) so as to have conditions as consistent with the iPhone as possible. China viagra (Even though the actual physical screen of a retina iPhone is 640×960, china viagra this HVGA resolution is the one reported to the software APIs).
China viagra The tests were run with two different HTML document types – HTML5 and XHTML-MP – and also a third time with no doctype specified. China viagra The tests were also run both with and without a viewport meta tag to control the default width (constrained to ‘
device-width‘) and scaling. China viagra Additionally each device was tested with landscape as well as portrait orientation – making a total of 12 test combinations for each browser.
China viagra For the iPhone and Android browsers, china viagra PhoneGap-wrapped versions of the test pages were also run (without the viewport meta tag), china viagra and finally, china viagra for iOS v5.0, china viagra the iPhone’s ‘Add to Homescreen’ technique was used (with the
apple-mobile-web-app-capable meta tag) to launch portrait versions of the tests in a full-screen mode.
China viagra As if all those combinations were not enough, china viagra the properties were accessed four times during the lifecycle of the page: a) inline before the
<body> tag, china viagra b) after the
</body> tag, china viagra c) on the document’s load event, china viagra and d) one more time, china viagra 250ms later. China viagra I had a hunch that the values – at least those relating to page height – might change throughout this lifecycle.
China viagra The full set of results is available here. China viagra The various combinations of conditions are across the top, china viagra and operating systems (and measurements made) are down the left. China viagra Each cell shows the value returned from the relevant API call, china viagra and ‘
-‘ is used where the call failed or returned an undefined value.
China viagra Where the value changed during the lifecycle of the page, china viagra slashes delimit the change, china viagra and a letter is used to indicate at which of the four measuring points the value changed. China viagra So for example, china viagra ‘
208/c:1962‘ means that a value was 208 before the
<body> and after the
</body>, china viagra but then it changed to 1962 for ‘c’, china viagra the document’s load event, china viagra and remained so 250ms later.
China viagra There’s a lot to digest in there, china viagra although you may at least have noticed – as I have – that homogeneity is scarce. China viagra You may notice some particularly strange results, china viagra particularly on Android, china viagra but also on iOS and Opera. China viagra Let’s analyze the data by slicing the findings by property measured, china viagra dicing by operating system, china viagra and trying to digest the whole sorry lot.
China viagra These two properties are generally understood to return the physical dimensions of the screen upon which a browser is running. China viagra On desktop browsers, china viagra they will return you 1024×768, china viagra 1440×900, china viagra 1600×1200 and so on, china viagra regardless of how the actual browser window is sized. China viagra On mobile devices, china viagra one would expect the same behavior, china viagra and get full physical screen sizes.
China viagra Well, china viagra close. China viagra But no cigar.
China viagra Opera Mobile and Android v4.0 (as well as v2.3 in a PhoneGap app) behave most intuitively in this regard, china viagra and will indeed report 320×480 or 480×320 for portrait and landscape respectively.
China viagra iOS also consistently reports the physical dimensions of the screen (320×480), china viagra but notably fails to flip them for a change or orientation. China viagra So be aware that in landscape mode, china viagra your browser’s width will actually, china viagra apparently, china viagra be reported to be larger than the screen’s.
China viagra Android v2.3, china viagra in a regular browser scenario, china viagra however, china viagra displays even more curious behavior. China viagra Its
screen.width always starts off as 800 – which is clearly some sort of virtual viewport, china viagra rather than the physical screen. China viagra But when the document has an XHTML-MP doctype, china viagra or a constrained viewport (for any doctype), china viagra the value will switch, china viagra by the time of the document load event, china viagra to be the 320 or 480 you might expect.
China viagra Now this might be tolerable if you remember to wait for documents to fully load before accessing this property, china viagra but even that caution is blown to the wind by Android v2.3’s
China viagra With a non-constrained viewport, china viagra a portrait orientation, china viagra and with no doctype, china viagra screen.height was reported during this test as 1003. China viagra With an HTML5 doctype, china viagra it also switched to 1003, china viagra but only after dallying at 498 until at some point after the document load event. China viagra With an XHTML-MP doctype, china viagra it also started out at 498, china viagra but then dropped to about 40% of that value (199) by the time of the document load. China viagra With a constrained viewport, china viagra behavior was stable as a function of doctype, china viagra but also demonstrated the 60% drop at document load: from 1003 down to 401.
China viagra Landscape-wise, china viagra the same sort of issues occur: with no doctype, china viagra screen.height is a reliable 402; and with an HTML5 doctype, china viagra the same value is also (eventually) returned. China viagra The XHTML-MP doctype, china viagra or a constrained viewport, china viagra will cause the eventual value to be 241, china viagra but by way of various intriguing values. China viagra Our constrained, china viagra HTML5 document, china viagra for example, china viagra reported 372 before and after the
<body/>, china viagra 223 on load, china viagra and 241 at some point afterwards.
China viagra Yes, china viagra these actual values are probably dependent upon the length of my particular test page itself, china viagra but remember that these are supposed to be the physical screen dimensions, china viagra folks!
China viagra Some semblance of normality returns to Android v2.3 in the PhoneGap environment. China viagra The values of 455 and 295 are hardly accurate measures of physical screen size, china viagra either (since bizarrely they seem to take the 25 pixel status bar into account!), china viagra but at least they’re close, china viagra and hooray: take solace that the value does not change during the page lifecycle.
China viagra In the desktop world, china viagra the available width and height returned by these two properties still relate to the whole screen, china viagra rather than the browser’s window, china viagra but they take operating system chrome into account. China viagra The menu bar in OSX means that
screen.availHeight is at least 26 pixels less than
screen.height, china viagra for example – although the width values will probably be the same (unless you have a non-minimizing dock on the side of the screen).
China viagra In mobile, china viagra one might expect the available values to take into account any OS status bar height. China viagra Let’s see, china viagra shall we?
China viagra I need to caveat the Opera results here, china viagra since the simulator runs in a dedicated window without any ‘real device’ chrome. China viagra But that should have implied that its available dimensions are the same as the screen’s – and this was not what was seen. China viagra In fact, china viagra the
availHeight is reduced to 369 from a height of 480, china viagra not by any OS chrome, china viagra but by the browser’s own rather fat chrome. China viagra This is not what is expected – even if, china viagra on a real device, china viagra it emerges that the OS chrome is deducted too.
China viagra And having labored over Android v2.3, china viagra above, china viagra there’s not much more to say here about that operating system either. China viagra Without exception it depressingly reports exactly the same values for
availHeight as it did for width and height – although at least that means that the PhoneGap values are now correct! Android v4.0’s browser also reports the same available values as it did for total
height, china viagra but fortunately they were slightly more sensible to begin with. China viagra But bizarrely the PhoneGap app doesn’t take the status bar height off as it does for v2.3.
China viagra And then there’s iOS: it does successfully deduct 20 pixels for the operating system’s chrome. China viagra But remember that orientation is ignored! So although a portrait
availHeight is sensibly 460 (having dropped from 480), china viagra it is anti-intuitively the width in a landscape orientation that is reduced (from 320 to 300) by a bar at the top of the screen!
China viagra Quirks on all fronts. China viagra Sigh.
China viagra In contrast to the
screen properties, china viagra the
window properties are understood to refer to the browser window itself. China viagra For desktop browsers, china viagra (at least, china viagra when they’re not running in full-screen mode), china viagra the outer dimensions will normally be smaller than those for the screen. China viagra The inner dimensions then further deduct browser chrome: window borders, china viagra toolbars, china viagra status bars, china viagra and so on, china viagra and so they are normally smaller still.
China viagra In mobile, china viagra we might expect the outer values to more or less match those for the available screen – since apps run full size. China viagra And indeed, china viagra with
window.outerWidth, china viagra we have a good news story.
China viagra iOS v5.0 uses
window.outerWidth to redeem itself over the lack of the orientation’s effect on screen. China viagra It is 320 for portrait viewing, china viagra and 480 for landscape viewing. China viagra Bam.
China viagra In fact, china viagra the only small blot that stops
window.outerWidth being the model student is Android v4.0 in landscape: the property often has the portrait value of 320 before the
<body> tag is reached. China viagra However, china viagra this is arguably an edge case, china viagra and a very minor misdemeanor.
China viagra After that rousing news, china viagra it’s back to earth with a small bump for
window.innerWidth. China viagra If your desktop experience had convinced you that
innerWidth must be the same or smaller than
outerWidth, china viagra you’ve now got the TARDIS-like experience of mobile viewports to enjoy.
China viagra Without dropping into classic viewport theory here, china viagra it’s sufficient to say that WebKit mobile browsers seem to use the boundary between the window’s ‘inner’ and ‘outer’ width and height properties to delineate the world of physical pixels and the world of viewport pixels: the latter a realm where zooming, china viagra pinching and tapping allow the mobile browser to sensibly scale web pages designed for much larger screens.
China viagra For those pages where the viewport’s behavior is constrained, china viagra perhaps through the use of meta tags, china viagra this is of little concern, china viagra since the mapping of the two worlds is 1:1. China viagra And indeed, china viagra in our tests, china viagra when such a tag is present, china viagra
innerWidth takes exactly the same value as
outerWidth – modulo the Android race conditions, china viagra at least.
China viagra Less well-known might be the fact that, china viagra for all these browsers, china viagra when an XHTML-MP doctype is present, china viagra the same is also true. China viagra We’ve alluded to this already: the presence of this forces the viewport width to be the same as the physical width of the screen (either 320 or 480), china viagra while still allowing subsequent scaling.
China viagra And of course, china viagra PhoneGap’s default configuration is also to constrain the viewport, china viagra so the values there also match.
China viagra But when the viewport has not been constrained, china viagra and an HTML5 doctype (or none at all) is used, china viagra
innerWidth will suddenly start to represent values much larger than the physical screen: and represent the width of the viewport canvas upon which the page has been rendered.
China viagra On a portrait iPhone, china viagra for example, china viagra the default viewport is 980 pixels. China viagra On a landscape iPhone it is, china viagra well, china viagra according to
window.innerWidth, china viagra 981 (yes, china viagra really).
China viagra Android 2.3 and earlier used a different value of 800 for the default viewport width, china viagra and this is exposed as
window.innerWidth (as well as the vestigal value before document load for the constrained tests). China viagra With Android 4.0, china viagra the default viewport has been brought in line with the iPhone’s: 980 pixels.
China viagra Mobile browsers normally have no vertical chrome, china viagra so apart from the matter of viewports, china viagra
innerWidth values corresponded relatively nicely. China viagra However, china viagra they do have horizontal chrome elements: address bars at top, china viagra and toolbars at bottom. China viagra So we should expect the height to be reduced accordingly.
China viagra Opera, china viagra in a way, china viagra gets this right. China viagra We have already pointed out it surprisingly deducted the browser chrome to calculate its
screen.availHeight. China viagra But since it then promptly uses the same value for
window.innerHeight, china viagra it meets our expectations on the latter of these two properties at least.
China viagra For Android, china viagra
window.outerHeight is also relatively deterministic. China viagra Again, china viagra there are timing wobbles, china viagra but after page load, china viagra the values are consistently 455 (in portrait) and 295 (in landscape). China viagra The Android OS bar, china viagra as we’ve mentioned, china viagra is 25 pixels.
China viagra But it’s iOS that baffles this time. China viagra Only in homescreen mode, china viagra with an HTML5 doctype (or none at all), china viagra does the browser report the expected
window.outerHeight value of 460.
China viagra In all other cases, china viagra bizarre numbers come out. China viagra For iOS v5.0, china viagra for constrained portrait pages, china viagra it’s 356 that becomes 445. China viagra For non-constrained portrait pages it’s 356 that becomes 1602. China viagra For constrained landscape pages it’s 208 that becomes 667. China viagra For non-constrained portrait pages it’s 208 that becomes 1702. China viagra In PhoneGap, china viagra it’s 460 that becomes 1602, china viagra or 480 that becomes 1202. China viagra And for constrained homescreen apps, china viagra it’s 480 that becomes 1602.
China viagra Perhaps we could write a whole blog post to reverse engineer is going on here. China viagra 356 and 208 seem to have some plausibility, china viagra but apart from that – who knows? There’s no apparent Safari documentation for this property, china viagra and even WebCore’s own test suite describes the expected results as ‘empirical‘.
China viagra I think I can safely caution you never to use
window.outerHeight in iOS and expect a meaningful answer.
China viagra After that, china viagra
window.innerHeight seems relatively stable and predictable. China viagra In constrained (and XHTML-MP) scenarios in the regular iOS browser, china viagra it sits at that familiar 356 value for portrait and 208 for landscape. China viagra This is the actual inner height of the browser window, china viagra sans browser chrome, china viagra as per documentation. China viagra (The fact that these two values are not the same amount less than the physical screen dimensions is due to the fact that the landscape toolbar is slightly shallower than the portrait one.)
China viagra This pattern is also consistent when the page is launched constrained from the homescreen or in a PhoneGap application. China viagra Here, china viagra without any browser chrome at all, china viagra the values correctly return to the physical screen dimensions minus the 20 pixel tool bar.
China viagra However, china viagra this value is not as trustworthy when the page has a non-constrained viewport and an HTML5 (or omitted) doctype. China viagra In our test, china viagra
window.innerHeight had values of 1091 and 425 for the two orientations – doubtless dependent upon the length of the content in our actual page – and hard to predict. China viagra As if to prove that point, china viagra in homescreen mode, china viagra this value increases to 1409. China viagra Not particularly useful.
China viagra When we look at
window.innerHeight for Android, china viagra the results appear to follow a similar pattern, china viagra but, china viagra as usual, china viagra are somewhat obfuscated by the fact they change throughout the page lifecycle. China viagra For constrained viewports, china viagra the two orientations’ values are 401 and 241 in Android v2.3 (where the address bar is 54 pixels high), china viagra and 403 and 243 in Android v4.0 (where the address bar is 52 pixels high), china viagra and the PhoneGap values are also as expected, china viagra considering there is no address bar.
China viagra But again, china viagra the determinism disappears when the viewport is not constrained, china viagra the reported values as varied 1234, china viagra 496, china viagra 1003 and 402. China viagra We can deduce that these are viewport lengths rather than window size, china viagra that they are content-dependent, china viagra and that they change between platform versions due to the updated viewport width – but again, china viagra their utility is more doubtful than in the constrained scenarios.
body.offsetWidth, china viagra
.clientWidth, china viagra
.offsetHeight, china viagra &
China viagra These four values should theoretically be available on all DOM elements: the ‘offset’ dimensions include an element’s content, china viagra padding and border, china viagra while the ‘client’ dimensions are the content and padding alone. China viagra Neither include the margin, china viagra as detailed in Mozilla’s documentation.
China viagra In our case, china viagra we are querying these properties for the document’s body, china viagra and, china viagra since it has no border, china viagra the offset and client values should be the same. China viagra Our test pages add a CSS margin of 10 pixels, china viagra so on the desktop, china viagra we would expect its width, china viagra at least, china viagra to be 20 pixels less than
window.innerWidth. China viagra Empirically, china viagra desktop browsers seem to use the two heights to represent the total length of the page, china viagra rather than the height of the window display. China viagra (I’d thought that would be
body.scrollHeight, china viagra but that’s another story.)
China viagra How do mobile browsers fare? How does the viewport concept affect these values?
China viagra With
clientWidth, china viagra iOS and Android work broadly as you would expect. China viagra The non-constrained viewports return measurements in the high 900s (and around 800s for Android v2.3), china viagra and the constrained pages in the low 300s (for portrait) and mid 400s (for landscape).
China viagra It’s notable how and when the choice of doctype affects these values though. China viagra With an HTML5 doctype, china viagra non-constrained viewport tests on both platforms report 20 pixels less than the viewport size for both values: 960 pixels regardless of orientation.
China viagra With an XHTML-MP doctype, china viagra as we’ve previously mentioned, china viagra the viewport becomes the device width by default, china viagra and again 20 pixels are correctly deducted to give us values of 300 and 460 in landscape and portrait respectively. China viagra The same expected behaviour is seen with HTML5 doctypes used on constrained viewports.
China viagra What is slightly strange is when no doctype is used. China viagra In this case, china viagra again on both platforms in all scenarios, china viagra the
clientWidth is the full viewport width (980, china viagra 800, china viagra 480 or 320), china viagra and the
offsetWidth is reduced by the margin (to 460, china viagra 780, china viagra 460, china viagra or 300). China viagra This seems systemic: as though the lack of doctype puts the browser into a mode where it interprets the body’s margin as a border.
China viagra Across all of our testing combinations, china viagra though, china viagra the
clientHeight values are the most bizarre set of results in the whole experiment.
China viagra There are three patterns on Android and iOS. China viagra Firstly, china viagra pages with no doctype will always have
clientHeight equal to
window.innerHeight once the
</body> tag has closed – but the
offsetHeight will be completely different. China viagra Secondly, china viagra when there is a doctype, china viagra the
offsetHeight are always the same, china viagra and nearly always regardless of what the doctype actually is. China viagra (The bizarre exception is Android v2.3 where the HTML5 doctype on the non-constrained viewport causes both values to reduce dramatically at some point after the document load event). China viagra And finally, china viagra the
offsetHeight value of the non-doctype test always produces the same values as the
offsetHeight of the HTML5 equivalent.
China viagra Got that?
China viagra But what the values actually are seems extremely non-deterministic. China viagra We’ve already commented on the arbitrary nature of
window.innerHeight which the non-doctype results seem to echo. China viagra But despite the doctype, china viagra orientation and viewport size, china viagra the meaning of these values would seem very hard to assess. China viagra The best we can say is that when
offsetWidth go up, china viagra
offsetHeight go down (as seems sensible), china viagra but that no attention seems to be paid to our 20 pixel margin.
China viagra Again, china viagra properties best left alone, china viagra I think.
China viagra In contrast to iOS and Android, china viagra which use window outer and inner dimensions as the point of delineation between physical pixels and the viewport, china viagra Opera Mobile’s strategy seems to have been to to stay in the world of real pixels until this last
document.body set of measurements, china viagra and finally we get a sense of how it sizes the viewport.
China viagra The default viewport width seems to be 850 pixels, china viagra but although Opera has, china viagra until now, china viagra remained oblivious to the pages’ doctypes, china viagra the values seem to suddenly be very dependent upon them. China viagra With an HTML5 doctype on a non-constrained viewport, china viagra both
offsetWidth are 830 (which probably has had the 20 pixel margin deducted), china viagra and with XHTMLMP, china viagra we get 300 or 460 (which would be consistent with a constrained viewport, china viagra also minus margins).
China viagra But with no doctype and no viewport constraint, china viagra in either portrait or landscape, china viagra we get 850 for
clientWidth (i.e. China viagra no padding) and… for
offsetWidth, china viagra 2048! What?
China viagra And finally, china viagra as they were for iOS and Android, china viagra the
offsetHeight are a fairly disparate bunch of values. China viagra The only assumptions we can make are that a) constrained
clientHeight with no doctype will be the same as
window.innerHeight after the
</body> tag; that b)
offsetHeight for constrained HTML and any type of XHTML-MP will all be the same value for a given orientation (and that non-constrained HTML5 will also eventually converge on that value sometime after the document load event); and c) that the values themselves will be more or less unpredictable.
China viagra But perhaps not as meaningless as the offsetHeight for non-constrained doctype-less pages. China viagra It’s consistent. China viagra But a highly unlikely 40960 – which must surely, china viagra more or less, china viagra mean
width, china viagra
China viagra We conclude the menagerie of screen dimensions by looking at the values used in CSS3 media queries. China viagra These are used as ‘features’ in declarations which are used to conditionally load stylesheets or apply the rules within them. China viagra Media queries are a staple of contemporary web design, china viagra and perhaps should be understood by designers as much as the other properties above need to be understood by developers handling layouts.
China viagra Finally, china viagra we have some properties which are defined by a standard.
matchMedia function and varied the operand until it returned true. China viagra This does mean we only have results for those devices which support that API call: namely iOS v5.0 and Android v4.0.
China viagra Well it’s nice to end with some good news. China viagra In both platforms, china viagra in all conditions, china viagra @media
device-width always returns the same value as
screen.width, china viagra and
device-height always returns the same value as
screen.height. China viagra There’s no matchMedia support in Opera, china viagra but I’ll assume the same would be true.
China viagra This is great – but of course don’t forget the main issue afflicting those measurements: the lack of rotated values in iOS and Android 2.3’s wacky 800 viewport value which I’ll postulate may be echoed here too.
China viagra @media
width is almost always equal to
window.innerWidth (except in non-constrained landscape mode in iOS v5 when the former is 980 and the former that curious 981). China viagra @media
height is always equal to
China viagra (It’s not so clear whether this pattern would be followed by Opera too, china viagra were we able to measure it this way. China viagra To confirm, china viagra it would require a CSS-based test harness – perhaps another study.)
China viagra But there are a couple of things worth saying about this observation. China viagra Firstly, china viagra the
window.innerHeight values themselves are something of a bit of a mixed bag. China viagra See the earlier discussions above.
China viagra Secondly, china viagra it’s interesting to note that the
China viagra Hardcore browser theory & probably more testing required.
window.orientation & @media
China viagra As a final aside, china viagra note that we also measured orientation results. China viagra
window.orientation returns the number of degrees (0 for portait, china viagra 90 for landscape), china viagra and is flawless in iOS, china viagra and set correctly after
</body> on Android. China viagra (Just remember not to evaluate orientation before the
<body> – it’s likely still to be 0 in landscape mode)
China viagra Opera does not seem to support the API.
China viagra The media query equivalent is also apparently fine (where measurable). China viagra The only Android timing quirk here is PhoneGap in portrait which thinks it’s landscape at first. China viagra I guess nothing’s perfect.
China viagra Wow. China viagra Painful, china viagra on the whole.
China viagra Let’s see what we can briefly conclude. China viagra I’m not going to go back through each of the properties, china viagra but a couple of things jumped out at me.
- Doctypes matter – you may have no intention of using an XHTML-MP doctype, china viagra but if you forget your HTML5 one, china viagra some measurements are affected.
- Default viewports vary from 980 through 850, china viagra to 800, china viagra depending on platform. China viagra Be aware that Android’s default has changed between v2.3 and v4.0.
- Page lifecycle matters: even if you aren’t stupid enough to run measurement code before the
<body>, china viagra it can still change radically afterwards, china viagra at the document load event, china viagra or – most painfully – sometime after that.
- Race conditions seem more common on Android than on iOS – I admit this could also be affected by the poor performance of the platform’s emulator
- Height measurements are probably too nerve-wracking to use – as might be expected. China viagra Except in iOS, china viagra where you’ll need
heightto get width.
- Nothing much is standardized and where viewports are involved, china viagra the chaos of interpretation ensues. China viagra That
China viagra But overall, china viagra the message should be: don’t take anything for granted. China viagra Mobile diversity is, china viagra unsurprisingly, china viagra still with us with a vengeance – even for apparently simple things like screen size.
China viagra Check out the table again, china viagra get a little scared, china viagra choose your APIs carefully, china viagra and test on real devices* like crazy.
China viagra (* yes, china viagra yes, china viagra I still realize this whole experiment is underpinned by the ultimate sin of using emulators 🙂 )
China viagra Thoughts? War stories? Techniques? Fears? Comments welcome.