diff --git a/search/classes/manager.php b/search/classes/manager.php index d68dc04dd96..662a26478ac 100644 --- a/search/classes/manager.php +++ b/search/classes/manager.php @@ -207,7 +207,8 @@ class manager { } $classname = static::get_area_classname($areaid); - if (class_exists($classname)) { + + if (class_exists($classname) && static::is_search_area($classname)) { return new $classname(); } @@ -730,12 +731,12 @@ class manager { /** * Checks whether a classname is of an actual search area. * - * @param string $searchareaname + * @param string $classname * @return bool */ - protected static function is_search_area($searchareaname) { - if (is_subclass_of($searchareaname, 'core_search\base')) { - return (new \ReflectionClass($searchareaname))->isInstantiable(); + protected static function is_search_area($classname) { + if (is_subclass_of($classname, 'core_search\base')) { + return (new \ReflectionClass($classname))->isInstantiable(); } return false; diff --git a/search/tests/fixtures/testable_core_search.php b/search/tests/fixtures/testable_core_search.php index 9b3b5eaed9f..941453155e6 100644 --- a/search/tests/fixtures/testable_core_search.php +++ b/search/tests/fixtures/testable_core_search.php @@ -97,4 +97,15 @@ class testable_core_search extends \core_search\manager { self::get_search_areas_list(false); self::get_search_areas_list(true); } + + /** + * Changes visibility. + * + * @param string $classname + * @return bool + */ + public static function is_search_area($classname) { + return parent::is_search_area($classname); + } + } diff --git a/search/tests/manager_test.php b/search/tests/manager_test.php index 879d8388b97..a0b60b69bd5 100644 --- a/search/tests/manager_test.php +++ b/search/tests/manager_test.php @@ -253,4 +253,19 @@ class search_manager_testcase extends advanced_testcase { $this->assertEquals($allcontexts, $contexts[$this->forumpostareaid]); $this->assertEquals(array($course1ctx->id => $course1ctx->id), $contexts[$this->mycoursesareaid]); } + + /** + * test_is_search_area + * + * @return void + */ + public function test_is_search_area() { + + $this->assertFalse(testable_core_search::is_search_area('\asd\asd')); + $this->assertFalse(testable_core_search::is_search_area('\mod_forum\search\posta')); + $this->assertFalse(testable_core_search::is_search_area('\core_search\base_mod')); + $this->assertTrue(testable_core_search::is_search_area('\mod_forum\search\post')); + $this->assertTrue(testable_core_search::is_search_area('\\mod_forum\\search\\post')); + $this->assertTrue(testable_core_search::is_search_area('mod_forum\\search\\post')); + } }