Comments

lucaschain’s picture

StatusFileSize
new1.56 KB
benjy’s picture

Status: Active » Needs work
  1. +++ b/includes/views/views_lazy_load_plugin_display_extender.inc
    @@ -16,8 +16,9 @@ class views_lazy_load_plugin_display_extender extends views_plugin_display_exten
    +      // Marking the view as executed prevents the Search API from querying
    

    I think we could remove the reference to Search API. I wrote it for a project which was using SAPI but really, this just prevents the view from executing the query.

  2. +++ b/includes/views/views_lazy_load_plugin_display_extender.inc
    @@ -47,6 +48,15 @@ class views_lazy_load_plugin_display_extender extends views_plugin_display_exten
    +    $crawler_agents = '/Googlebot|msnbot|Rambler|Yahoo|AbachoBOT|accoona|AcioRobot|ASPSeek|CocoCrawler|Dumbot|FAST-WebCrawler|GeonaBot|Gigabot|Lycos|MSRBOT|Scooter|AltaVista|IDBot|eStyle|Scrubby/i';
    

    Lets wrap this in a variable_get() at the very least so we can change it globally.

  3. +++ b/includes/views/views_lazy_load_plugin_display_extender.inc
    @@ -47,6 +48,15 @@ class views_lazy_load_plugin_display_extender extends views_plugin_display_exten
    +    return (preg_match($crawler_agents, $USER_AGENT)) ? true : false;
    

    If this is truthy, can't we just return preg_match value and cast to bool?

lucaschain’s picture

Hello

+++ b/includes/views/views_lazy_load_plugin_display_extender.inc
@@ -47,6 +48,15 @@ class views_lazy_load_plugin_display_extender extends views_plugin_display_exten
+    $crawler_agents = '/Googlebot|msnbot|Rambler|Yahoo|AbachoBOT|accoona|AcioRobot|ASPSeek|CocoCrawler|Dumbot|FAST-WebCrawler|GeonaBot|Gigabot|Lycos|MSRBOT|Scooter|AltaVista|IDBot|eStyle|Scrubby/i';
Lets wrap this in a variable_get() at the very least so we can change it globally.

Seems great to me and I can do that

+++ b/includes/views/views_lazy_load_plugin_display_extender.inc
@@ -47,6 +48,15 @@ class views_lazy_load_plugin_display_extender extends views_plugin_display_exten
+    return (preg_match($crawler_agents, $USER_AGENT)) ? true : false;
If this is truthy, can't we just return preg_match value and cast to bool?

We can return and cast it to bool, yes

Although I don't know the Drupal contribution process so I'm a little lost here, do you have any material that I can read so I won't screw things up?

benjy’s picture

OK, welcome to contributing :) Here's some docs that might help: https://www.drupal.org/novice

Usually how the process goes from a high level:

1. Someone posts a patch - Status: Needs Review.
2. Others review the patch and leave feedback. Status: Needs Work:
3. Patches continue to be posted addressing feedback, status back to needs review.
4. Once reviewers are happy issue goes to Reviewed and Tested by the Community
5 Maintainer commits the patch, sets to Fixed.

I'd also checkout the Drupal Coding Standards. Specifically in your patch I noticed the lowercase true/false where as Drupal always uses TRUE/FALSE.

lucaschain’s picture

Thanks for the contributing tips, in this patch I changed the webcrawlers list to a configurable variable in the admin page.

Also changed the true/false logic by casting the result from preg_match to bool.

lucaschain’s picture

Status: Needs work » Needs review

Status: Needs review » Needs work

The last submitted patch, 5: 10124182-webcrawler_lazy_prevention-2532466.patch, failed testing.

lucaschain’s picture

Sorry, I created the previous patch using the wrong command, now the patch has been created the right way (using diff between branches).

lucaschain’s picture

Status: Needs work » Needs review
benjy’s picture

Status: Needs review » Needs work

Great, thanks for working on this. Few points to note in the review, mainly just look like copy and paste errors from the system module. Also, if you fancy trying, it would be great if we could add tests for this, not sure how easy it will be to set the user agency though in simpletest.

  1. +++ b/includes/views/views_lazy_load_plugin_display_extender.inc
    @@ -47,6 +48,18 @@ class views_lazy_load_plugin_display_extender extends views_plugin_display_exten
    +    $USER_AGENT = $_SERVER['HTTP_USER_AGENT'];
    

    $user_agent should be in lower case.

  2. +++ b/includes/views/views_lazy_load_plugin_display_extender.inc
    @@ -47,6 +48,18 @@ class views_lazy_load_plugin_display_extender extends views_plugin_display_exten
    +    $crawlers = variable_get("vll_crawlers", unserialize(VIEWS_LAZY_LOAD_DEFAULT_CRAWLERS));
    

    The name of the variable should be prefixed with the module name. views_lazy_load_crawlers.

  3. +++ b/includes/views/views_lazy_load_plugin_display_extender.inc
    @@ -47,6 +48,18 @@ class views_lazy_load_plugin_display_extender extends views_plugin_display_exten
    +    return (bool)preg_match($pattern, $USER_AGENT);
    

    $crawlers should be wrapped in a preg_quote()?

    Space after (bool)

  4. +++ b/views_lazy_load.admin.inc
    @@ -0,0 +1,35 @@
    + * Form builder. Configure annotations
    + *
    + * @ingroup forms
    + * @see system_settings_form().
    

    These look like copy paste errors.

  5. +++ b/views_lazy_load.admin.inc
    @@ -0,0 +1,35 @@
    +  // Get an array of node types with internal names as keys and
    +  // "Frindly Names" as values ex.
    +  // array('page' => 'Basic Page')
    

    Same here.

  6. +++ b/views_lazy_load.admin.inc
    @@ -0,0 +1,35 @@
    +  $form['#submit'][] = 'views_lazy_load_admin_settings_submit';
    ...
    +function views_lazy_load_admin_settings_submit($form, $form_state){
    +  $crawlers = explode("\r\n", $form_state['values']['views_lazy_load_crawlers']);
    +  variable_set("vll_crawlers", $crawlers);
    +}
    

    This should be required, it can be handled by system settings form once we remove the serialized

  7. +++ b/views_lazy_load.module
    @@ -6,6 +6,30 @@
    +define("VIEWS_LAZY_LOAD_DEFAULT_CRAWLERS", serialize(array(
    

    Do we need to serialise this? It could just be a string for me?

  8. +++ b/views_lazy_load.module
    @@ -40,3 +64,29 @@ function views_html_head_alter() {
    +  $items['admin/config/views_lazy_load'] = array(
    

    Not actually sure if this needed at all?

  9. +++ b/views_lazy_load.module
    @@ -40,3 +64,29 @@ function views_html_head_alter() {
    +    'page callback' => 'system_admin_menu_block_page',
    

    Wrong callback.

  10. +++ b/views_lazy_load.module
    @@ -40,3 +64,29 @@ function views_html_head_alter() {
    +    'file' => 'system.admin.inc',
    +    'file path' => drupal_get_path('module', 'system')
    

    Copy paste error, should just be the views_lazy_load.admin file

lucaschain’s picture

Status: Needs work » Needs review
StatusFileSize
new5.33 KB

Hello, I just fixed the path with these modifications:

1. All garbage code was removed. I used a system example and forgot to clean it all
2. I used preg_quote on the user input. I couldn't use it at the regex build moment because it would escape the pipes. To prevent slashes from accumulating, I used stripslashes when displaying the items on the textbox
3. Changed the default crawlers constant to a pipe-separated string
4. Coding conventions (space after cast and lowercase variables)
5. Removed the Config menu item (now it is just the module settings button)
6. Created a test forcing the $_SERVER['HTTP_USER_AGENT'] to simulate a webcrawler visit

Status: Needs review » Needs work

The last submitted patch, 11: 10138170-webcrawler_lazy_prevention-2532466.patch, failed testing.

lucaschain’s picture

Status: Needs work » Needs review

Do you know any restriction on the Drupal.org tester? It seems like he does not allow me to set a $_SERVER variable. Do you know anything I can try to handle this?

--- EDIT ---

Is it a good idea submitting the changes without these tests and open another issue regarding to them? I'm still trying to set the user agent $_SERVER variable and nothing comes to my mind.

Thanks

lucaschain’s picture

Here is the patch without the tests if you want to apply

sothish’s picture

Thanks @lucaschain, I have applied the patch and tested using FireFox UserAgent Switcher plugin( "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) "), the content is still loaded using AJAX.

lucaschain’s picture

Hello @sothish

Thank you for testing.
I did the same and still can't reproduce this here, can you provide some more information?

Can you tell me what is in the variable views_lazy_load_webcrawlers ?

drush vget views_lazy_load_webcrawlers

Thank you very much :)

sothish’s picture

StatusFileSize
new149.14 KB

Hi lucaschain,
drush vget views_lazy_load_webcrawlers
views_lazy_load_webcrawlers: "Googlebot|msnbot|Rambler|Yahoo|AbachoBOT|accoona|AcioRobot|APSeek|CocoCrawler|Dumbot|FAST\-WebCrawler|GeonaBot|Gigabot|Lycos|MSRBOT|Scooter|AltaVista|IDBot|eStyle|Scrubby"

Please find a screenshot of what I saw, I thought the view should not be loaded through AJAX. may be my understanding was wrong.

sothish’s picture

sothish’s picture

StatusFileSize
new271.52 KB

@lucaschain, Sorry I uploaded wrong file, please find the one

lucaschain’s picture

@sothish You are right, the lazy loading should be disabled when your user agent contains the word "Googlebot".

I saw your correct screenshot and you are testing right, but I still can't reproduce that.

Can you make sure that the User-Agent request header is being sent correctly?

Also, would you send me the exported code of your view?

Again. thank you very much for your help by testing this

----EDIT----
One more thing: I saw that you var_dumped the $pattern string. Can you var_dump the $user_agent string and the (bool) preg_match($pattern, $user_agent) result?

like this:

// function isClientCrawler ...
var_dump($pattern);    
var_dump($user_agent); 
var_dump((bool) preg_match($pattern, $user_agent));
exit();
sothish’s picture

Hi @lucaschain , Please find the details

string(173) "/Googlebot|msnbot|Rambler|Yahoo|AbachoBOT|accoona|AcioRobot|APSeek|CocoCrawler|Dumbot|FAST\-WebCrawler|GeonaBot|Gigabot|Lycos|MSRBOT|Scooter|AltaVista|IDBot|eStyle|Scrubby/i" string(72) "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" bool(true)

Also, FYI - I'm using Views Module - 7.x-3.11

$view = new view();
$view->name = 'all_articles_lazy_load';
$view->description = '';
$view->tag = 'default';
$view->base_table = 'node';
$view->human_name = 'All Articles lazy load';
$view->core = 7;
$view->api_version = '3.0';
$view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */

/* Display: Master */
$handler = $view->new_display('default', 'Master', 'default');
$handler->display->display_options['title'] = 'All Articles lazy load';
$handler->display->display_options['use_ajax'] = TRUE;
$handler->display->display_options['use_more_always'] = FALSE;
$handler->display->display_options['access']['type'] = 'perm';
$handler->display->display_options['cache']['type'] = 'none';
$handler->display->display_options['query']['type'] = 'views_query';
$handler->display->display_options['exposed_form']['type'] = 'basic';
$handler->display->display_options['pager']['type'] = 'full';
$handler->display->display_options['pager']['options']['items_per_page'] = '10';
$handler->display->display_options['pager']['options']['offset'] = '0';
$handler->display->display_options['pager']['options']['id'] = '0';
$handler->display->display_options['pager']['options']['quantity'] = '9';
$handler->display->display_options['style_plugin'] = 'default';
$handler->display->display_options['row_plugin'] = 'fields';
/* Field: Content: Title */
$handler->display->display_options['fields']['title']['id'] = 'title';
$handler->display->display_options['fields']['title']['table'] = 'node';
$handler->display->display_options['fields']['title']['field'] = 'title';
$handler->display->display_options['fields']['title']['label'] = '';
$handler->display->display_options['fields']['title']['alter']['word_boundary'] = FALSE;
$handler->display->display_options['fields']['title']['alter']['ellipsis'] = FALSE;
/* Field: Content: Image */
$handler->display->display_options['fields']['field_image']['id'] = 'field_image';
$handler->display->display_options['fields']['field_image']['table'] = 'field_data_field_image';
$handler->display->display_options['fields']['field_image']['field'] = 'field_image';
$handler->display->display_options['fields']['field_image']['label'] = '';
$handler->display->display_options['fields']['field_image']['element_label_colon'] = FALSE;
$handler->display->display_options['fields']['field_image']['click_sort_column'] = 'fid';
$handler->display->display_options['fields']['field_image']['settings'] = array(
'image_style' => '',
'image_link' => '',
);
/* Field: Content: Body */
$handler->display->display_options['fields']['body']['id'] = 'body';
$handler->display->display_options['fields']['body']['table'] = 'field_data_body';
$handler->display->display_options['fields']['body']['field'] = 'body';
$handler->display->display_options['fields']['body']['label'] = '';
$handler->display->display_options['fields']['body']['element_label_colon'] = FALSE;
$handler->display->display_options['fields']['body']['type'] = 'text_summary_or_trimmed';
$handler->display->display_options['fields']['body']['settings'] = array(
'trim_length' => '600',
);
/* Sort criterion: Content: Post date */
$handler->display->display_options['sorts']['created']['id'] = 'created';
$handler->display->display_options['sorts']['created']['table'] = 'node';
$handler->display->display_options['sorts']['created']['field'] = 'created';
$handler->display->display_options['sorts']['created']['order'] = 'DESC';
/* Filter criterion: Content: Published */
$handler->display->display_options['filters']['status']['id'] = 'status';
$handler->display->display_options['filters']['status']['table'] = 'node';
$handler->display->display_options['filters']['status']['field'] = 'status';
$handler->display->display_options['filters']['status']['value'] = 1;
$handler->display->display_options['filters']['status']['group'] = 1;
$handler->display->display_options['filters']['status']['expose']['operator'] = FALSE;
/* Filter criterion: Content: Type */
$handler->display->display_options['filters']['type']['id'] = 'type';
$handler->display->display_options['filters']['type']['table'] = 'node';
$handler->display->display_options['filters']['type']['field'] = 'type';
$handler->display->display_options['filters']['type']['value'] = array(
'article' => 'article',
);
$handler->display->display_options['views_lazy_load_enabled'] = 1;

/* Display: Page */
$handler = $view->new_display('page', 'Page', 'page');
$handler->display->display_options['views_lazy_load_enabled'] = 1;
$handler->display->display_options['path'] = 'all-articles-lazy-load';

lucaschain’s picture

Hello @sothish

Thanks for the info. I was able to test everything now.

I noticed one thing: When you have a pager on the view, it seems to lazy load but it does not, it's just the normal pager behavior. Here is what i've done:

1. I commented out my condition and the code inside it, like this:

//if (!$this->isClientCrawler())
//  $this->view->executed = TRUE;

2. Even with that commented out, the lazy effect still appeared when I reloaded the page. That's when I noticed the pager

3. When I removed the pager to continue my tests, everything went back to normal.

When I finished my tests, I came to the conclusion that the pager will always have this behavior (when configured).

Can you repeat your test (without commenting the lines) for me without the paging system so it will be a little more inside our context?

benjy’s picture

There is no lazy loading with the pager, when views_lazy_load is enabled we force AJAX to TRUE and therefore the pager pulls in results via AJAX.

lucaschain’s picture

@benjy That's exactly what I tried to mean, maybe I misused some words because english is not my first language :)

Thank you for correcting.

What do you think is the best we can do?

lucaschain’s picture

I created a new patch to ensure that ajax will be disabled on a crawler visit.

if (!$this->isClientCrawler()){ 
  // Lazy loading requires an AJAX view.
  $this->view->set_use_ajax(TRUE);

  // Marking the view as executed prevents the Search API from querying
  $this->view->executed = TRUE;   
}else{
  // Ensure that ajax won't be used if a crawler is visiting the view
  $this->view->set_use_ajax(FALSE);
}

That fixed the error for me, would you test now?

sothish’s picture

@lucaschain, infact the below code worked for me. Thanks

if (!$this->isClientCrawler()) {
        // Lazy loading requires an AJAX view.
        $this->view->set_use_ajax(TRUE);

        // Marking the view as executed prevents the Search API from querying
        $this->view->executed = TRUE;
        // This is a bit of a hack to make sure the view is always rendered when
        // we're lazy loading the view. By setting an "empty" area handler in the
        // header the view is rendered which is later used for switching in the
        // results.
        // @TODO, in the future we could clean out all area plugins first pass?
        if (empty($this->display->default_display->options['empty'])) {
          $this->addLoadingArea();
        }

        // Add our JavaScript to the page with an array of dom_ids that can be
        // used client side to retrieve the view instance.
        $path = drupal_get_path('module', 'views_lazy_load');
        $settings[] = $this->view->dom_id;
        drupal_add_js(array('views_lazy_load' => $settings), 'setting');
        drupal_add_js($path . '/js/views-lazy-load.js', array('scope' => 'footer', 'weight' => 10));
      }
      else {
        // Ensure that ajax won't be used if a crawler is visiting the view
        $this->view->set_use_ajax(FALSE);
      }

Two issues with your previous fix,
- "Loading.." message was still shown in the page.
- was throwing JS exception, as dom_id was not found

lucaschain’s picture

You're totally right, @sothish

I updated my patch with your code and added you on the commit credits

sothish’s picture

@lucaschain, Cool Thanks.

Why did you remove one test?, Now we can have this test also, right?

+    // Make sure that our view won't be lazy under a crawler robot visit
+    // Set our agent to some robot's agent:
+    $_SERVER['HTTP_USER_AGENT'] = "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)";
+    $view = $this->getTestView(TRUE);
+    $output = $view->preview();
+    $this->assertNotContains('Loading...', $output, 'The view output does not have the lazy loading text because of the webcrawler\'s agent.');
lucaschain’s picture

Good Idea @sothish

I thought we couldn't handle $_SERVER variables on the drupal.org tester but let's test it again

Again, I recreated the patch with your name on the contributions

sothish’s picture

@lucaschain, All the 6 tests are passed in my local also, Please find the interdiff patch attached, with some formatting done as per Drupal Coding standards

benjy’s picture

  1. +++ b/includes/views/views_lazy_load_plugin_display_extender.inc
    @@ -47,6 +50,19 @@ class views_lazy_load_plugin_display_extender extends views_plugin_display_exten
    +  function isClientCrawler() {
    

    Can we add some docs for this method.

  2. +++ b/includes/views/views_lazy_load_plugin_display_extender.inc
    @@ -47,6 +50,19 @@ class views_lazy_load_plugin_display_extender extends views_plugin_display_exten
    +    // No preg_quote here because it would escape our needed pipes
    +    $pattern = "/" . $crawlers . "/i";
    
    +++ b/views_lazy_load.admin.inc
    @@ -0,0 +1,26 @@
    +  // preg_quote here prevents some regexp character in the agent strings to mess with our comparisson
    +  $crawlers = explode("\r\n", preg_quote($form_state['values']['views_lazy_load_crawlers']));
    

    Can we not preq_quote this where we actually do the check? Seems a little funny to preq_quote() before we save the value.

+++ b/views_lazy_load.module
@@ -6,6 +6,30 @@
+define("VIEWS_LAZY_LOAD_DEFAULT_CRAWLERS", implode("|", array(

Why implode these here, they could just be an array?

lucaschain’s picture

  1. +++ b/includes/views/views_lazy_load_plugin_display_extender.inc
    @@ -47,6 +50,19 @@ class views_lazy_load_plugin_display_extender extends views_plugin_display_exten
    +  function isClientCrawler() {
    

    Where can I add it? Comments?

  2. +++ b/includes/views/views_lazy_load_plugin_display_extender.inc
    @@ -47,6 +50,19 @@ class views_lazy_load_plugin_display_extender extends views_plugin_display_exten
    +    // No preg_quote here because it would escape our needed pipes
    +    $pattern = "/" . $crawlers . "/i";
    +++ b/views_lazy_load.admin.inc
    @@ -0,0 +1,26 @@
    +  // preg_quote here prevents some regexp character in the agent strings to mess with our comparisson
    +  $crawlers = explode("\r\n", preg_quote($form_state['values']['views_lazy_load_crawlers']));
    

    I used preg_quote on the user input for one thing: I couldn't use it at the regex build moment because it would escape the pipes. To prevent slashes from accumulating, I used stripslashes when displaying the items on the textbox

  3. +++ b/views_lazy_load.module
    @@ -6,6 +6,30 @@
    +define("VIEWS_LAZY_LOAD_DEFAULT_CRAWLERS", implode("|", array(
    

    It is not recommended to use an array inside a constant. Not all PHP versions support this and I didn't want to serialize the array. You can read more here http://php.net/manual/en/function.define.php

lucaschain’s picture

Uploaded new patch with the isClientCrawler documentation and fix on some drupal coding standarts according to @sothish

sothish’s picture

Status: Needs review » Reviewed & tested by the community
benjy’s picture

Status: Reviewed & tested by the community » Needs review
StatusFileSize
new7.14 KB

Thanks for all the work on this, I've made a few changes and now I think it's ready. If you would like to test again?

Changes are:

  • I renamed to user_agent rather than crawler. I think excluded user agents is more accurate.
  • I fixed the test, previously the unset() on the get param was after the test and the code was never going into the user agent code.
  • I refactored to save the user agents as an array so that I could use preg_quote() before do the matching. I used a bit of str_replace magic to avoid escaping the pipe.
  • I moved the default user agents into a method rather than a constant.

I was thinking we could simplify this feature a whole lot more by simply removing the admin form altogether and just leaving it in variable_get(), that way users can override per site from their settings file? If we did that, it could just be a regex string and we wouldn't need any converting to/from textareas etc

*EDIT* Patch against this comment was actually an interdiff against your last patch.

Status: Needs review » Needs work

The last submitted patch, 35: 2532466-35.patch, failed testing.

benjy’s picture

Status: Needs work » Needs review
StatusFileSize
new8.64 KB
new6.58 KB

Two patches, full patch from #35 and then a no-admin version as a POC

The last submitted patch, 37: 2532466-36.patch, failed testing.

Status: Needs review » Needs work

The last submitted patch, 37: 2532466-36-no-admin.patch, failed testing.

benjy’s picture

Status: Needs work » Needs review

I think I prefer the no admin approach, it's much simpler. Couple of points i picked up in my own patch.

  1. +++ b/includes/views/views_lazy_load_plugin_display_extender.inc
    @@ -45,6 +48,18 @@ class views_lazy_load_plugin_display_extender extends views_plugin_display_exten
    +   * ¶
    

    Trailing space to fix on commit.

  2. +++ b/views_lazy_load.info
    @@ -3,7 +3,10 @@ description = "Lazy load any views content via AJAX"
    +configure = admin/config/views_lazy_load/settings
    

    This would need removing from no-admin version.

benjy’s picture

StatusFileSize
new6.44 KB

Try again.

benjy’s picture

Version: 7.x-1.0 » 7.x-1.x-dev

Version number on this issue was incorrect.

benjy queued 37: 2532466-36.patch for re-testing.

benjy queued 37: 2532466-36-no-admin.patch for re-testing.

benjy’s picture

+++ b/includes/views/views_lazy_load_plugin_display_extender.inc
@@ -12,28 +11,32 @@ class views_lazy_load_plugin_display_extender extends views_plugin_display_exten
+        // Ensure that AJAX won't be used if a crawler is visiting the view
+        $this->view->set_use_ajax(FALSE);

Is there a reason we need to disable ajax and not just disable the views query? The result should be displayed without doing this?

lucaschain’s picture

+++ b/includes/views/views_lazy_load_plugin_display_extender.inc
@@ -12,28 +11,32 @@ class views_lazy_load_plugin_display_extender extends views_plugin_display_exten
+        // Ensure that AJAX won't be used if a crawler is visiting the view
+        $this->view->set_use_ajax(FALSE);
Is there a reason we need to disable ajax and not just disable the views query? The result should be displayed without doing this?

This is done because views still need to be rendered, and things that would still use ajax like pagination should not. thats why we set ajax to false

benjy’s picture

Assigned: lucaschain » Unassigned

This is done because views still need to be rendered, and things that would still use ajax like pagination should not. thats why we set ajax to false

Ahh yes, that makes sense. OK, so the rest is good? Did you have a preference on just dropping the UI? Core doesn't have a UI for things like 404_fast_paths I think it might be overkill here?

lucaschain’s picture

Status: Needs review » Reviewed & tested by the community

I think the rest is good. My opinion is to maintain the UI, when you said that it would be useful I realized that really is. There are lots of robots coming out to the world every moment and we should not rely on module upgrades to fulfill this

benjy’s picture

We wouldn't need a new release to add more robots, it would just be configurable from $conf in your settings.php file or with a simple variable_set in an update hook.

benjy’s picture

Will look at committing later today.

benjy’s picture

Status: Reviewed & tested by the community » Fixed

Committed #41 as it was the simplest patch. @lucaschain thanks for all your efforts here, much appreciated.

  • benjy committed c7657d1 on 7.x-1.x authored by lucaschain
    Issue #2532466 by lucaschain, benjy: Prevent lazyload on webcrawlers...

Status: Fixed » Closed (fixed)

Automatically closed - issue fixed for 2 weeks with no activity.