watir-classic 3.0.0 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (206) hide show
  1. data/.gitignore +7 -0
  2. data/.gitmodules +3 -0
  3. data/.rspec +1 -0
  4. data/.yardopts +5 -0
  5. data/CHANGES +20 -10
  6. data/CONTRIBUTORS.txt +55 -0
  7. data/Gemfile +3 -0
  8. data/Gemfile.lock +78 -0
  9. data/README.rdoc +8 -14
  10. data/Rakefile +32 -0
  11. data/VERSION +1 -1
  12. data/lib/watir-classic.rb +0 -1
  13. data/lib/watir-classic/IEDialog/IEDialog.cpp +225 -0
  14. data/lib/watir-classic/IEDialog/IEDialog.h +15 -0
  15. data/lib/watir-classic/IEDialog/IEDialog.vcproj +159 -0
  16. data/lib/watir-classic/IEDialog/ReadMe.txt +40 -0
  17. data/lib/watir-classic/IEDialog/stdafx.cpp +8 -0
  18. data/lib/watir-classic/IEDialog/stdafx.h +21 -0
  19. data/lib/watir-classic/browser.rb +1 -1
  20. data/lib/watir-classic/container.rb +4 -33
  21. data/lib/watir-classic/core.rb +1 -3
  22. data/lib/watir-classic/dialogs/alert.rb +46 -0
  23. data/lib/watir-classic/dialogs/file_field.rb +1 -0
  24. data/lib/watir-classic/drag_and_drop_helper.rb +18 -6
  25. data/lib/watir-classic/element.rb +0 -2
  26. data/lib/watir-classic/ext/json2.js +487 -0
  27. data/lib/watir-classic/ie-class.rb +10 -164
  28. data/lib/watir-classic/ie.rb +2 -0
  29. data/lib/watir-classic/input_elements.rb +1 -1
  30. data/lib/watir-classic/modal_dialog.rb +1 -7
  31. data/lib/watir-classic/module.rb +1 -10
  32. data/lib/watir-classic/non_control_elements.rb +11 -0
  33. data/lib/watir-classic/page-container.rb +22 -24
  34. data/lib/watir-classic/screenshot.rb +33 -0
  35. data/lib/watir-classic/win32ole/1.8.7/win32ole.patch +56 -0
  36. data/lib/watir-classic/win32ole/1.9.3/win32ole.patch +63 -0
  37. data/lib/watir-classic/win32ole/build_notes.txt +18 -0
  38. data/lib/watir-classic/win32ole/history.txt +88 -0
  39. data/spec/browser_spec.rb +34 -0
  40. data/spec/implementation.rb +18 -0
  41. data/watir-classic.gemspec +40 -0
  42. data/watir.gif +0 -0
  43. metadata +159 -192
  44. data/bin/watir-console +0 -5
  45. data/lib/watir-classic/assertions.rb +0 -44
  46. data/lib/watir-classic/dialogs/javascript.rb +0 -43
  47. data/lib/watir-classic/irb-history.rb +0 -31
  48. data/lib/watir-classic/logger.rb +0 -19
  49. data/lib/watir-classic/screen_capture.rb +0 -115
  50. data/lib/watir-classic/testcase.rb +0 -97
  51. data/lib/watir-classic/waiter.rb +0 -98
  52. data/rakefile.rb +0 -54
  53. data/unittests/all_tests.rb +0 -10
  54. data/unittests/buttons_xpath_test.rb +0 -68
  55. data/unittests/checkbox_test.rb +0 -163
  56. data/unittests/checkbox_xpath_test.rb +0 -106
  57. data/unittests/click_no_wait_test.rb +0 -23
  58. data/unittests/close_all_test.rb +0 -17
  59. data/unittests/core_tests.rb +0 -17
  60. data/unittests/css_selector_test.rb +0 -44
  61. data/unittests/css_test.rb +0 -38
  62. data/unittests/dialog_test.rb +0 -64
  63. data/unittests/div2_xpath_test.rb +0 -21
  64. data/unittests/div_test.rb +0 -170
  65. data/unittests/div_xpath_test.rb +0 -95
  66. data/unittests/document_standards.rb +0 -63
  67. data/unittests/element_collection_indexes_test.rb +0 -57
  68. data/unittests/element_collections_test.rb +0 -100
  69. data/unittests/element_test.rb +0 -47
  70. data/unittests/errorchecker_test.rb +0 -31
  71. data/unittests/filefield_test.rb +0 -43
  72. data/unittests/filefield_xpath_test.rb +0 -35
  73. data/unittests/form_test.rb +0 -282
  74. data/unittests/form_xpath_test.rb +0 -254
  75. data/unittests/frame_test.rb +0 -165
  76. data/unittests/google_form_test.rb +0 -15
  77. data/unittests/html/JavascriptClick.html +0 -39
  78. data/unittests/html/blankpage.html +0 -11
  79. data/unittests/html/buttons1.html +0 -40
  80. data/unittests/html/checkboxes1.html +0 -89
  81. data/unittests/html/click_no_wait.html +0 -14
  82. data/unittests/html/complex_table.html +0 -35
  83. data/unittests/html/cssTest.html +0 -42
  84. data/unittests/html/depot_store.html +0 -59
  85. data/unittests/html/div.html +0 -92
  86. data/unittests/html/div_xml.html +0 -21
  87. data/unittests/html/fileupload.html +0 -44
  88. data/unittests/html/formTest1.html +0 -38
  89. data/unittests/html/forms2.html +0 -44
  90. data/unittests/html/forms3.html +0 -131
  91. data/unittests/html/forms4.html +0 -26
  92. data/unittests/html/frame_buttons.html +0 -4
  93. data/unittests/html/frame_links.html +0 -4
  94. data/unittests/html/frame_multi.html +0 -5
  95. data/unittests/html/google_india.html +0 -119
  96. data/unittests/html/ie7_document_standards.html +0 -9
  97. data/unittests/html/ie8_document_standards.html +0 -9
  98. data/unittests/html/ie9_document_standards.html +0 -9
  99. data/unittests/html/iframe.html +0 -3
  100. data/unittests/html/iframeTest.html +0 -17
  101. data/unittests/html/iframeTest1.html +0 -7
  102. data/unittests/html/iframeTest2.html +0 -5
  103. data/unittests/html/images/1.gif +0 -0
  104. data/unittests/html/images/2.GIF +0 -0
  105. data/unittests/html/images/3.GIF +0 -0
  106. data/unittests/html/images/button.jpg +0 -0
  107. data/unittests/html/images/circle.jpg +0 -0
  108. data/unittests/html/images/map.GIF +0 -0
  109. data/unittests/html/images/map2.gif +0 -0
  110. data/unittests/html/images/minus.GIF +0 -0
  111. data/unittests/html/images/originaltriangle.jpg +0 -0
  112. data/unittests/html/images/plus.gif +0 -0
  113. data/unittests/html/images/square.jpg +0 -0
  114. data/unittests/html/images/triangle.jpg +0 -0
  115. data/unittests/html/images1.html +0 -65
  116. data/unittests/html/javascriptevents.html +0 -33
  117. data/unittests/html/link_pass.html +0 -11
  118. data/unittests/html/links1.html +0 -37
  119. data/unittests/html/links2.html +0 -11
  120. data/unittests/html/links_multi.html +0 -12
  121. data/unittests/html/list_matters.html +0 -720
  122. data/unittests/html/lists.html +0 -18
  123. data/unittests/html/map_test.html +0 -30
  124. data/unittests/html/modal_dialog.html +0 -10
  125. data/unittests/html/modal_dialog_launcher.html +0 -12
  126. data/unittests/html/multiple_specifiers.html +0 -64
  127. data/unittests/html/nestedFrames.html +0 -6
  128. data/unittests/html/new_browser.html +0 -17
  129. data/unittests/html/pass.html +0 -13
  130. data/unittests/html/popups1.html +0 -59
  131. data/unittests/html/pre.html +0 -29
  132. data/unittests/html/quirks_document_standards.html +0 -8
  133. data/unittests/html/radioButtons1.html +0 -71
  134. data/unittests/html/select_tealeaf.html +0 -54
  135. data/unittests/html/selectboxes1.html +0 -52
  136. data/unittests/html/simple_table.html +0 -25
  137. data/unittests/html/simple_table_buttons.html +0 -104
  138. data/unittests/html/simple_table_columns.html +0 -75
  139. data/unittests/html/table1.html +0 -179
  140. data/unittests/html/tableCell_using_xpath.html +0 -19
  141. data/unittests/html/table_and_tablerow_to_a.html +0 -174
  142. data/unittests/html/textarea.html +0 -30
  143. data/unittests/html/textfields1.html +0 -100
  144. data/unittests/html/textsearch.html +0 -44
  145. data/unittests/html/wallofcheckboxes.html +0 -1003
  146. data/unittests/html/xpath_nbsp.html +0 -11
  147. data/unittests/html/zeroindex.html +0 -11
  148. data/unittests/ie_exists_test.rb +0 -16
  149. data/unittests/ie_mock.rb +0 -94
  150. data/unittests/ie_test.rb +0 -54
  151. data/unittests/images_test.rb +0 -156
  152. data/unittests/images_xpath_test.rb +0 -90
  153. data/unittests/index_specifier_test.rb +0 -31
  154. data/unittests/js_events_test.rb +0 -31
  155. data/unittests/links_multi_test.rb +0 -34
  156. data/unittests/links_test.rb +0 -131
  157. data/unittests/links_xpath_test.rb +0 -38
  158. data/unittests/lists_test.rb +0 -23
  159. data/unittests/map_test.rb +0 -98
  160. data/unittests/minmax_test.rb +0 -37
  161. data/unittests/navigate_test.rb +0 -38
  162. data/unittests/nbsp_xpath_test.rb +0 -16
  163. data/unittests/no_wait_test.rb +0 -28
  164. data/unittests/non_core_tests.rb +0 -12
  165. data/unittests/other/all_tests_concurrent.rb +0 -57
  166. data/unittests/other/navigate_exception_test.rb +0 -24
  167. data/unittests/other/rexml_unit_test.rb +0 -27
  168. data/unittests/other/screen_capture_test.rb +0 -53
  169. data/unittests/other/testcase_method_order_test.rb +0 -36
  170. data/unittests/other/testcase_verify_test.rb +0 -25
  171. data/unittests/other/wait_until_test.rb +0 -102
  172. data/unittests/pagecontainstext_test.rb +0 -69
  173. data/unittests/parent_child_test.rb +0 -27
  174. data/unittests/perf_test.rb +0 -20
  175. data/unittests/pre_test.rb +0 -49
  176. data/unittests/radios_test.rb +0 -181
  177. data/unittests/radios_xpath_test.rb +0 -100
  178. data/unittests/security_setting_test.rb +0 -24
  179. data/unittests/selectbox_test.rb +0 -144
  180. data/unittests/selectbox_xpath_test.rb +0 -102
  181. data/unittests/setup.rb +0 -69
  182. data/unittests/speed_settings_test.rb +0 -67
  183. data/unittests/table_cell_using_xpath_test.rb +0 -34
  184. data/unittests/table_test.rb +0 -296
  185. data/unittests/table_xpath_test.rb +0 -109
  186. data/unittests/test_tests.rb +0 -9
  187. data/unittests/textarea_test.rb +0 -92
  188. data/unittests/textarea_xpath_test.rb +0 -77
  189. data/unittests/textfield_for_ch_char_test.rb +0 -32
  190. data/unittests/textfields_test.rb +0 -184
  191. data/unittests/textfields_xpath_test.rb +0 -110
  192. data/unittests/version_test.rb +0 -15
  193. data/unittests/win32ole_so_test.rb +0 -35
  194. data/unittests/window_tests.rb +0 -10
  195. data/unittests/windows/attach_to_existing_window_test.rb +0 -52
  196. data/unittests/windows/attach_to_new_window_test.rb +0 -74
  197. data/unittests/windows/close_window_test.rb +0 -20
  198. data/unittests/windows/frame_links_test.rb +0 -23
  199. data/unittests/windows/ie-each_test.rb +0 -46
  200. data/unittests/windows/modal_dialog_test.rb +0 -95
  201. data/unittests/windows/new_process_test.rb +0 -24
  202. data/unittests/windows/new_test.rb +0 -58
  203. data/unittests/windows/open_close_test.rb +0 -19
  204. data/unittests/windows/send_keys_test.rb +0 -26
  205. data/unittests/xpath_tests.rb +0 -11
  206. data/watir-rdoc.rb +0 -7
@@ -74,8 +74,6 @@ module Watir
74
74
 
75
75
  # the OLE Internet Explorer object
76
76
  attr_accessor :ie
77
- # access to the logger object
78
- attr_accessor :logger
79
77
 
80
78
  # this contains the list of unique urls that have been visited
81
79
  attr_reader :url_list
@@ -176,9 +174,6 @@ module Watir
176
174
  @page_container = self
177
175
  @error_checkers = []
178
176
  @activeObjectHighLightColor = HIGHLIGHT_COLOR
179
-
180
-
181
- @logger = DefaultLogger.new
182
177
  @url_list = []
183
178
  end
184
179
 
@@ -328,6 +323,10 @@ module Watir
328
323
  end
329
324
  attr_writer :hwnd
330
325
 
326
+ def name
327
+ :ie
328
+ end
329
+
331
330
  # Are we attached to an open browser?
332
331
  def exists?
333
332
  begin
@@ -338,15 +337,6 @@ module Watir
338
337
  end
339
338
  alias :exist? :exists?
340
339
 
341
- # deprecated: use logger= instead
342
- def set_logger(logger)
343
- @logger = logger
344
- end
345
-
346
- def log(what)
347
- @logger.debug(what) if @logger
348
- end
349
-
350
340
  #
351
341
  # Accessing data outside the document
352
342
  #
@@ -493,6 +483,10 @@ module Watir
493
483
  return @ie.LocationURL
494
484
  end
495
485
 
486
+ def screenshot
487
+ Screenshot.new(hwnd)
488
+ end
489
+
496
490
  def window(specifiers={}, &blk)
497
491
  win = Window.new(self, specifiers, &blk)
498
492
  win.use &blk if blk
@@ -585,153 +579,6 @@ module Watir
585
579
  @error_checkers.delete(checker)
586
580
  end
587
581
 
588
- #
589
- # Show me state
590
- #
591
-
592
- # Show all forms displays all the forms that are on a web page.
593
- def show_forms
594
- if all_forms = self.forms
595
- count = all_forms.length
596
- puts "There are #{count} forms"
597
- all_forms.each do |form|
598
- puts "Form name: #{form.name}"
599
- puts " id: #{form.id}"
600
- puts " method: #{form.method}"
601
- puts " action: #{form.action}"
602
- end
603
- else
604
- puts "No forms"
605
- end
606
- end
607
-
608
- # this method shows all the images availble in the document
609
- def show_images
610
- doc = document
611
- index = 1
612
- doc.images.each do |l|
613
- puts "image: name: #{l.name}"
614
- puts " id: #{l.invoke("id")}"
615
- puts " src: #{l.src}"
616
- puts " index: #{index}"
617
- index += 1
618
- end
619
- end
620
-
621
- # this method shows all the links availble in the document
622
- def show_links
623
- props = ["name", "id", "href"]
624
- print_sizes = [12, 12, 60]
625
- doc = document
626
- index = 0
627
- text_size = 60
628
- # draw the table header
629
- s = "index".ljust(6)
630
- props.each_with_index do |p, i|
631
- s += p.ljust(print_sizes[i])
632
- end
633
- s += "text/src".ljust(text_size)
634
- s += "\n"
635
-
636
- # now get the details of the links
637
- doc.links.each do |n|
638
- index += 1
639
- s = s + index.to_s.ljust(6)
640
- props.each_with_index do |prop, i|
641
- printsize = print_sizes[i]
642
- begin
643
- p = n.invoke(prop)
644
- temp_var = "#{p}".to_s.ljust(printsize)
645
- rescue
646
- # this object probably doesnt have this property
647
- temp_var = "".to_s.ljust(printsize)
648
- end
649
- s += temp_var
650
- end
651
- s += n.innerText
652
- if n.getElementsByTagName("IMG").length > 0
653
- s += " / " + n.getElementsByTagName("IMG").item(0).src
654
- end
655
- s += "\n"
656
- end
657
- puts s
658
- end
659
-
660
- # this method shows the name, id etc of the object that is currently active - ie the element that has focus
661
- # its mostly used in irb when creating a script
662
- def show_active
663
- s = ""
664
-
665
- current = document.activeElement
666
- begin
667
- s += current.invoke("type").to_s.ljust(16)
668
- rescue
669
- end
670
- props = ["name", "id", "value", "alt", "src", "innerText", "href"]
671
- props.each do |prop|
672
- begin
673
- p = current.invoke(prop)
674
- s += " " + "#{prop}=#{p}".to_s.ljust(18)
675
- rescue
676
- #this object probably doesnt have this property
677
- end
678
- end
679
- s += "\n"
680
- end
681
-
682
- # this method shows all the divs availble in the document
683
- def show_divs
684
- divs = document.getElementsByTagName("DIV")
685
- puts "Found #{divs.length} div tags"
686
- index = 1
687
- divs.each do |d|
688
- puts "#{index} id=#{d.invoke('id')} class=#{d.invoke("className")}"
689
- index += 1
690
- end
691
- end
692
-
693
- # this method is used to show all the tables that are available
694
- def show_tables
695
- tables = document.getElementsByTagName("TABLE")
696
- puts "Found #{tables.length} tables"
697
- index = 1
698
- tables.each do |d|
699
- puts "#{index} id=#{d.invoke('id')} rows=#{d.rows.length} columns=#{begin d.rows["0"].cells.length; rescue; end}"
700
- index += 1
701
- end
702
- end
703
-
704
- def show_pres
705
- pres = document.getElementsByTagName("PRE")
706
- puts "Found #{ pres.length } pre tags"
707
- index = 1
708
- pres.each do |d|
709
- puts "#{index} id=#{d.invoke('id')} class=#{d.invoke("className")}"
710
- index+=1
711
- end
712
- end
713
-
714
- # this method shows all the spans availble in the document
715
- def show_spans
716
- spans = document.getElementsByTagName("SPAN")
717
- puts "Found #{spans.length} span tags"
718
- index = 1
719
- spans.each do |d|
720
- puts "#{index} id=#{d.invoke('id')} class=#{d.invoke("className")}"
721
- index += 1
722
- end
723
- end
724
-
725
- def show_labels
726
- labels = document.getElementsByTagName("LABEL")
727
- puts "Found #{labels.length} label tags"
728
- index = 1
729
- labels.each do |d|
730
- puts "#{index} text=#{d.invoke('innerText')} class=#{d.invoke("className")} for=#{d.invoke("htmlFor")}"
731
- index += 1
732
- end
733
- end
734
-
735
582
  # Gives focus to the frame
736
583
  def focus
737
584
  active_element = document.activeElement
@@ -750,13 +597,12 @@ module Watir
750
597
  end
751
598
 
752
599
  def attach_browser_window how, what
753
- log "Seeking Window with #{how}: #{what}"
754
600
  ieTemp = nil
755
601
  begin
756
- Watir::until_with_timeout do
602
+ Wait.until(IE.attach_timeout) do
757
603
  ieTemp = IE._find how, what
758
604
  end
759
- rescue Watir::Wait::TimeoutError
605
+ rescue Wait::TimeoutError
760
606
  raise NoMatchingWindowFoundException,
761
607
  "Unable to locate a window with #{how} of #{what}"
762
608
  end
@@ -2,6 +2,8 @@ require 'watir-classic'
2
2
  require 'watir-classic/core'
3
3
  require 'watir-classic/close_all'
4
4
  require 'watir-classic/ie-process'
5
+ require 'watir-classic/screenshot'
6
+ require 'yajl'
5
7
 
6
8
  # these switches need to be deleted from ARGV to enable the Test::Unit
7
9
  # functionality that grabs
@@ -232,6 +232,7 @@ module Watir
232
232
  dispatch_event("onSelect")
233
233
  dispatch_event("ondragstart")
234
234
  dispatch_event("ondrag")
235
+ destination.assert_exists
235
236
  destination.dispatch_event("onDragEnter")
236
237
  destination.dispatch_event("onDragOver")
237
238
  destination.dispatch_event("ondrop")
@@ -362,7 +363,6 @@ module Watir
362
363
  return value if @o.invoke('type') =~ /textarea/i # text areas don't have maxlength
363
364
  if value.length > maxlength
364
365
  value = value[0 .. maxlength - 1]
365
- @container.log " Supplied string is #{value.length} chars, which exceeds the max length (#{maxlength}) of the field. Using value: #{value}"
366
366
  end
367
367
  value
368
368
  end
@@ -1,9 +1,3 @@
1
- class WinClicker
2
- def initialize
3
- raise NotImplementedError, 'Watir no longer supports WinClicker. Please use click_no_wait and the javascript_dialog method.'
4
- end
5
- end
6
-
7
1
  module Watir
8
2
  class ModalDialog
9
3
  include Container
@@ -19,7 +13,7 @@ module Watir
19
13
  @modal.wait_until_present rescue raise NoMatchingWindowFoundException
20
14
 
21
15
  intUnknown = 0
22
- Watir::until_with_timeout do
16
+ Wait.until do
23
17
  intPointer = " " * 4 # will contain the int value of the IUnknown*
24
18
  GetUnknown.call(hwnd, intPointer)
25
19
  intArray = intPointer.unpack('L')
@@ -1,12 +1,3 @@
1
1
  module Watir
2
2
  include Watir::Exception
3
-
4
- # Directory containing the watir.rb file
5
- @@dir = File.expand_path(File.dirname(__FILE__))
6
-
7
- # Like regular Ruby "until", except that a Wait::TimeoutError is raised
8
- # if the timeout is exceeded. Timeout is IE.attach_timeout.
9
- def self.until_with_timeout # block
10
- Wait.until(IE.attach_timeout) { yield }
11
- end
12
- end
3
+ end
@@ -22,6 +22,17 @@ module Watir
22
22
  attr_ole :value
23
23
  end
24
24
 
25
+ class Dl < Element
26
+ def to_hash
27
+ dts.each_with_index.reduce({}) do |memo, item|
28
+ dt, i = *item
29
+ dd = dds[i]
30
+ memo[dt.text] = dd.present? ? dd.text : nil
31
+ memo
32
+ end
33
+ end
34
+ end
35
+
25
36
  class Embed < Element
26
37
  attr_ole :src
27
38
  attr_ole :type
@@ -37,17 +37,17 @@ module Watir
37
37
  def execute_script(source)
38
38
  result = nil
39
39
  begin
40
- source = "(function() {#{source}})()"
40
+ source = with_json2_if_needed source
41
41
  result = document.parentWindow.eval(source)
42
42
  rescue WIN32OLERuntimeError, NoMethodError #if eval fails we need to use execScript(source.to_s) which does not return a value, hence the workaround
43
- escaped_src = source.gsub(/[\r\n']/) {|m| "\\#{m}"}
43
+ escaped_src = source.gsub(/\r?\n/, "\\n").gsub("'", "\\\\'")
44
44
  wrapper = "_watir_helper_div_#{::Time.now.to_i + ::Time.now.usec}"
45
45
  cmd = "var e = document.createElement('DIV'); e.style.display='none'; e.id='#{wrapper}'; e.innerHTML = eval('#{escaped_src}'); document.body.appendChild(e);"
46
46
  document.parentWindow.execScript(cmd)
47
47
  result = document.getElementById(wrapper).innerHTML
48
48
  end
49
49
 
50
- result == "undefined" ? nil : result
50
+ Yajl::Parser.parse(result) rescue nil
51
51
  end
52
52
 
53
53
  # The HTML of the current page
@@ -70,27 +70,6 @@ module Watir
70
70
  @page_container = self
71
71
  end
72
72
 
73
- # This method is used to display the available html frames that Internet Explorer currently has loaded.
74
- # This method is usually only used for debugging test scripts.
75
- def show_frames
76
- if allFrames = document.frames
77
- count = allFrames.length
78
- puts "there are #{count} frames"
79
- for i in 0..count-1 do
80
- begin
81
- fname = allFrames.item(i).name.to_s
82
- puts "frame index: #{i + 1} name: #{fname}"
83
- rescue => e
84
- if e.to_s.match(/Access is denied/)
85
- puts "frame index: #{i + 1} Access Denied, see http://wiki.openqa.org/display/WTR/FAQ#access-denied"
86
- end
87
- end
88
- end
89
- else
90
- puts "no frames"
91
- end
92
- end
93
-
94
73
  # Search the current page for specified text or regexp.
95
74
  # Returns the index if the specified text was found.
96
75
  # Returns matchdata object if the specified regexp was found.
@@ -110,5 +89,24 @@ module Watir
110
89
  end
111
90
  end
112
91
 
92
+ def with_json2_if_needed source
93
+ %Q[
94
+ (function() {
95
+ if (!window.JSON || !window.JSON.stringify) {
96
+ var json2=document.createElement('script');
97
+ json2.type='text/javascript';
98
+ json2.src='file:///#{File.expand_path(File.dirname(__FILE__) + "/ext/json2.js")}';
99
+ document.getElementsByTagName('head')[0].appendChild(json2)
100
+ }
101
+
102
+ return JSON.stringify((function() {#{source}})());
103
+ })()
104
+ ]
105
+ end
106
+
107
+ private :with_json2_if_needed
108
+
113
109
  end # module
114
110
  end
111
+
112
+
@@ -0,0 +1,33 @@
1
+ require "tmpdir"
2
+ require "base64"
3
+ require "win32/screenshot"
4
+
5
+ module Watir
6
+ class Screenshot
7
+ def initialize(browser_hwnd)
8
+ @hwnd = browser_hwnd
9
+ end
10
+
11
+ def save(path)
12
+ screenshot.write(path)
13
+ end
14
+
15
+ def png
16
+ path = File.expand_path "temporary-image-#{Time.now.to_i}.png", Dir.tmpdir
17
+ save path
18
+ File.open(path, "rb") {|file| file.read}
19
+ ensure
20
+ File.delete path rescue nil
21
+ end
22
+
23
+ def base64
24
+ Base64.encode64 png
25
+ end
26
+
27
+ private
28
+
29
+ def screenshot
30
+ ::Win32::Screenshot::Take.of(:window, :hwnd => @hwnd)
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,56 @@
1
+ Index: win32ole.c
2
+ ===================================================================
3
+ --- win32ole.c (revision 29867)
4
+ +++ win32ole.c (revision )
5
+ @@ -6368,6 +6368,43 @@
6
+ }
7
+
8
+
9
+ +/*
10
+ + * WIN32OLE.connect_unknown( pUnknown ) --> aWIN32OLE
11
+ + * ----
12
+ + * Returns running OLE Automation object or WIN32OLE object from a
13
+ +IUnknown pointer
14
+ + * the IUnknown pointer is passed in as a FIXNUM
15
+ + */
16
+ +static VALUE
17
+ +fole_s_connect_unknown(self, iUnknown)
18
+ + VALUE self;
19
+ + VALUE iUnknown;
20
+ +{
21
+ + HRESULT hr;
22
+ + IDispatch *pDispatch;
23
+ + IUnknown *pUnknown;
24
+ +
25
+ + /* initialize to use OLE */
26
+ + ole_initialize();
27
+ +
28
+ + //cast from int to IUnknown*
29
+ + pUnknown = (IUnknown*)FIX2INT(iUnknown);
30
+ +
31
+ + hr = pUnknown->lpVtbl->QueryInterface(pUnknown, &IID_IDispatch,
32
+ + (void **)&pDispatch);
33
+ + if(FAILED(hr)) {
34
+ + OLE_RELEASE(pUnknown);
35
+ + ole_raise(hr, eWIN32OLE_RUNTIME_ERROR,
36
+ + "Failed to connect to WIN32OLE server `%d'",
37
+ + FIX2INT(iUnknown));
38
+ + }
39
+ +
40
+ + OLE_RELEASE(pUnknown);
41
+ +
42
+ + return create_win32ole_object(self, pDispatch, Qnil, Qnil);
43
+ +}
44
+ +
45
+ +
46
+ void
47
+ Init_win32ole()
48
+ {
49
+ @@ -6400,6 +6437,7 @@
50
+ rb_define_method(cWIN32OLE, "initialize", fole_initialize, -1);
51
+
52
+ rb_define_singleton_method(cWIN32OLE, "connect", fole_s_connect, -1);
53
+ + rb_define_singleton_method(cWIN32OLE, "connect_unknown", fole_s_connect_unknown, 1);
54
+ rb_define_singleton_method(cWIN32OLE, "const_load", fole_s_const_load, -1);
55
+
56
+ rb_define_singleton_method(cWIN32OLE, "ole_free", fole_s_free, 1);