Completed
Branch master (4dc390)
by Fabio
30:44
created

SimpleBrowser::ignoreCookies()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %
Metric Value
dl 0
loc 3
rs 10
cc 1
eloc 2
nc 1
nop 0
1
<?php
2
    /**
3
     *	Base include file for SimpleTest
4
     *	@package	SimpleTest
5
     *	@subpackage	WebTester
6
     *	@version	$Id: browser.php 1398 2006-09-08 19:31:03Z xue $
7
     */
8
9
    /**#@+
10
     *	include other SimpleTest class files
11
     */
12
    require_once(dirname(__FILE__) . '/simpletest.php');
13
    require_once(dirname(__FILE__) . '/http.php');
14
    require_once(dirname(__FILE__) . '/encoding.php');
15
    require_once(dirname(__FILE__) . '/page.php');
16
    require_once(dirname(__FILE__) . '/selector.php');
17
    require_once(dirname(__FILE__) . '/frames.php');
18
    require_once(dirname(__FILE__) . '/user_agent.php');
19
    /**#@-*/
20
21
    if (!defined('DEFAULT_MAX_NESTED_FRAMES')) {
22
        define('DEFAULT_MAX_NESTED_FRAMES', 3);
23
    }
24
25
    /**
26
     *    Browser history list.
27
	 *    @package SimpleTest
28
	 *    @subpackage WebTester
29
     */
30
    class SimpleBrowserHistory {
31
        protected $_sequence;
32
        protected $_position;
33
34
        /**
35
         *    Starts empty.
36
         *    @access public
37
         */
38
        function SimpleBrowserHistory() {
0 ignored issues
show
Coding Style Best Practice introduced by
Please use __construct() instead of a PHP4-style constructor that is named after the class.
Loading history...
39
            $this->_sequence = array();
40
            $this->_position = -1;
41
        }
42
43
        /**
44
         *    Test for no entries yet.
45
         *    @return boolean        True if empty.
46
         *    @access private
47
         */
48
        function _isEmpty() {
49
            return ($this->_position == -1);
50
        }
51
52
        /**
53
         *    Test for being at the beginning.
54
         *    @return boolean        True if first.
55
         *    @access private
56
         */
57
        function _atBeginning() {
58
            return ($this->_position == 0) && ! $this->_isEmpty();
59
        }
60
61
        /**
62
         *    Test for being at the last entry.
63
         *    @return boolean        True if last.
64
         *    @access private
65
         */
66
        function _atEnd() {
67
            return ($this->_position + 1 >= count($this->_sequence)) && ! $this->_isEmpty();
68
        }
69
70
        /**
71
         *    Adds a successfully fetched page to the history.
72
         *    @param SimpleUrl $url                 URL of fetch.
73
         *    @param SimpleEncoding $parameters     Any post data with the fetch.
74
         *    @access public
75
         */
76
        function recordEntry($url, $parameters) {
77
            $this->_dropFuture();
78
            array_push(
79
                    $this->_sequence,
80
                    array('url' => $url, 'parameters' => $parameters));
81
            $this->_position++;
82
        }
83
84
        /**
85
         *    Last fully qualified URL for current history
86
         *    position.
87
         *    @return SimpleUrl        URL for this position.
88
         *    @access public
89
         */
90
        function getUrl() {
91
            if ($this->_isEmpty()) {
92
                return false;
93
            }
94
            return $this->_sequence[$this->_position]['url'];
95
        }
96
97
        /**
98
         *    Parameters of last fetch from current history
99
         *    position.
100
         *    @return SimpleFormEncoding    Post parameters.
101
         *    @access public
102
         */
103
        function getParameters() {
104
            if ($this->_isEmpty()) {
105
                return false;
106
            }
107
            return $this->_sequence[$this->_position]['parameters'];
108
        }
109
110
        /**
111
         *    Step back one place in the history. Stops at
112
         *    the first page.
113
         *    @return boolean     True if any previous entries.
114
         *    @access public
115
         */
116
        function back() {
117
            if ($this->_isEmpty() || $this->_atBeginning()) {
118
                return false;
119
            }
120
            $this->_position--;
121
            return true;
122
        }
123
124
        /**
125
         *    Step forward one place. If already at the
126
         *    latest entry then nothing will happen.
127
         *    @return boolean     True if any future entries.
128
         *    @access public
129
         */
130
        function forward() {
131
            if ($this->_isEmpty() || $this->_atEnd()) {
132
                return false;
133
            }
134
            $this->_position++;
135
            return true;
136
        }
137
138
        /**
139
         *    Ditches all future entries beyond the current
140
         *    point.
141
         *    @access private
142
         */
143
        function _dropFuture() {
144
            if ($this->_isEmpty()) {
145
                return;
146
            }
147
            while (! $this->_atEnd()) {
148
                array_pop($this->_sequence);
149
            }
150
        }
151
    }
152
153
    /**
154
     *    Simulated web browser. This is an aggregate of
155
     *    the user agent, the HTML parsing, request history
156
     *    and the last header set.
157
	 *    @package SimpleTest
158
	 *    @subpackage WebTester
159
     */
160
    class SimpleBrowser {
161
        protected $_user_agent;
162
        protected $_page;
163
        protected $_history;
164
        protected $_ignore_frames;
165
        protected $_maximum_nested_frames;
0 ignored issues
show
Comprehensibility Naming introduced by
The variable name $_maximum_nested_frames exceeds the maximum configured length of 20.

Very long variable names usually make code harder to read. It is therefore recommended not to make variable names too verbose.

Loading history...
166
167
        /**
168
         *    Starts with a fresh browser with no
169
         *    cookie or any other state information. The
170
         *    exception is that a default proxy will be
171
         *    set up if specified in the options.
172
         *    @access public
173
         */
174
        function SimpleBrowser() {
0 ignored issues
show
Coding Style Best Practice introduced by
Please use __construct() instead of a PHP4-style constructor that is named after the class.
Loading history...
175
            $this->_user_agent = $this->_createUserAgent();
176
            $this->_user_agent->useProxy(
177
                    SimpleTest::getDefaultProxy(),
178
                    SimpleTest::getDefaultProxyUsername(),
179
                    SimpleTest::getDefaultProxyPassword());
180
            $this->_page = new SimplePage();
181
            $this->_history = $this->_createHistory();
182
            $this->_ignore_frames = false;
183
            $this->_maximum_nested_frames = DEFAULT_MAX_NESTED_FRAMES;
184
        }
185
186
        /**
187
         *    Creates the underlying user agent.
188
         *    @return SimpleFetcher    Content fetcher.
189
         *    @access protected
190
         */
191
        function &_createUserAgent() {
192
            $user_agent = new SimpleUserAgent();
193
            return $user_agent;
194
        }
195
196
        /**
197
         *    Creates a new empty history list.
198
         *    @return SimpleBrowserHistory    New list.
199
         *    @access protected
200
         */
201
        function &_createHistory() {
202
            $history = new SimpleBrowserHistory();
203
            return $history;
204
        }
205
206
        /**
207
         *    Disables frames support. Frames will not be fetched
208
         *    and the frameset page will be used instead.
209
         *    @access public
210
         */
211
        function ignoreFrames() {
212
            $this->_ignore_frames = true;
213
        }
214
215
        /**
216
         *    Enables frames support. Frames will be fetched from
217
         *    now on.
218
         *    @access public
219
         */
220
        function useFrames() {
221
            $this->_ignore_frames = false;
222
        }
223
224
        /**
225
         *    Switches off cookie sending and recieving.
226
         *    @access public
227
         */
228
        function ignoreCookies() {
229
            $this->_user_agent->ignoreCookies();
230
        }
231
232
        /**
233
         *    Switches back on the cookie sending and recieving.
234
         *    @access public
235
         */
236
        function useCookies() {
237
            $this->_user_agent->useCookies();
238
        }
239
240
        /**
241
         *    Parses the raw content into a page. Will load further
242
         *    frame pages unless frames are disabled.
243
         *    @param SimpleHttpResponse $response    Response from fetch.
244
         *    @param integer $depth                  Nested frameset depth.
245
         *    @return SimplePage                     Parsed HTML.
246
         *    @access private
247
         */
248
        function &_parse($response, $depth = 0) {
249
            $page = $this->_buildPage($response);
250
            if ($this->_ignore_frames || ! $page->hasFrames() || ($depth > $this->_maximum_nested_frames)) {
251
                return $page;
252
            }
253
            $frameset = new SimpleFrameset($page);
254
            foreach ($page->getFrameset() as $key => $url) {
0 ignored issues
show
Bug introduced by
The expression $page->getFrameset() of type false|array is not guaranteed to be traversable. How about adding an additional type check?

There are different options of fixing this problem.

  1. If you want to be on the safe side, you can add an additional type-check:

    $collection = json_decode($data, true);
    if ( ! is_array($collection)) {
        throw new \RuntimeException('$collection must be an array.');
    }
    
    foreach ($collection as $item) { /** ... */ }
    
  2. If you are sure that the expression is traversable, you might want to add a doc comment cast to improve IDE auto-completion and static analysis:

    /** @var array $collection */
    $collection = json_decode($data, true);
    
    foreach ($collection as $item) { /** .. */ }
    
  3. Mark the issue as a false-positive: Just hover the remove button, in the top-right corner of this issue for more options.

Loading history...
255
                $frame = $this->_fetch($url, new SimpleGetEncoding(), $depth + 1);
256
                $frameset->addFrame($frame, $key);
257
            }
258
            return $frameset;
259
        }
260
261
        /**
262
         *    Assembles the parsing machinery and actually parses
263
         *    a single page. Frees all of the builder memory and so
264
         *    unjams the PHP memory management.
265
         *    @param SimpleHttpResponse $response    Response from fetch.
266
         *    @return SimplePage                     Parsed top level page.
267
         *    @access protected
268
         */
269
        function &_buildPage($response) {
270
            $builder = new SimplePageBuilder();
271
            $page = $builder->parse($response);
272
            $builder->free();
273
            unset($builder);
274
            return $page;
275
        }
276
277
        /**
278
         *    Fetches a page. Jointly recursive with the _parse()
279
         *    method as it descends a frameset.
280
         *    @param string/SimpleUrl $url          Target to fetch.
0 ignored issues
show
Documentation introduced by
The doc-type string/SimpleUrl could not be parsed: Unknown type name "string/SimpleUrl" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
281
         *    @param SimpleEncoding $encoding       GET/POST parameters.
282
         *    @param integer $depth                 Nested frameset depth protection.
283
         *    @return SimplePage                    Parsed page.
284
         *    @access private
285
         */
286
        function &_fetch($url, $encoding, $depth = 0) {
287
            $response = $this->_user_agent->fetchResponse($url, $encoding);
288
            if ($response->isError()) {
289
                $page = new SimplePage($response);
290
            } else {
291
                $page = $this->_parse($response, $depth);
292
            }
293
            return $page;
294
        }
295
296
        /**
297
         *    Fetches a page or a single frame if that is the current
298
         *    focus.
299
         *    @param SimpleUrl $url                   Target to fetch.
300
         *    @param SimpleEncoding $parameters       GET/POST parameters.
301
         *    @return string                          Raw content of page.
302
         *    @access private
303
         */
304
        function _load($url, $parameters) {
305
            $frame = $url->getTarget();
306
            if (! $frame || ! $this->_page->hasFrames() || (strtolower($frame) == '_top')) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $frame of type false|string is loosely compared to false; this is ambiguous if the string can be empty. You might want to explicitly use === false instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
307
                return $this->_loadPage($url, $parameters);
0 ignored issues
show
Compatibility introduced by
$parameters of type object<SimpleEncoding> is not a sub-type of object<SimplePostEncoding>. It seems like you assume a child class of the class SimpleEncoding to be always present.

This check looks for parameters that are defined as one type in their type hint or doc comment but seem to be used as a narrower type, i.e an implementation of an interface or a subclass.

Consider changing the type of the parameter or doing an instanceof check before assuming your parameter is of the expected type.

Loading history...
308
            }
309
            return $this->_loadFrame(array($frame), $url, $parameters);
310
        }
311
312
        /**
313
         *    Fetches a page and makes it the current page/frame.
314
         *    @param string/SimpleUrl $url            Target to fetch as string.
0 ignored issues
show
Documentation introduced by
The doc-type string/SimpleUrl could not be parsed: Unknown type name "string/SimpleUrl" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
315
         *    @param SimplePostEncoding $parameters   POST parameters.
316
         *    @return string                          Raw content of page.
317
         *    @access private
318
         */
319
        function _loadPage($url, $parameters) {
320
            $this->_page = $this->_fetch($url, $parameters);
321
            $this->_history->recordEntry(
322
                    $this->_page->getUrl(),
323
                    $this->_page->getRequestData());
324
            return $this->_page->getRaw();
325
        }
326
327
        /**
328
         *    Fetches a frame into the existing frameset replacing the
329
         *    original.
330
         *    @param array $frames                    List of names to drill down.
331
         *    @param string/SimpleUrl $url            Target to fetch as string.
0 ignored issues
show
Documentation introduced by
The doc-type string/SimpleUrl could not be parsed: Unknown type name "string/SimpleUrl" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
332
         *    @param SimpleFormEncoding $parameters   POST parameters.
333
         *    @return string                          Raw content of page.
334
         *    @access private
335
         */
336
        function _loadFrame($frames, $url, $parameters) {
337
            $page = $this->_fetch($url, $parameters);
338
            $this->_page->setFrame($frames, $page);
0 ignored issues
show
Bug introduced by
The method setFrame() does not exist on SimplePage. Did you maybe mean setFrameFocusByIndex()?

This check marks calls to methods that do not seem to exist on an object.

This is most likely the result of a method being renamed without all references to it being renamed likewise.

Loading history...
339
        }
340
341
        /**
342
         *    Removes expired and temporary cookies as if
343
         *    the browser was closed and re-opened.
344
         *    @param string/integer $date   Time when session restarted.
0 ignored issues
show
Documentation introduced by
The doc-type string/integer could not be parsed: Unknown type name "string/integer" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
345
         *                                  If omitted then all persistent
346
         *                                  cookies are kept.
347
         *    @access public
348
         */
349
        function restart($date = false) {
350
            $this->_user_agent->restart($date);
351
        }
352
353
        /**
354
         *    Adds a header to every fetch.
355
         *    @param string $header       Header line to add to every
356
         *                                request until cleared.
357
         *    @access public
358
         */
359
        function addHeader($header) {
360
            $this->_user_agent->addHeader($header);
361
        }
362
363
        /**
364
         *    Ages the cookies by the specified time.
365
         *    @param integer $interval    Amount in seconds.
366
         *    @access public
367
         */
368
        function ageCookies($interval) {
369
            $this->_user_agent->ageCookies($interval);
370
        }
371
372
        /**
373
         *    Sets an additional cookie. If a cookie has
374
         *    the same name and path it is replaced.
375
         *    @param string $name       Cookie key.
376
         *    @param string $value      Value of cookie.
377
         *    @param string $host       Host upon which the cookie is valid.
0 ignored issues
show
Documentation introduced by
Should the type for parameter $host not be false|string?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
378
         *    @param string $path       Cookie path if not host wide.
379
         *    @param string $expiry     Expiry date.
0 ignored issues
show
Documentation introduced by
Should the type for parameter $expiry not be false|string?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
380
         *    @access public
381
         */
382
        function setCookie($name, $value, $host = false, $path = '/', $expiry = false) {
383
            $this->_user_agent->setCookie($name, $value, $host, $path, $expiry);
384
        }
385
386
        /**
387
         *    Reads the most specific cookie value from the
388
         *    browser cookies.
389
         *    @param string $host        Host to search.
390
         *    @param string $path        Applicable path.
391
         *    @param string $name        Name of cookie to read.
392
         *    @return string             False if not present, else the
393
         *                               value as a string.
394
         *    @access public
395
         */
396
        function getCookieValue($host, $path, $name) {
397
            return $this->_user_agent->getCookieValue($host, $path, $name);
398
        }
399
400
        /**
401
         *    Reads the current cookies for the current URL.
402
         *    @param string $name   Key of cookie to find.
403
         *    @return string        Null if there is no current URL, false
404
         *                          if the cookie is not set.
405
         *    @access public
406
         */
407
        function getCurrentCookieValue($name) {
408
            return $this->_user_agent->getBaseCookieValue($name, $this->_page->getUrl());
409
        }
410
411
        /**
412
         *    Sets the maximum number of redirects before
413
         *    a page will be loaded anyway.
414
         *    @param integer $max        Most hops allowed.
415
         *    @access public
416
         */
417
        function setMaximumRedirects($max) {
418
            $this->_user_agent->setMaximumRedirects($max);
419
        }
420
421
        /**
422
         *    Sets the maximum number of nesting of framed pages
423
         *    within a framed page to prevent loops.
424
         *    @param integer $max        Highest depth allowed.
425
         *    @access public
426
         */
427
        function setMaximumNestedFrames($max) {
428
            $this->_maximum_nested_frames = $max;
429
        }
430
431
        /**
432
         *    Sets the socket timeout for opening a connection.
433
         *    @param integer $timeout      Maximum time in seconds.
434
         *    @access public
435
         */
436
        function setConnectionTimeout($timeout) {
437
            $this->_user_agent->setConnectionTimeout($timeout);
438
        }
439
440
        /**
441
         *    Sets proxy to use on all requests for when
442
         *    testing from behind a firewall. Set URL
443
         *    to false to disable.
444
         *    @param string $proxy        Proxy URL.
445
         *    @param string $username     Proxy username for authentication.
0 ignored issues
show
Documentation introduced by
Should the type for parameter $username not be false|string?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
446
         *    @param string $password     Proxy password for authentication.
0 ignored issues
show
Documentation introduced by
Should the type for parameter $password not be false|string?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
447
         *    @access public
448
         */
449
        function useProxy($proxy, $username = false, $password = false) {
450
            $this->_user_agent->useProxy($proxy, $username, $password);
0 ignored issues
show
Bug introduced by
It seems like $username defined by parameter $username on line 449 can also be of type false; however, SimpleUserAgent::useProxy() does only seem to accept string, maybe add an additional type check?

This check looks at variables that have been passed in as parameters and are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
Bug introduced by
It seems like $password defined by parameter $password on line 449 can also be of type false; however, SimpleUserAgent::useProxy() does only seem to accept string, maybe add an additional type check?

This check looks at variables that have been passed in as parameters and are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
451
        }
452
453
        /**
454
         *    Fetches the page content with a HEAD request.
455
         *    Will affect cookies, but will not change the base URL.
456
         *    @param string/SimpleUrl $url                Target to fetch as string.
0 ignored issues
show
Documentation introduced by
The doc-type string/SimpleUrl could not be parsed: Unknown type name "string/SimpleUrl" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
457
         *    @param hash/SimpleHeadEncoding $parameters  Additional parameters for
0 ignored issues
show
Documentation introduced by
The doc-type hash/SimpleHeadEncoding could not be parsed: Unknown type name "hash/SimpleHeadEncoding" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
458
         *                                                HEAD request.
459
         *    @return boolean                             True if successful.
460
         *    @access public
461
         */
462
        function head($url, $parameters = false) {
463
            if (! is_object($url)) {
464
                $url = new SimpleUrl($url);
465
            }
466
            if ($this->getUrl()) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $this->getUrl() of type string|false is loosely compared to true; this is ambiguous if the string can be empty. You might want to explicitly use !== false instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
467
                $url = $url->makeAbsolute($this->getUrl());
468
            }
469
            $response = $this->_user_agent->fetchResponse($url, new SimpleHeadEncoding($parameters));
470
            return ! $response->isError();
471
        }
472
473
        /**
474
         *    Fetches the page content with a simple GET request.
475
         *    @param string/SimpleUrl $url                Target to fetch.
0 ignored issues
show
Documentation introduced by
The doc-type string/SimpleUrl could not be parsed: Unknown type name "string/SimpleUrl" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
476
         *    @param hash/SimpleFormEncoding $parameters  Additional parameters for
0 ignored issues
show
Documentation introduced by
The doc-type hash/SimpleFormEncoding could not be parsed: Unknown type name "hash/SimpleFormEncoding" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
477
         *                                                GET request.
478
         *    @return string                              Content of page or false.
479
         *    @access public
480
         */
481
        function get($url, $parameters = false) {
482
            if (! is_object($url)) {
483
                $url = new SimpleUrl($url);
484
            }
485
            if ($this->getUrl()) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $this->getUrl() of type string|false is loosely compared to true; this is ambiguous if the string can be empty. You might want to explicitly use !== false instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
486
                $url = $url->makeAbsolute($this->getUrl());
487
            }
488
            return $this->_load($url, new SimpleGetEncoding($parameters));
489
        }
490
491
        /**
492
         *    Fetches the page content with a POST request.
493
         *    @param string/SimpleUrl $url                Target to fetch as string.
0 ignored issues
show
Documentation introduced by
The doc-type string/SimpleUrl could not be parsed: Unknown type name "string/SimpleUrl" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
494
         *    @param hash/SimpleFormEncoding $parameters  POST parameters.
0 ignored issues
show
Documentation introduced by
The doc-type hash/SimpleFormEncoding could not be parsed: Unknown type name "hash/SimpleFormEncoding" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
495
         *    @return string                              Content of page.
496
         *    @access public
497
         */
498
        function post($url, $parameters = false) {
499
            if (! is_object($url)) {
500
                $url = new SimpleUrl($url);
501
            }
502
            if ($this->getUrl()) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $this->getUrl() of type string|false is loosely compared to true; this is ambiguous if the string can be empty. You might want to explicitly use !== false instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
503
                $url = $url->makeAbsolute($this->getUrl());
504
            }
505
            return $this->_load($url, new SimplePostEncoding($parameters));
506
        }
507
508
        /**
509
         *    Equivalent to hitting the retry button on the
510
         *    browser. Will attempt to repeat the page fetch. If
511
         *    there is no history to repeat it will give false.
512
         *    @return string/boolean   Content if fetch succeeded
0 ignored issues
show
Documentation introduced by
The doc-type string/boolean could not be parsed: Unknown type name "string/boolean" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
513
         *                             else false.
514
         *    @access public
515
         */
516
        function retry() {
517
            $frames = $this->_page->getFrameFocus();
518
            if (count($frames) > 0) {
519
                $this->_loadFrame(
520
                        $frames,
521
                        $this->_page->getUrl(),
522
                        $this->_page->getRequestData());
523
                return $this->_page->getRaw();
524
            }
525
            if ($url = $this->_history->getUrl()) {
526
                $this->_page = $this->_fetch($url, $this->_history->getParameters());
527
                return $this->_page->getRaw();
528
            }
529
            return false;
530
        }
531
532
        /**
533
         *    Equivalent to hitting the back button on the
534
         *    browser. The browser history is unchanged on
535
         *    failure. The page content is refetched as there
536
         *    is no concept of content caching in SimpleTest.
537
         *    @return boolean     True if history entry and
538
         *                        fetch succeeded
539
         *    @access public
540
         */
541
        function back() {
542
            if (! $this->_history->back()) {
543
                return false;
544
            }
545
            $content = $this->retry();
546
            if (! $content) {
547
                $this->_history->forward();
548
            }
549
            return $content;
550
        }
551
552
        /**
553
         *    Equivalent to hitting the forward button on the
554
         *    browser. The browser history is unchanged on
555
         *    failure. The page content is refetched as there
556
         *    is no concept of content caching in SimpleTest.
557
         *    @return boolean     True if history entry and
558
         *                        fetch succeeded
559
         *    @access public
560
         */
561
        function forward() {
562
            if (! $this->_history->forward()) {
563
                return false;
564
            }
565
            $content = $this->retry();
566
            if (! $content) {
567
                $this->_history->back();
568
            }
569
            return $content;
570
        }
571
572
        /**
573
         *    Retries a request after setting the authentication
574
         *    for the current realm.
575
         *    @param string $username    Username for realm.
576
         *    @param string $password    Password for realm.
577
         *    @return boolean            True if successful fetch. Note
578
         *                               that authentication may still have
579
         *                               failed.
580
         *    @access public
581
         */
582
        function authenticate($username, $password) {
583
            if (! $this->_page->getRealm()) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $this->_page->getRealm() of type false|string is loosely compared to false; this is ambiguous if the string can be empty. You might want to explicitly use === false instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
584
                return false;
585
            }
586
            $url = $this->_page->getUrl();
587
            if (! $url) {
588
                return false;
589
            }
590
            $this->_user_agent->setIdentity(
591
                    $url->getHost(),
0 ignored issues
show
Security Bug introduced by
It seems like $url->getHost() targeting SimpleUrl::getHost() can also be of type false; however, SimpleUserAgent::setIdentity() does only seem to accept string, did you maybe forget to handle an error condition?
Loading history...
592
                    $this->_page->getRealm(),
593
                    $username,
594
                    $password);
595
            return $this->retry();
596
        }
597
598
        /**
599
         *    Accessor for a breakdown of the frameset.
600
         *    @return array   Hash tree of frames by name
601
         *                    or index if no name.
602
         *    @access public
603
         */
604
        function getFrames() {
605
            return $this->_page->getFrames();
606
        }
607
608
        /**
609
         *    Accessor for current frame focus. Will be
610
         *    false if no frame has focus.
611
         *    @return integer/string/boolean    Label if any, otherwise
0 ignored issues
show
Documentation introduced by
The doc-type integer/string/boolean could not be parsed: Unknown type name "integer/string/boolean" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
612
         *                                      the position in the frameset
613
         *                                      or false if none.
614
         *    @access public
615
         */
616
        function getFrameFocus() {
617
            return $this->_page->getFrameFocus();
618
        }
619
620
        /**
621
         *    Sets the focus by index. The integer index starts from 1.
622
         *    @param integer $choice    Chosen frame.
623
         *    @return boolean           True if frame exists.
624
         *    @access public
625
         */
626
        function setFrameFocusByIndex($choice) {
627
            return $this->_page->setFrameFocusByIndex($choice);
628
        }
629
630
        /**
631
         *    Sets the focus by name.
632
         *    @param string $name    Chosen frame.
633
         *    @return boolean        True if frame exists.
634
         *    @access public
635
         */
636
        function setFrameFocus($name) {
637
            return $this->_page->setFrameFocus($name);
638
        }
639
640
        /**
641
         *    Clears the frame focus. All frames will be searched
642
         *    for content.
643
         *    @access public
644
         */
645
        function clearFrameFocus() {
646
            return $this->_page->clearFrameFocus();
647
        }
648
649
        /**
650
         *    Accessor for last error.
651
         *    @return string        Error from last response.
652
         *    @access public
653
         */
654
        function getTransportError() {
655
            return $this->_page->getTransportError();
656
        }
657
658
        /**
659
         *    Accessor for current MIME type.
660
         *    @return string    MIME type as string; e.g. 'text/html'
661
         *    @access public
662
         */
663
        function getMimeType() {
664
            return $this->_page->getMimeType();
665
        }
666
667
        /**
668
         *    Accessor for last response code.
669
         *    @return integer    Last HTTP response code received.
670
         *    @access public
671
         */
672
        function getResponseCode() {
673
            return $this->_page->getResponseCode();
674
        }
675
676
        /**
677
         *    Accessor for last Authentication type. Only valid
678
         *    straight after a challenge (401).
679
         *    @return string    Description of challenge type.
680
         *    @access public
681
         */
682
        function getAuthentication() {
683
            return $this->_page->getAuthentication();
684
        }
685
686
        /**
687
         *    Accessor for last Authentication realm. Only valid
688
         *    straight after a challenge (401).
689
         *    @return string    Name of security realm.
690
         *    @access public
691
         */
692
        function getRealm() {
693
            return $this->_page->getRealm();
694
        }
695
696
        /**
697
         *    Accessor for current URL of page or frame if
698
         *    focused.
699
         *    @return string    Location of current page or frame as
700
         *                      a string.
701
         */
702
        function getUrl() {
703
            $url = $this->_page->getUrl();
704
            return $url ? $url->asString() : false;
705
        }
706
707
        /**
708
         *    Accessor for raw bytes sent down the wire.
709
         *    @return string      Original text sent.
710
         *    @access public
711
         */
712
        function getRequest() {
713
            return $this->_page->getRequest();
714
        }
715
716
        /**
717
         *    Accessor for raw header information.
718
         *    @return string      Header block.
719
         *    @access public
720
         */
721
        function getHeaders() {
722
            return $this->_page->getHeaders();
723
        }
724
725
        /**
726
         *    Accessor for raw page information.
727
         *    @return string      Original text content of web page.
728
         *    @access public
729
         */
730
        function getContent() {
731
            return $this->_page->getRaw();
732
        }
733
734
        /**
735
         *    Accessor for plain text version of the page.
736
         *    @return string      Normalised text representation.
737
         *    @access public
738
         */
739
        function getContentAsText() {
740
            return $this->_page->getText();
741
        }
742
743
        /**
744
         *    Accessor for parsed title.
745
         *    @return string     Title or false if no title is present.
746
         *    @access public
747
         */
748
        function getTitle() {
749
            return $this->_page->getTitle();
750
        }
751
752
        /**
753
         *    Accessor for a list of all fixed links in current page.
754
         *    @return array   List of urls with scheme of
755
         *                    http or https and hostname.
756
         *    @access public
757
         */
758
        function getAbsoluteUrls() {
759
            return $this->_page->getAbsoluteUrls();
760
        }
761
762
        /**
763
         *    Accessor for a list of all relative links.
764
         *    @return array      List of urls without hostname.
765
         *    @access public
766
         */
767
        function getRelativeUrls() {
768
            return $this->_page->getRelativeUrls();
769
        }
770
771
        /**
772
         *    Sets all form fields with that name.
773
         *    @param string $label   Name or label of field in forms.
774
         *    @param string $value   New value of field.
775
         *    @return boolean        True if field exists, otherwise false.
776
         *    @access public
777
         */
778
        function setField($label, $value) {
779
            return $this->_page->setField(new SimpleByLabelOrName($label), $value);
780
        }
781
782
        /**
783
         *    Sets all form fields with that name. Will use label if
784
         *    one is available (not yet implemented).
785
         *    @param string $name    Name of field in forms.
786
         *    @param string $value   New value of field.
787
         *    @return boolean        True if field exists, otherwise false.
788
         *    @access public
789
         */
790
        function setFieldByName($name, $value) {
791
            return $this->_page->setField(new SimpleByName($name), $value);
792
        }
793
794
        /**
795
         *    Sets all form fields with that id attribute.
796
         *    @param string/integer $id   Id of field in forms.
0 ignored issues
show
Documentation introduced by
The doc-type string/integer could not be parsed: Unknown type name "string/integer" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
797
         *    @param string $value        New value of field.
798
         *    @return boolean             True if field exists, otherwise false.
799
         *    @access public
800
         */
801
        function setFieldById($id, $value) {
802
            return $this->_page->setField(new SimpleById($id), $value);
803
        }
804
805
        /**
806
         *    Accessor for a form element value within the page.
807
         *    Finds the first match.
808
         *    @param string $label       Field label.
809
         *    @return string/boolean     A value if the field is
0 ignored issues
show
Documentation introduced by
The doc-type string/boolean could not be parsed: Unknown type name "string/boolean" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
810
         *                               present, false if unchecked
811
         *                               and null if missing.
812
         *    @access public
813
         */
814
        function getField($label) {
815
            return $this->_page->getField(new SimpleByLabelOrName($label));
816
        }
817
818
        /**
819
         *    Accessor for a form element value within the page.
820
         *    Finds the first match.
821
         *    @param string $name        Field name.
822
         *    @return string/boolean     A string if the field is
0 ignored issues
show
Documentation introduced by
The doc-type string/boolean could not be parsed: Unknown type name "string/boolean" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
823
         *                               present, false if unchecked
824
         *                               and null if missing.
825
         *    @access public
826
         */
827
        function getFieldByName($name) {
828
            return $this->_page->getField(new SimpleByName($name));
829
        }
830
831
        /**
832
         *    Accessor for a form element value within the page.
833
         *    @param string/integer $id  Id of field in forms.
0 ignored issues
show
Documentation introduced by
The doc-type string/integer could not be parsed: Unknown type name "string/integer" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
834
         *    @return string/boolean     A string if the field is
0 ignored issues
show
Documentation introduced by
The doc-type string/boolean could not be parsed: Unknown type name "string/boolean" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
835
         *                               present, false if unchecked
836
         *                               and null if missing.
837
         *    @access public
838
         */
839
        function getFieldById($id) {
840
            return $this->_page->getField(new SimpleById($id));
841
        }
842
843
        /**
844
         *    Clicks the submit button by label. The owning
845
         *    form will be submitted by this.
846
         *    @param string $label    Button label. An unlabeled
847
         *                            button can be triggered by 'Submit'.
848
         *    @param hash $additional Additional form data.
0 ignored issues
show
Documentation introduced by
Should the type for parameter $additional not be false|hash?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
849
         *    @return string/boolean  Page on success.
0 ignored issues
show
Documentation introduced by
The doc-type string/boolean could not be parsed: Unknown type name "string/boolean" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
850
         *    @access public
851
         */
852
        function clickSubmit($label = 'Submit', $additional = false) {
853
            if (! ($form = $this->_page->getFormBySubmit(new SimpleByLabel($label)))) {
854
                return false;
855
            }
856
            $success = $this->_load(
857
                    $form->getAction(),
858
                    $form->submitButton(new SimpleByLabel($label), $additional));
0 ignored issues
show
Security Bug introduced by
It seems like $form->submitButton(new ...l($label), $additional) targeting SimpleForm::submitButton() can also be of type false; however, SimpleBrowser::_load() does only seem to accept object<SimpleEncoding>, did you maybe forget to handle an error condition?
Loading history...
859
            return ($success ? $this->getContent() : $success);
860
        }
861
862
        /**
863
         *    Clicks the submit button by name attribute. The owning
864
         *    form will be submitted by this.
865
         *    @param string $name     Button name.
866
         *    @param hash $additional Additional form data.
0 ignored issues
show
Documentation introduced by
Should the type for parameter $additional not be false|hash?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
867
         *    @return string/boolean  Page on success.
0 ignored issues
show
Documentation introduced by
The doc-type string/boolean could not be parsed: Unknown type name "string/boolean" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
868
         *    @access public
869
         */
870
        function clickSubmitByName($name, $additional = false) {
871
            if (! ($form = $this->_page->getFormBySubmit(new SimpleByName($name)))) {
872
                return false;
873
            }
874
            $success = $this->_load(
875
                    $form->getAction(),
876
                    $form->submitButton(new SimpleByName($name), $additional));
0 ignored issues
show
Security Bug introduced by
It seems like $form->submitButton(new ...me($name), $additional) targeting SimpleForm::submitButton() can also be of type false; however, SimpleBrowser::_load() does only seem to accept object<SimpleEncoding>, did you maybe forget to handle an error condition?
Loading history...
877
            return ($success ? $this->getContent() : $success);
878
        }
879
880
        /**
881
         *    Clicks the submit button by ID attribute of the button
882
         *    itself. The owning form will be submitted by this.
883
         *    @param string $id       Button ID.
884
         *    @param hash $additional Additional form data.
0 ignored issues
show
Documentation introduced by
Should the type for parameter $additional not be false|hash?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
885
         *    @return string/boolean  Page on success.
0 ignored issues
show
Documentation introduced by
The doc-type string/boolean could not be parsed: Unknown type name "string/boolean" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
886
         *    @access public
887
         */
888
        function clickSubmitById($id, $additional = false) {
889
            if (! ($form = $this->_page->getFormBySubmit(new SimpleById($id)))) {
890
                return false;
891
            }
892
            $success = $this->_load(
893
                    $form->getAction(),
894
                    $form->submitButton(new SimpleById($id), $additional));
0 ignored issues
show
Security Bug introduced by
It seems like $form->submitButton(new ...ById($id), $additional) targeting SimpleForm::submitButton() can also be of type false; however, SimpleBrowser::_load() does only seem to accept object<SimpleEncoding>, did you maybe forget to handle an error condition?
Loading history...
895
            return ($success ? $this->getContent() : $success);
896
        }
897
898
        /**
899
         *    Clicks the submit image by some kind of label. Usually
900
         *    the alt tag or the nearest equivalent. The owning
901
         *    form will be submitted by this. Clicking outside of
902
         *    the boundary of the coordinates will result in
903
         *    a failure.
904
         *    @param string $label    ID attribute of button.
905
         *    @param integer $x       X-coordinate of imaginary click.
906
         *    @param integer $y       Y-coordinate of imaginary click.
907
         *    @param hash $additional Additional form data.
0 ignored issues
show
Documentation introduced by
Should the type for parameter $additional not be false|hash?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
908
         *    @return string/boolean  Page on success.
0 ignored issues
show
Documentation introduced by
The doc-type string/boolean could not be parsed: Unknown type name "string/boolean" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
909
         *    @access public
910
         */
911
        function clickImage($label, $x = 1, $y = 1, $additional = false) {
912
            if (! ($form = $this->_page->getFormByImage(new SimpleByLabel($label)))) {
913
                return false;
914
            }
915
            $success = $this->_load(
916
                    $form->getAction(),
917
                    $form->submitImage(new SimpleByLabel($label), $x, $y, $additional));
0 ignored issues
show
Security Bug introduced by
It seems like $form->submitImage(new \...), $x, $y, $additional) targeting SimpleForm::submitImage() can also be of type false; however, SimpleBrowser::_load() does only seem to accept object<SimpleEncoding>, did you maybe forget to handle an error condition?
Loading history...
918
            return ($success ? $this->getContent() : $success);
919
        }
920
921
        /**
922
         *    Clicks the submit image by the name. Usually
923
         *    the alt tag or the nearest equivalent. The owning
924
         *    form will be submitted by this. Clicking outside of
925
         *    the boundary of the coordinates will result in
926
         *    a failure.
927
         *    @param string $name     Name attribute of button.
928
         *    @param integer $x       X-coordinate of imaginary click.
929
         *    @param integer $y       Y-coordinate of imaginary click.
930
         *    @param hash $additional Additional form data.
0 ignored issues
show
Documentation introduced by
Should the type for parameter $additional not be false|hash?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
931
         *    @return string/boolean  Page on success.
0 ignored issues
show
Documentation introduced by
The doc-type string/boolean could not be parsed: Unknown type name "string/boolean" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
932
         *    @access public
933
         */
934
        function clickImageByName($name, $x = 1, $y = 1, $additional = false) {
935
            if (! ($form = $this->_page->getFormByImage(new SimpleByName($name)))) {
936
                return false;
937
            }
938
            $success = $this->_load(
939
                    $form->getAction(),
940
                    $form->submitImage(new SimpleByName($name), $x, $y, $additional));
0 ignored issues
show
Security Bug introduced by
It seems like $form->submitImage(new \...), $x, $y, $additional) targeting SimpleForm::submitImage() can also be of type false; however, SimpleBrowser::_load() does only seem to accept object<SimpleEncoding>, did you maybe forget to handle an error condition?
Loading history...
941
            return ($success ? $this->getContent() : $success);
942
        }
943
944
        /**
945
         *    Clicks the submit image by ID attribute. The owning
946
         *    form will be submitted by this. Clicking outside of
947
         *    the boundary of the coordinates will result in
948
         *    a failure.
949
         *    @param integer/string $id    ID attribute of button.
0 ignored issues
show
Documentation introduced by
The doc-type integer/string could not be parsed: Unknown type name "integer/string" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
950
         *    @param integer $x            X-coordinate of imaginary click.
951
         *    @param integer $y            Y-coordinate of imaginary click.
952
         *    @param hash $additional      Additional form data.
0 ignored issues
show
Documentation introduced by
Should the type for parameter $additional not be false|hash?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
953
         *    @return string/boolean       Page on success.
0 ignored issues
show
Documentation introduced by
The doc-type string/boolean could not be parsed: Unknown type name "string/boolean" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
954
         *    @access public
955
         */
956
        function clickImageById($id, $x = 1, $y = 1, $additional = false) {
957
            if (! ($form = $this->_page->getFormByImage(new SimpleById($id)))) {
958
                return false;
959
            }
960
            $success = $this->_load(
961
                    $form->getAction(),
962
                    $form->submitImage(new SimpleById($id), $x, $y, $additional));
0 ignored issues
show
Security Bug introduced by
It seems like $form->submitImage(new \...), $x, $y, $additional) targeting SimpleForm::submitImage() can also be of type false; however, SimpleBrowser::_load() does only seem to accept object<SimpleEncoding>, did you maybe forget to handle an error condition?
Loading history...
963
            return ($success ? $this->getContent() : $success);
964
        }
965
966
        /**
967
         *    Submits a form by the ID.
968
         *    @param string $id       The form ID. No submit button value
969
         *                            will be sent.
970
         *    @return string/boolean  Page on success.
0 ignored issues
show
Documentation introduced by
The doc-type string/boolean could not be parsed: Unknown type name "string/boolean" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
971
         *    @access public
972
         */
973
        function submitFormById($id) {
974
            if (! ($form = $this->_page->getFormById($id))) {
975
                return false;
976
            }
977
            $success = $this->_load(
978
                    $form->getAction(),
979
                    $form->submit());
980
            return ($success ? $this->getContent() : $success);
981
        }
982
983
        /**
984
         *    Follows a link by label. Will click the first link
985
         *    found with this link text by default, or a later
986
         *    one if an index is given. The match ignores case and
987
         *    white space issues.
988
         *    @param string $label     Text between the anchor tags.
989
         *    @param integer $index    Link position counting from zero.
990
         *    @return string/boolean   Page on success.
0 ignored issues
show
Documentation introduced by
The doc-type string/boolean could not be parsed: Unknown type name "string/boolean" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
991
         *    @access public
992
         */
993
        function clickLink($label, $index = 0) {
994
            $urls = $this->_page->getUrlsByLabel($label);
995
            if (count($urls) == 0) {
996
                return false;
997
            }
998
            if (count($urls) < $index + 1) {
999
                return false;
1000
            }
1001
            $this->_load($urls[$index], new SimpleGetEncoding());
1002
            return $this->getContent();
1003
        }
1004
1005
        /**
1006
         *    Tests to see if a link is present by label.
1007
         *    @param string $label     Text of value attribute.
1008
         *    @return boolean          True if link present.
1009
         *    @access public
1010
         */
1011
        function isLink($label) {
1012
            return (count($this->_page->getUrlsByLabel($label)) > 0);
1013
        }
1014
1015
        /**
1016
         *    Follows a link by id attribute.
1017
         *    @param string $id        ID attribute value.
1018
         *    @return string/boolean   Page on success.
0 ignored issues
show
Documentation introduced by
The doc-type string/boolean could not be parsed: Unknown type name "string/boolean" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
1019
         *    @access public
1020
         */
1021
        function clickLinkById($id) {
1022
            if (! ($url = $this->_page->getUrlById($id))) {
1023
                return false;
1024
            }
1025
            $this->_load($url, new SimpleGetEncoding());
1026
            return $this->getContent();
1027
        }
1028
1029
        /**
1030
         *    Tests to see if a link is present by ID attribute.
1031
         *    @param string $id     Text of id attribute.
1032
         *    @return boolean       True if link present.
1033
         *    @access public
1034
         */
1035
        function isLinkById($id) {
1036
            return (boolean)$this->_page->getUrlById($id);
1037
        }
1038
1039
        /**
1040
         *    Clicks a visible text item. Will first try buttons,
1041
         *    then links and then images.
1042
         *    @param string $label        Visible text or alt text.
1043
         *    @return string/boolean      Raw page or false.
0 ignored issues
show
Documentation introduced by
The doc-type string/boolean could not be parsed: Unknown type name "string/boolean" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
1044
         *    @access public
1045
         */
1046
        function click($label) {
1047
            $raw = $this->clickSubmit($label);
1048
            if (! $raw) {
1049
                $raw = $this->clickLink($label);
1050
            }
1051
            if (! $raw) {
1052
                $raw = $this->clickImage($label);
1053
            }
1054
            return $raw;
1055
        }
1056
    }